class StackMaster::ParameterResolvers::OnePassword

Constants

OnePasswordBinaryNotFound
OnePasswordInvalidResponse
OnePasswordNotAbleToAuthenticate
OnePasswordNotFound

Public Class Methods

new(config, stack_definition) click to toggle source
# File lib/stack_master/parameter_resolvers/one_password.rb, line 11
def initialize(config, stack_definition)
  @config = config
  @stack_definition = stack_definition
end

Public Instance Methods

resolve(params={}) click to toggle source
# File lib/stack_master/parameter_resolvers/one_password.rb, line 16
def resolve(params={})
  raise OnePasswordNotAbleToAuthenticate, "1password requires the `OP_SESSION_<name>` to be set, (remember to sign in?)" if ENV.keys.grep(/OP_SESSION_\w+$/).empty?    
  get_items(params)
end

Private Instance Methods

create_struct(title, vault) click to toggle source
# File lib/stack_master/parameter_resolvers/one_password.rb, line 56
def create_struct(title, vault)
  JSON.parse(op_get_item(title, vault), object_class: OpenStruct)
end
get_items(params) click to toggle source
# File lib/stack_master/parameter_resolvers/one_password.rb, line 75
def get_items(params)
  case params['type']
  when 'password'
    return get_password(params['title'], params['vault'])
  when 'secureNote'
    return get_secure_note(params['title'], params['vault'])
  end
end
get_password(title, vault) click to toggle source
# File lib/stack_master/parameter_resolvers/one_password.rb, line 60
def get_password(title, vault)
  # There are two types of password that can be returned.
  # One is attached to a Login item in 1Password
  # the other is to a Password item.
  if is_login_item?(create_struct(title, vault))
    login_item(create_struct(title, vault))
  else
    password_item(create_struct(title, vault))
  end
end
get_secure_note(title, vault) click to toggle source
# File lib/stack_master/parameter_resolvers/one_password.rb, line 71
def get_secure_note(title, vault)
  create_struct(title, vault).details.notesPlain
end
is_login_item?(data) click to toggle source
# File lib/stack_master/parameter_resolvers/one_password.rb, line 38
def is_login_item?(data)
  data.details.password.nil?
end
login_item(data) click to toggle source
# File lib/stack_master/parameter_resolvers/one_password.rb, line 46
def login_item(data)
  data.details.fields[1].value
end
op_get_item(item, vault) click to toggle source
# File lib/stack_master/parameter_resolvers/one_password.rb, line 50
def op_get_item(item, vault)
  validate_op_installed?
  item = %x(op get item --vault='#{vault}' '#{item}' 2>&1)
  item if validate_response?(item)
end
password_item(data) click to toggle source
# File lib/stack_master/parameter_resolvers/one_password.rb, line 42
def password_item(data)
  data.details.password 
end
validate_op_installed?() click to toggle source
# File lib/stack_master/parameter_resolvers/one_password.rb, line 23
def validate_op_installed?
  %x(op --version)
rescue Errno::ENOENT => exception
  raise OnePasswordBinaryNotFound, "The op cli needs to be installed and in the PATH, #{exception}"
end
validate_response?(item) click to toggle source
# File lib/stack_master/parameter_resolvers/one_password.rb, line 29
def validate_response?(item)
  item.match(/\[LOG\].+(?<error>\(.+)$/)  do |i|
    raise OnePasswordNotFound, "Failed to return item from 1password, #{i['error']}"
  end
  JSON.parse(item)
rescue JSON::ParserError => exception
  raise OnePasswordInvalidResponse, "Failed to parse JSON returned, #{item}: #{exception}"
end