diff --git a/app/controllers/api/keys_controller.rb b/app/controllers/api/keys_controller.rb index 7eb76ee675f7c5fde6c13289c91ecd8e713adc25..32ccc197a1bc3d743071a996c2c3d7fa575a1f8e 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 65b80c7d7d4eeb82990f885b2122a99989604b2f..eda37e8bcfa4e079f47cef993a0a0abe79217418 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/models/identity.rb b/app/models/identity.rb index b8c2245630b9d2672d18cbf567396a306140df6f..13ce124c0f76091f7c17ca4ca6fbe8cd71772d5b 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 66f7bfdbaf08b379078d48200170938ebf8c52ed..a5320c2b3101910fda07ebb916f4f6269b3fd682 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 diff --git a/features/step_definitions/key_steps.rb b/features/step_definitions/key_steps.rb index 3d5e015492985b743e8af67fa3a33b41bfc5f6d9..ad3fac65f97b3a24080feafb3ea55797414f21f1 100644 --- a/features/step_definitions/key_steps.rb +++ b/features/step_definitions/key_steps.rb @@ -16,7 +16,7 @@ Then /^I should have published an? "([^"]*)" key(?: with value "([^"]*)")?$/ do identity = Identity.for(@user) keys = identity.keys assert_includes keys.keys, type - assert_equal value, JSON.parse(keys[type])['value'] if value + assert_equal value, keys[type]['value'] if value end Then /^I should not have published an? "([^"]*)" key$/ do |type| diff --git a/test/unit/keyring_test.rb b/test/unit/keyring_test.rb index c7df63e948722eedf671035a9ff4fa34e0624b65..48bab2952665b21ab00ede8e6f309f527f1fac3f 100644 --- a/test/unit/keyring_test.rb +++ b/test/unit/keyring_test.rb @@ -82,8 +82,8 @@ class KeyringTest < ActiveSupport::TestCase def teststorage @teststorage ||= Hash.new.tap do |dummy| - def dummy.set_key(type, value) - self[type] = value + def dummy.set_key(type, hash) + self[type] = hash.stringify_keys end def dummy.keys