diff options
| -rw-r--r-- | app/designs/identity/cert_fingerprints_by_expiry.js | 12 | ||||
| -rw-r--r-- | app/designs/identity/disabled.js | 8 | ||||
| -rw-r--r-- | app/designs/identity/pgp_key_by_email.js | 8 | ||||
| -rw-r--r-- | app/models/identity.rb | 27 | ||||
| -rw-r--r-- | lib/extensions/couchrest.rb | 12 | ||||
| -rw-r--r-- | test/unit/identity_test.rb | 16 | 
6 files changed, 56 insertions, 27 deletions
diff --git a/app/designs/identity/cert_fingerprints_by_expiry.js b/app/designs/identity/cert_fingerprints_by_expiry.js new file mode 100644 index 0000000..995219b --- /dev/null +++ b/app/designs/identity/cert_fingerprints_by_expiry.js @@ -0,0 +1,12 @@ +function(doc) { +  if (doc.type != 'Identity') { +    return; +  } +  if (typeof doc.cert_fingerprints === "object") { +    for (fp in doc.cert_fingerprints) { +      if (doc.cert_fingerprints.hasOwnProperty(fp)) { +        emit(doc.cert_fingerprints[fp], fp); +      } +    } +  } +} diff --git a/app/designs/identity/disabled.js b/app/designs/identity/disabled.js new file mode 100644 index 0000000..5509575 --- /dev/null +++ b/app/designs/identity/disabled.js @@ -0,0 +1,8 @@ +function(doc) { +  if (doc.type != 'Identity') { +    return; +  } +  if (typeof doc.user_id === "undefined") { +    emit(doc._id, 1); +  } +} diff --git a/app/designs/identity/pgp_key_by_email.js b/app/designs/identity/pgp_key_by_email.js new file mode 100644 index 0000000..f783908 --- /dev/null +++ b/app/designs/identity/pgp_key_by_email.js @@ -0,0 +1,8 @@ +function(doc) { +  if (doc.type != 'Identity') { +    return; +  } +  if (typeof doc.keys === "object") { +    emit(doc.address, doc.keys["pgp"]); +  } +} diff --git a/app/models/identity.rb b/app/models/identity.rb index 1d69437..9dc9c7a 100644 --- a/app/models/identity.rb +++ b/app/models/identity.rb @@ -18,32 +18,11 @@ class Identity < CouchRest::Model::Base    validate :destination_email    design do +    own_path = Pathname.new(File.dirname(__FILE__)) +    load_views(own_path.join('..', 'designs', 'identity'), nil)      view :by_user_id      view :by_address_and_destination      view :by_address -    view :pgp_key_by_email, -      map: <<-EOJS -      function(doc) { -        if (doc.type != 'Identity') { -          return; -        } -        if (typeof doc.keys === "object") { -          emit(doc.address, doc.keys["pgp"]); -        } -      } -    EOJS -    view :disabled, -      map: <<-EOJS -      function(doc) { -        if (doc.type != 'Identity') { -          return; -        } -        if (typeof doc.user_id === "undefined") { -          emit(doc._id, 1); -        } -      } -    EOJS -    end    def self.address_starts_with(query) @@ -146,7 +125,7 @@ class Identity < CouchRest::Model::Base    end    def register_cert(cert) -    expiry = cert.expiry.to_data.to_s +    expiry = cert.expiry.to_date.to_s      write_attribute 'cert_fingerprints',        cert_fingerprints.merge(cert.fingerprint => expiry)    end diff --git a/lib/extensions/couchrest.rb b/lib/extensions/couchrest.rb index df83c9f..290cd32 100644 --- a/lib/extensions/couchrest.rb +++ b/lib/extensions/couchrest.rb @@ -15,13 +15,19 @@ module CouchRest        end        class DesignMapper -        def load_views(dir) +        DEFAULT_REDUCE = <<-EOJS +          function(key, values, rereduce) { +            return sum(values); +          } +          EOJS +        def load_views(dir, reduce=DEFAULT_REDUCE)            Dir.glob("#{dir}/*.js") do |js|              name = File.basename(js, '.js')              file = File.open(js, 'r') +            reduce =              view name.to_sym, -              :map => file.read, -              :reduce => "function(key, values, rereduce) { return sum(values); }" +              map: file.read, +              reduce: reduce            end          end        end diff --git a/test/unit/identity_test.rb b/test/unit/identity_test.rb index 49b2075..933b0ff 100644 --- a/test/unit/identity_test.rb +++ b/test/unit/identity_test.rb @@ -136,6 +136,22 @@ class IdentityTest < ActiveSupport::TestCase      assert_equal 0, Identity.disabled.count    end +  test "store cert fingerprint" do +    begin +      id = Identity.for(@user) +      cert = stub expiry: Time.now, fingerprint: "fp" +      id.register_cert cert +      id.save +      entry = {cert.fingerprint => cert.expiry.to_date.to_s} +      assert_equal entry, id.cert_fingerprints +      row = Identity.cert_fingerprints_by_expiry.descending.rows.first +      assert_equal row['key'], cert.expiry.to_date.to_s +      assert_equal row['value'], cert.fingerprint +    ensure +      id.reload.destroy if id && id.persisted? +    end +  end +    def alias_name      @alias_name ||= Faker::Internet.user_name    end  | 
