summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorazul <azul@riseup.net>2018-01-31 04:44:15 -0800
committerazul <azul@riseup.net>2018-01-31 04:44:15 -0800
commitb58c2d841013ec9fc30c3c8e6dcc3ee73dccfbf4 (patch)
tree5c8c2caf8a581b215c63c93444c5b72a5175c0f8
parenta6e0378669118feeb0c42b6282b0b469fb11ad8f (diff)
parenta55cc3653de22d868ade5303918280a38e8e9fe8 (diff)
Merge branch 'feature/different-keytypes' into 'master'
couch: add identity view to get all keys See merge request leap/webapp!61
-rw-r--r--app/controllers/api/keys_controller.rb7
-rw-r--r--app/controllers/api/users_controller.rb2
-rw-r--r--app/designs/identity/keys_by_email.js8
-rw-r--r--app/models/identity.rb7
-rw-r--r--app/models/keyring.rb9
-rw-r--r--features/step_definitions/key_steps.rb2
-rw-r--r--test/unit/keyring_test.rb4
7 files changed, 24 insertions, 15 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
diff --git a/features/step_definitions/key_steps.rb b/features/step_definitions/key_steps.rb
index 3d5e015..ad3fac6 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 c7df63e..48bab29 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