summaryrefslogtreecommitdiff
path: root/app/models/keyring.rb
diff options
context:
space:
mode:
authorazul <azul@riseup.net>2018-01-28 08:37:45 -0800
committerazul <azul@riseup.net>2018-01-28 08:37:45 -0800
commit19606ec31d7a1606b5e9fc4df2440a6b470e9d97 (patch)
tree3a1c851033c46e1a140de3e3b5a17ad4b7f2647e /app/models/keyring.rb
parentf77e48b1ffdc2350c454ced2fe1eba6446f7bc76 (diff)
parent54653f75cf44890310a06c3a8a6be59625629d2a (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.rb55
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