summaryrefslogtreecommitdiff
path: root/app/models/keyring.rb
diff options
context:
space:
mode:
authorAzul <azul@riseup.net>2018-01-15 18:21:44 +0100
committerAzul <azul@riseup.net>2018-01-18 16:43:23 +0100
commitb8ba4f27a82868e0b3338b4af761f7c44226e729 (patch)
tree45b495e18bab72508342b86cd42ab3d56ed1eacc /app/models/keyring.rb
parentfd2fc85c2daf60605641cc582d75134a10e7b4a4 (diff)
(WIP) first steps towards implementing keys API
Diffstat (limited to 'app/models/keyring.rb')
-rw-r--r--app/models/keyring.rb38
1 files changed, 38 insertions, 0 deletions
diff --git a/app/models/keyring.rb b/app/models/keyring.rb
new file mode 100644
index 0000000..6779d5d
--- /dev/null
+++ b/app/models/keyring.rb
@@ -0,0 +1,38 @@
+#
+# Keyring
+#
+# A collection of cryptographic keys.
+#
+
+class Keyring
+ class Error < RuntimeError
+ 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:)
+ old_rev = key_of_type(type)['rev']
+ raise Error, "wrong revision: #{rev}" unless old_rev == rev
+ storage.set_key type, {type: type, value: value, rev: new_rev}.to_json
+ storage.save
+ end
+
+ def key_of_type(type)
+ JSON.parse(storage.keys[type])
+ end
+
+ protected
+ attr_reader :storage
+
+ def new_rev
+ SecureRandom.urlsafe_base64(8)
+ end
+end