diff options
author | azul <azul@riseup.net> | 2018-01-28 08:37:45 -0800 |
---|---|---|
committer | azul <azul@riseup.net> | 2018-01-28 08:37:45 -0800 |
commit | 19606ec31d7a1606b5e9fc4df2440a6b470e9d97 (patch) | |
tree | 3a1c851033c46e1a140de3e3b5a17ad4b7f2647e /app/models/keyring.rb | |
parent | f77e48b1ffdc2350c454ced2fe1eba6446f7bc76 (diff) | |
parent | 54653f75cf44890310a06c3a8a6be59625629d2a (diff) |
Merge branch 'feature/different-keytypes' into 'master'
initial feature description for key uploads
See merge request leap/webapp!58
Diffstat (limited to 'app/models/keyring.rb')
-rw-r--r-- | app/models/keyring.rb | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/app/models/keyring.rb b/app/models/keyring.rb new file mode 100644 index 0000000..66f7bfd --- /dev/null +++ b/app/models/keyring.rb @@ -0,0 +1,55 @@ +# +# Keyring +# +# A collection of cryptographic keys. +# + +class Keyring + class Error < RuntimeError + end + + class NotFound < Error + def initialize(type) + super "no such key: #{type}" + end + end + + def initialize(storage) + @storage = storage + end + + def create(type, value) + raise Error, "key already exists" if storage.keys[type].present? + storage.set_key type, {type: type, value: value, rev: new_rev}.to_json + storage.save + end + + def update(type, rev:, value:) + check_rev type, rev + storage.set_key type, {type: type, value: value, rev: new_rev}.to_json + storage.save + end + + def delete(type, rev:) + check_rev type, rev + storage.delete_key type + storage.save + end + + def key_of_type(type) + JSON.parse(storage.keys[type]) if storage.keys[type] + end + + protected + attr_reader :storage + + def check_rev(type, rev) + old = key_of_type(type) + raise NotFound, type unless old + raise Error, "wrong revision: #{rev}" unless old['rev'] == rev + end + + def new_rev + SecureRandom.urlsafe_base64(8) + end +end |