diff options
| -rw-r--r-- | Rakefile | 7 | ||||
| -rw-r--r-- | lib/nickserver/handler_chain.rb | 2 | ||||
| -rw-r--r-- | lib/nickserver/hkp/client.rb | 3 | ||||
| -rw-r--r-- | lib/nickserver/hkp/key_info.rb | 76 | ||||
| -rw-r--r-- | lib/nickserver/hkp/parse_key_info.rb | 14 | ||||
| -rw-r--r-- | lib/nickserver/wkd/source.rb | 4 | ||||
| -rw-r--r-- | lib/nickserver/wkd/url.rb | 35 | ||||
| -rw-r--r-- | nickserver.gemspec | 8 | ||||
| -rw-r--r-- | test/functional/sample_test.rb | 1 | ||||
| -rw-r--r-- | test/remote/wkd_source_test.rb | 6 | ||||
| -rw-r--r-- | test/support/http_stub_helper.rb | 12 | 
11 files changed, 98 insertions, 70 deletions
@@ -28,9 +28,7 @@ $gem_path  = File.join($base_dir, 'pkg', "#{$spec.name}-#{$spec.version}.gem")  def run(cmd)    PTY.spawn(cmd) do |output, _input, _pid|      begin -      while line = output.gets -        puts line -      end +      output.each { |line| puts line }      rescue Errno::EIO      end    end @@ -38,7 +36,8 @@ rescue PTY::ChildExited  end  def built_gem_path -  Dir[File.join($base_dir, "#{$spec.name}-*.gem")].sort_by { |f| File.mtime(f) }.last +  Dir[File.join($base_dir, "#{$spec.name}-*.gem")] +    .max_by { |f| File.mtime(f) }  end  desc "Build #{$spec.name}-#{$spec.version}.gem into the pkg directory" diff --git a/lib/nickserver/handler_chain.rb b/lib/nickserver/handler_chain.rb index 843313e..f685a2e 100644 --- a/lib/nickserver/handler_chain.rb +++ b/lib/nickserver/handler_chain.rb @@ -1,3 +1,5 @@ +require 'English' +  #  # Handler Chain  # diff --git a/lib/nickserver/hkp/client.rb b/lib/nickserver/hkp/client.rb index 3dbb1de..d632a36 100644 --- a/lib/nickserver/hkp/client.rb +++ b/lib/nickserver/hkp/client.rb @@ -1,4 +1,5 @@  require 'nickserver/hkp' +require 'nickserver/config'  module Nickserver::Hkp    # @@ -35,7 +36,7 @@ module Nickserver::Hkp      def get(query)        # in practice, exact=on seems to have no effect        query = { exact: 'on', options: 'mr' }.merge query -      response = adapter.get Config.hkp_url, query: query +      response = adapter.get Nickserver::Config.hkp_url, query: query        response      end    end diff --git a/lib/nickserver/hkp/key_info.rb b/lib/nickserver/hkp/key_info.rb index ed38643..5c8b845 100644 --- a/lib/nickserver/hkp/key_info.rb +++ b/lib/nickserver/hkp/key_info.rb @@ -1,65 +1,83 @@  require 'cgi'  require 'nickserver/hkp' -# -# Class to represent the key information result from a query to a key server -# (but not the key itself). -# -# The initialize method parses the hkp 'machine readable' output. -# -# format definition of machine readable index output is here: -# http://tools.ietf.org/html/draft-shaw-openpgp-hkp-00#section-5.2 -#  module Nickserver::Hkp +  # +  # Class to represent the key information result from a query to a key server +  # (but not the key itself). +  # +  # The initialize method parses the hkp 'machine readable' output. +  # +  # format definition of machine readable index output is here: +  # http://tools.ietf.org/html/draft-shaw-openpgp-hkp-00#section-5.2 +  #    class KeyInfo -    attr_accessor :uids, :keyid, :algo, :flags +    attr_accessor :uids      def initialize(hkp_record)        uid_lines = hkp_record.split("\n")        pub_line  = uid_lines.shift -      @keyid, @algo, @keylen_s, @creationdate_s, @expirationdate_s, @flags = pub_line.split(':')[1..-1] -      @uids = [] -      uid_lines.each do |uid_line| -        uid, _creationdate, _expirationdate, _flags = uid_line.split(':')[1..-1] -        # for now, ignore the expirationdate and flags of uids. sks does return them anyway -        @uids << CGI.unescape(uid.sub(/.*<(.+)>.*/, '\1')) -      end +      @properties = pub_line.split(':')[1..-1] +      @uids = extract_uids(uid_lines) +    end + +    def keyid +      properties.first +    end + +    def algo +      properties.second      end      def keylen -      @keylen ||= @keylen_s.to_i +      properties[2].to_i      end      def creationdate -      @creationdate ||= begin -        Time.at(@creationdate_s.to_i) if @creationdate_s -      end +      created = properties[3] +      Time.at(created.to_i)      end      def expirationdate -      @expirationdate ||= begin -        Time.at(@expirationdate_s.to_i) if @expirationdate_s -      end +      expires = properties[4] +      Time.at(expires.to_i) +    end + +    def flags +      properties.last      end      def rsa? -      @algo == '1' +      algo == '1'      end      def dsa? -      @algo == '17' +      algo == '17'      end      def revoked? -      @flags =~ /r/ +      flags =~ /r/      end      def disabled? -      @flags =~ /d/ +      flags =~ /d/      end      def expired? -      @flags =~ /e/ +      flags =~ /e/ +    end + +    protected + +    attr_reader :properties + +    def extract_uids(uid_lines) +      uid_lines.map do |uid_line| +        # for now, ignore the expirationdate and flags of uids. +        # sks does return them anyway +        uid, _creationdate, _expirationdate, _flags = uid_line.split(':')[1..-1] +        CGI.unescape(uid.sub(/.*<(.+)>.*/, '\1')) +      end      end    end  end diff --git a/lib/nickserver/hkp/parse_key_info.rb b/lib/nickserver/hkp/parse_key_info.rb index 09dc69e..c23751b 100644 --- a/lib/nickserver/hkp/parse_key_info.rb +++ b/lib/nickserver/hkp/parse_key_info.rb @@ -1,11 +1,11 @@ -# -# Simple parser for Hkp KeyInfo responses. -# -# Focus is on simple here. Trying to avoid state and sideeffects. -# Parsing a response with 12 keys and validating them takes 2ms. -# So no need for memoization and making things more complex. -#  module Nickserver::Hkp +  # +  # Simple parser for Hkp KeyInfo responses. +  # +  # Focus is on simple here. Trying to avoid state and sideeffects. +  # Parsing a response with 12 keys and validating them takes 2ms. +  # So no need for memoization and making things more complex. +  #    class ParseKeyInfo      # for this regexp to work, the source text must end in a trailing "\n",      # which the output of sks does. diff --git a/lib/nickserver/wkd/source.rb b/lib/nickserver/wkd/source.rb index b994c6c..43f0b2e 100644 --- a/lib/nickserver/wkd/source.rb +++ b/lib/nickserver/wkd/source.rb @@ -9,7 +9,9 @@ module Nickserver::Wkd      def query(email)        url = Url.new(email)        status, blob = adapter.get url -      Hkp::Response.new(email.to_s, armor_key(blob)) if status == 200 +      if status == 200 +        Nickserver::Hkp::Response.new(email.to_s, armor_key(blob)) +      end      end      protected diff --git a/lib/nickserver/wkd/url.rb b/lib/nickserver/wkd/url.rb index 6530efc..0ccff38 100644 --- a/lib/nickserver/wkd/url.rb +++ b/lib/nickserver/wkd/url.rb @@ -1,29 +1,28 @@  require 'digest/sha1'  require 'zbase32' -module Nickserver -  module Wkd -    class Url -      def initialize(email) -        @domain = email.domain.downcase -        @local_part = email.local_part.downcase -      end +module Nickserver::Wkd +  # The url to lookup the given email address in the web key directory. +  class Url +    def initialize(email) +      @domain = email.domain.downcase +      @local_part = email.local_part.downcase +    end -      def to_s -        "https://#{domain}/.well-known/openpgpkey/hu/#{encoded_digest}" -      end +    def to_s +      "https://#{domain}/.well-known/openpgpkey/hu/#{encoded_digest}" +    end -      protected +    protected -      attr_reader :domain, :local_part +    attr_reader :domain, :local_part -      def encoded_digest -        ZBase32.encode32(digest.to_i(16).to_s(2)) -      end +    def encoded_digest +      ZBase32.encode32(digest.to_i(16).to_s(2)) +    end -      def digest -        Digest::SHA1.hexdigest local_part -      end +    def digest +      Digest::SHA1.hexdigest local_part      end    end  end diff --git a/nickserver.gemspec b/nickserver.gemspec index 035efe5..aa4b3b8 100644 --- a/nickserver.gemspec +++ b/nickserver.gemspec @@ -1,5 +1,7 @@  # -*- encoding: utf-8 -*- +require 'English' +  lib = File.expand_path('../lib', __FILE__)  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)  require 'nickserver/version' @@ -10,8 +12,12 @@ Gem::Specification.new do |gem|    gem.authors       = ['elijah']    gem.email         = ['elijah@riseup.net']    gem.description   = 'Provides a directory service to map uid to public key.' -  gem.summary       = 'Nickserver provides the ability to map a uid (user@domain.org) to a public key. This is the opposite of a key server, whose job it is to map public key to uid. Nickserver is lightweight and asynchronous.'    gem.homepage      = 'https://leap.se' +  gem.summary       = <<-EOSUM +Nickserver provides the ability to map a uid (user@domain.org) to a public key. +This is the opposite of a key server, whose job it is to map public key to uid. +Nickserver is lightweight and asynchronous. +  EOSUM    gem.files         = `git ls-files`.split($INPUT_RECORD_SEPARATOR)    gem.executables   = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) } diff --git a/test/functional/sample_test.rb b/test/functional/sample_test.rb index dbd8796..412555e 100644 --- a/test/functional/sample_test.rb +++ b/test/functional/sample_test.rb @@ -1,3 +1,4 @@ +require 'English'  require 'support/functional_test'  class SampleTest < FunctionalTest diff --git a/test/remote/wkd_source_test.rb b/test/remote/wkd_source_test.rb index 7eaab79..1ed7ea5 100644 --- a/test/remote/wkd_source_test.rb +++ b/test/remote/wkd_source_test.rb @@ -27,14 +27,14 @@ class RemoteWkdSourceTest < CelluloidTest    def assert_pgp_key_in(response)      json = JSON.parse response.content -    assert_equal email_with_key.to_s, json['address'] -    refute_empty json['openpgp'] +    assert_equal email_with_key.to_s, json["address"] +    refute_empty json["openpgp"]      assert_equal file_content('dewey.pgp.asc'), json['openpgp']    end    def email_with_key      uid = 'dewey@test.gnupg.org' -    email = Nickserver::EmailAddress.new uid +    Nickserver::EmailAddress.new uid    end    def source diff --git a/test/support/http_stub_helper.rb b/test/support/http_stub_helper.rb index ee50698..b0ec069 100644 --- a/test/support/http_stub_helper.rb +++ b/test/support/http_stub_helper.rb @@ -16,13 +16,13 @@ module HttpStubHelper                    Hash    end -  def stub_sks_vindex_reponse(_uid, response = {}) +  def stub_sks_vindex_reponse(uid, response = {})      stub_http_get config.hkp_url,                    response, -                  query: vindex_query +                  query: vindex_query(uid)    end -  def vindex_query +  def vindex_query(uid)      { op: 'vindex',        search: uid,        exact: 'on', @@ -30,13 +30,13 @@ module HttpStubHelper        fingerprint: 'on' }    end -  def stub_sks_get_reponse(_key_id, response = {}) +  def stub_sks_get_reponse(key_id, response = {})      stub_http_get config.hkp_url,                    response, -                  query: sks_get_query +                  query: sks_get_query(key_id)    end -  def sks_get_query +  def sks_get_query(key_id)      { op: 'get',        search: '0x' + key_id,        exact: 'on',  | 
