class Itamae::Secrets::Store

Attributes

base_dir[R]

Public Class Methods

new(base_dir) click to toggle source
# File lib/itamae/secrets/store.rb, line 10
def initialize(base_dir)
  @base_dir = Pathname.new(base_dir)
  ensure_base_dir!
end

Public Instance Methods

[](name) click to toggle source
# File lib/itamae/secrets/store.rb, line 29
def [](name)
  fetch(name, nil)
end
[]=(*args) click to toggle source
# File lib/itamae/secrets/store.rb, line 56
def []=(*args)
  case args.size
  when 2
    store(*args)
  when 3
    store(args[0], args[2], args[1])
  else
    raise ArgumentError, "wrong number of arguments (#{args.size} for 2..3)"
  end
end
fetch(*args) click to toggle source
# File lib/itamae/secrets/store.rb, line 33
def fetch(*args)
  if args.size > 2
    raise ArgumentError, "wrong number of arguments (#{args.size} for 1..2)"
  end

  name = args[0].to_s
  validate_name!(name)

  value_path = values_path.join(name)

  if value_path.exist?
    encrypted_data = Decryptor.load_json(value_path.read)
    encrypted_data.key = keychain.load(encrypted_data.key_name)
    JSON.parse(encrypted_data.plaintext)['value']
  else
    if args.size == 1
      raise KeyError, "key not found: #{name}"
    else
      args[1]
    end
  end
end
keychain() click to toggle source
# File lib/itamae/secrets/store.rb, line 25
def keychain
  @keychain ||= Keychain.new(keychain_path)
end
keychain_path() click to toggle source
# File lib/itamae/secrets/store.rb, line 17
def keychain_path
  base_dir.join('keys')
end
store(name, value, key = 'default') click to toggle source
# File lib/itamae/secrets/store.rb, line 67
def store(name, value, key = 'default')
  name = name.to_s
  validate_name!(name)
  value_path = values_path.join(name)

  encrypted_data = Encryptor.new({value: value}.to_json, keychain.load(key))

  open(value_path, 'w', 0600) do |io|
    io.puts encrypted_data.to_s
  end
end
values_path() click to toggle source
# File lib/itamae/secrets/store.rb, line 21
def values_path
  base_dir.join('values')
end

Private Instance Methods

ensure_base_dir!() click to toggle source
# File lib/itamae/secrets/store.rb, line 81
def ensure_base_dir!
  unless base_dir.exist?
    Dir.mkdir(base_dir)
  end
  %w(keys values).each do |x|
    path = base_dir.join(x)
    Dir.mkdir(path) unless File.exist?(path)
  end
end
validate_name!(name) click to toggle source
# File lib/itamae/secrets/store.rb, line 91
def validate_name!(name)
  # XXX: dupe
  raise ArgumentError, "name must not contain slashes, commas, backslackes" if name.include?("\\") || name.include?(?/) || name.include?(?:)
end