diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/api/keys_controller.rb | 7 | ||||
-rw-r--r-- | app/controllers/api/users_controller.rb | 2 | ||||
-rw-r--r-- | app/designs/identity/keys_by_email.js | 8 | ||||
-rw-r--r-- | app/models/identity.rb | 7 | ||||
-rw-r--r-- | app/models/keyring.rb | 9 |
5 files changed, 21 insertions, 12 deletions
diff --git a/app/controllers/api/keys_controller.rb b/app/controllers/api/keys_controller.rb index 7eb76ee..32ccc19 100644 --- a/app/controllers/api/keys_controller.rb +++ b/app/controllers/api/keys_controller.rb @@ -5,14 +5,11 @@ class Api::KeysController < ApiController # get /keys def index - keys = identity.keys.map do |k,v| - [k, JSON.parse(v)] - end - render json: keys.to_h + render json: identity.keys end def show - render json: JSON.parse(identity.keys[params[:id]]) + render json: identity.keys[params[:id]] end def create diff --git a/app/controllers/api/users_controller.rb b/app/controllers/api/users_controller.rb index 65b80c7..eda37e8 100644 --- a/app/controllers/api/users_controller.rb +++ b/app/controllers/api/users_controller.rb @@ -112,7 +112,7 @@ module Api PgpKey.new(key).tap do |key| if key.valid? identity = Identity.for(@user) - identity.set_key(:pgp, key) + identity.set_key(:pgp, key.to_s) identity.save end end diff --git a/app/designs/identity/keys_by_email.js b/app/designs/identity/keys_by_email.js new file mode 100644 index 0000000..c81ac2f --- /dev/null +++ b/app/designs/identity/keys_by_email.js @@ -0,0 +1,8 @@ +function(doc) { + if (doc.type != 'Identity') { + return; + } + if (typeof doc.keys === "object") { + emit(doc.address, doc.keys); + } +} diff --git a/app/models/identity.rb b/app/models/identity.rb index b8c2245..13ce124 100644 --- a/app/models/identity.rb +++ b/app/models/identity.rb @@ -131,9 +131,10 @@ class Identity < CouchRest::Model::Base read_attribute('keys') || HashWithIndifferentAccess.new end - def set_key(type, key) - return if keys[type] == key.to_s - write_attribute('keys', keys.merge(type => key.to_s)) + def set_key(type, key_hash) + key_hash.stringify_keys! if key_hash.respond_to? :stringify_keys! + return if keys[type] == key_hash + write_attribute('keys', keys.merge(type => key_hash)) end def delete_key(type) diff --git a/app/models/keyring.rb b/app/models/keyring.rb index 66f7bfd..a5320c2 100644 --- a/app/models/keyring.rb +++ b/app/models/keyring.rb @@ -20,13 +20,13 @@ class Keyring 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.set_key type, {type: type, value: value, rev: new_rev} 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.set_key type, {type: type, value: value, rev: new_rev} storage.save end @@ -37,7 +37,7 @@ class Keyring end def key_of_type(type) - JSON.parse(storage.keys[type]) if storage.keys[type] + storage.keys[type] end protected @@ -46,6 +46,9 @@ class Keyring def check_rev(type, rev) old = key_of_type(type) raise NotFound, type unless old + # We used to store plain strings. It's deprecated now. + # If we happen to run into them do not check their revision. + return if old.is_a? String raise Error, "wrong revision: #{rev}" unless old['rev'] == rev end |