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