From b8ba4f27a82868e0b3338b4af761f7c44226e729 Mon Sep 17 00:00:00 2001 From: Azul Date: Mon, 15 Jan 2018 18:21:44 +0100 Subject: (WIP) first steps towards implementing keys API --- app/models/keyring.rb | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 app/models/keyring.rb (limited to 'app/models/keyring.rb') 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 -- cgit v1.2.3 From 54653f75cf44890310a06c3a8a6be59625629d2a Mon Sep 17 00:00:00 2001 From: Azul Date: Fri, 19 Jan 2018 14:11:24 +0100 Subject: API: implement deleting keys through new keys api --- app/models/keyring.rb | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'app/models/keyring.rb') diff --git a/app/models/keyring.rb b/app/models/keyring.rb index 6779d5d..66f7bfd 100644 --- a/app/models/keyring.rb +++ b/app/models/keyring.rb @@ -8,6 +8,12 @@ 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 @@ -19,19 +25,30 @@ class Keyring end def update(type, rev:, value:) - old_rev = key_of_type(type)['rev'] - raise Error, "wrong revision: #{rev}" unless old_rev == rev + 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]) + 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 -- cgit v1.2.3