From 8a81429f0eb8aa5041d47557d0c5b5359bb959e6 Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 25 May 2016 13:13:30 +0200 Subject: copy over all files from rewritten attempt I started a nickserver from scratch to implement the things that are independent of our choice of stack (eventmachine or other). This commit copies them over and tests both things in parallel. --- lib/nickserver/adapters.rb | 4 ++ lib/nickserver/adapters/couch_db.rb | 12 +++++ lib/nickserver/adapters/local.rb | 8 +++ lib/nickserver/adapters/remote.rb | 4 ++ lib/nickserver/couch_db.rb | 4 ++ lib/nickserver/couch_db/response.rb | 51 ++++++++++++++++++ lib/nickserver/couch_db/source.rb | 34 ++++++++++++ lib/nickserver/hkp.rb | 4 ++ lib/nickserver/hkp/fetch_key.rb | 2 +- lib/nickserver/hkp/fetch_key_info.rb | 2 +- lib/nickserver/hkp/key_info.rb | 2 +- lib/nickserver/hkp/parse_key_info.rb | 4 +- lib/nickserver/hkp/v_index_response.rb | 96 ++++++++++++++++++++++++++++++++++ lib/nickserver/invalid_source.rb | 14 +++++ lib/nickserver/lookup.rb | 31 +++++++++++ lib/nickserver/nickname.rb | 51 ++++++++++++++++++ lib/nickserver/response.rb | 15 ++++++ lib/nickserver/server.rb | 2 +- 18 files changed, 334 insertions(+), 6 deletions(-) create mode 100644 lib/nickserver/adapters.rb create mode 100644 lib/nickserver/adapters/couch_db.rb create mode 100644 lib/nickserver/adapters/local.rb create mode 100644 lib/nickserver/adapters/remote.rb create mode 100644 lib/nickserver/couch_db.rb create mode 100644 lib/nickserver/couch_db/response.rb create mode 100644 lib/nickserver/couch_db/source.rb create mode 100644 lib/nickserver/hkp.rb create mode 100644 lib/nickserver/hkp/v_index_response.rb create mode 100644 lib/nickserver/invalid_source.rb create mode 100644 lib/nickserver/lookup.rb create mode 100644 lib/nickserver/nickname.rb create mode 100644 lib/nickserver/response.rb (limited to 'lib/nickserver') diff --git a/lib/nickserver/adapters.rb b/lib/nickserver/adapters.rb new file mode 100644 index 0000000..c87cb63 --- /dev/null +++ b/lib/nickserver/adapters.rb @@ -0,0 +1,4 @@ +module Nickserver + module Adapters + end +end diff --git a/lib/nickserver/adapters/couch_db.rb b/lib/nickserver/adapters/couch_db.rb new file mode 100644 index 0000000..e8a23ad --- /dev/null +++ b/lib/nickserver/adapters/couch_db.rb @@ -0,0 +1,12 @@ +require 'nickserver/adapters' + +class Nickserver::Adapters::CouchDB + + + protected + + def query_couch(nick) + yield 404, "{}" + end + +end diff --git a/lib/nickserver/adapters/local.rb b/lib/nickserver/adapters/local.rb new file mode 100644 index 0000000..d6210c3 --- /dev/null +++ b/lib/nickserver/adapters/local.rb @@ -0,0 +1,8 @@ +require 'nickserver/adapters' + +class Nickserver::Adapters::Local + + def query(nick) + end + +end diff --git a/lib/nickserver/adapters/remote.rb b/lib/nickserver/adapters/remote.rb new file mode 100644 index 0000000..e12bd26 --- /dev/null +++ b/lib/nickserver/adapters/remote.rb @@ -0,0 +1,4 @@ +require 'nickserver/adapters' + +class Nickserver::Adapters::Remote +end diff --git a/lib/nickserver/couch_db.rb b/lib/nickserver/couch_db.rb new file mode 100644 index 0000000..5c63fc1 --- /dev/null +++ b/lib/nickserver/couch_db.rb @@ -0,0 +1,4 @@ +module Nickserver + module CouchDB + end +end diff --git a/lib/nickserver/couch_db/response.rb b/lib/nickserver/couch_db/response.rb new file mode 100644 index 0000000..c6afe03 --- /dev/null +++ b/lib/nickserver/couch_db/response.rb @@ -0,0 +1,51 @@ +require 'nickserver/couch_db' +require 'json' + +module Nickserver::CouchDB + class Response + + def initialize(nick, couch_response = {}) + @nick = nick + @couch_status = couch_response[:status] + @json = JSON.load(couch_response[:body]) if couch_status == 200 + end + + def status + if ok? && empty? then 404 + else couch_status + end + end + + def content + key_response if ok? && !empty? + end + + protected + + def key_response + format address: nick.to_s, openpgp: key + end + + def format(response) + response.to_json + end + + def key + rows.first["value"] + end + + def ok? + couch_status == 200 + end + + def empty? + rows.empty? + end + + def rows + json["rows"] + end + + attr_reader :couch_status, :json, :nick + end +end diff --git a/lib/nickserver/couch_db/source.rb b/lib/nickserver/couch_db/source.rb new file mode 100644 index 0000000..fffa76e --- /dev/null +++ b/lib/nickserver/couch_db/source.rb @@ -0,0 +1,34 @@ +# +# This class allows querying couch for public keys. +# +require 'nickserver/couch_db/response' + +module Nickserver::CouchDB + class Source + + VIEW = '/_design/Identity/_view/pgp_key_by_email' + + def initialize(adapter) + @adapter = adapter + end + + def query(nick) + adapter.get VIEW, query: query_for(nick) do |status, body| + yield Response.new nick, status: status, body: body + end + end + + protected + + def query_for(nick) + { reduce: "false", key: "\"#{nick}\"" } + end + + def adapter + @adapter + # Nickserver::Adapters::Http.new(config) + end + + attr_reader :config + end +end diff --git a/lib/nickserver/hkp.rb b/lib/nickserver/hkp.rb new file mode 100644 index 0000000..bb82a20 --- /dev/null +++ b/lib/nickserver/hkp.rb @@ -0,0 +1,4 @@ +module Nickserver + module Hkp + end +end diff --git a/lib/nickserver/hkp/fetch_key.rb b/lib/nickserver/hkp/fetch_key.rb index 44621d3..55eeefa 100644 --- a/lib/nickserver/hkp/fetch_key.rb +++ b/lib/nickserver/hkp/fetch_key.rb @@ -5,7 +5,7 @@ require 'em-http' # http://tools.ietf.org/html/draft-shaw-openpgp-hkp-00 # -module Nickserver; module HKP +module Nickserver; module Hkp class FetchKey include EM::Deferrable diff --git a/lib/nickserver/hkp/fetch_key_info.rb b/lib/nickserver/hkp/fetch_key_info.rb index 2448bb1..b7481d0 100644 --- a/lib/nickserver/hkp/fetch_key_info.rb +++ b/lib/nickserver/hkp/fetch_key_info.rb @@ -4,7 +4,7 @@ require 'em-http' # used to fetch an array of KeyInfo objects that match the given uid. # -module Nickserver; module HKP +module Nickserver; module Hkp class FetchKeyInfo include EM::Deferrable diff --git a/lib/nickserver/hkp/key_info.rb b/lib/nickserver/hkp/key_info.rb index adb75d8..dc0443c 100644 --- a/lib/nickserver/hkp/key_info.rb +++ b/lib/nickserver/hkp/key_info.rb @@ -9,7 +9,7 @@ require 'cgi' # format definition of machine readable index output is here: # http://tools.ietf.org/html/draft-shaw-openpgp-hkp-00#section-5.2 # -module Nickserver; module HKP +module Nickserver; module Hkp class KeyInfo attr_accessor :uids, :keyid, :algo, :keylen, :creationdate, :expirationdate, :flags diff --git a/lib/nickserver/hkp/parse_key_info.rb b/lib/nickserver/hkp/parse_key_info.rb index 8934829..d8abe4f 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. +# 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; module HKP +module Nickserver; module Hkp class ParseKeyInfo # for this regexp to work, the source text must end in a trailing "\n", diff --git a/lib/nickserver/hkp/v_index_response.rb b/lib/nickserver/hkp/v_index_response.rb new file mode 100644 index 0000000..865d476 --- /dev/null +++ b/lib/nickserver/hkp/v_index_response.rb @@ -0,0 +1,96 @@ +require 'nickserver/hkp' +require 'nickserver/hkp/key_info' + +# +# 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 + class VIndexResponse + + # for this regexp to work, the source text must end in a trailing "\n", + # which the output of sks does. + MATCH_PUB_KEY = /(^pub:.+?\n(^uid:.+?\n)+)/m + + # hkp_response -- raw output from a vindex hkp query (machine readable) + def initialize(nick, hkp_response) + @nick = nick.to_s + @vindex_result = hkp_response[:body] + end + + def status + if keys.empty? + error_status + else + 200 + end + end + + def keys + key_infos.reject { |key| error_for_key(key) } + end + + def msg + if errors.any? + error_messages.join "\n" + else + "Could not fetch keyinfo." + end + end + + protected + + attr_reader :vindex_result, :nick + + def error_status + if errors.any? + 500 + else + 404 + end + end + + def errors + key_infos.map{|key| error_for_key(key) }.compact + end + + def error_messages + key_infos.map do |key| + err = error_for_key(key) + error_message(key, err) + end.compact + end + + def key_infos + all_key_infos.select do |key_info| + key_info.uids.include?(nick) + end + end + + def all_key_infos + @all_key_infos ||= vindex_result.scan(MATCH_PUB_KEY).map do |match| + KeyInfo.new(match[0]) + end + end + + def error_message(key, err) + "Ignoring key #{key.keyid} for #{nick}: #{err}" if err + end + + def error_for_key(key) + if key.keylen < 2048 + "key length is too short." + elsif key.expired? + "key expired." + elsif key.revoked? + "key revoked." + elsif key.disabled? + "key disabled." + elsif key.expirationdate && key.expirationdate < Time.now + "key expired" + end + end + end +end diff --git a/lib/nickserver/invalid_source.rb b/lib/nickserver/invalid_source.rb new file mode 100644 index 0000000..dac245a --- /dev/null +++ b/lib/nickserver/invalid_source.rb @@ -0,0 +1,14 @@ +# +# This is a dummy source for invalid queries. +# It simply always returns 500 and "Not a valid address" +# + +module Nickserver + class InvalidSource + + def query(nick) + yield 500, "Not a valid address" + end + + end +end diff --git a/lib/nickserver/lookup.rb b/lib/nickserver/lookup.rb new file mode 100644 index 0000000..105e77e --- /dev/null +++ b/lib/nickserver/lookup.rb @@ -0,0 +1,31 @@ +require 'nickserver/invalid_source' + +module Nickserver + class Lookup + + attr_reader :nick + + def initialize(nick) + @nick = nick + end + + def respond_with(responder) + query do |status, content| + responder.send_response status: status, content: content + end + end + + protected + + def query(&block) + source.query nick, &block + end + + def source + if nick.invalid? then Nickserver::InvalidSource + elsif nick.local? then Nickserver::Config.local_source + else Nickserver::Config.remote_source + end + end + end +end diff --git a/lib/nickserver/nickname.rb b/lib/nickserver/nickname.rb new file mode 100644 index 0000000..938d4a4 --- /dev/null +++ b/lib/nickserver/nickname.rb @@ -0,0 +1,51 @@ +module Nickserver + class Nickname + + EmailAddress = begin + qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]' + dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]' + atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+' + quoted_pair = '\\x5c[\\x00-\\x7f]' + domain_literal = "\\x5b(?:#{dtext}|#{quoted_pair})*\\x5d" + quoted_string = "\\x22(?:#{qtext}|#{quoted_pair})*\\x22" + domain_ref = atom + sub_domain = "(?:#{domain_ref}|#{domain_literal})" + word = "(?:#{atom}|#{quoted_string})" + domain = "#{sub_domain}(?:\\x2e#{sub_domain})*" + local_part = "#{word}(?:\\x2e#{word})*" + addr_spec = "#{local_part}\\x40#{domain}" + /\A#{addr_spec}\z/n + end + + LOCAL_DOMAIN = 'test.me' + + def initialize(address) + @address = address.to_s + end + + def valid? + address =~ EmailAddress + end + + def invalid? + !valid? + end + + def local? + address.end_with? LOCAL_DOMAIN + end + + def remote? + !local? + end + + def to_s + address + end + + protected + + attr_reader :address + + end +end diff --git a/lib/nickserver/response.rb b/lib/nickserver/response.rb new file mode 100644 index 0000000..c55d359 --- /dev/null +++ b/lib/nickserver/response.rb @@ -0,0 +1,15 @@ +module Nickserver + class Response + + attr_reader :status, :message + + def initialize(status, message) + @status = status + @message = message + end + + def content + "#{status} #{message}" + end + end +end diff --git a/lib/nickserver/server.rb b/lib/nickserver/server.rb index 32afdae..8329406 100644 --- a/lib/nickserver/server.rb +++ b/lib/nickserver/server.rb @@ -90,7 +90,7 @@ module Nickserver fetcher = if local_address?(uid) Nickserver::Couch::FetchKey.new else - Nickserver::HKP::FetchKey.new + Nickserver::Hkp::FetchKey.new end fetcher.get(uid).callback {|key| yield key -- cgit v1.2.3 From 50ab3f9909b2075fbd7a3526d6ce422e5a4dc1a5 Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 25 May 2016 14:24:21 +0200 Subject: simplify KeyInfo. remove unneeded accessors --- lib/nickserver/hkp/key_info.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'lib/nickserver') diff --git a/lib/nickserver/hkp/key_info.rb b/lib/nickserver/hkp/key_info.rb index dc0443c..d4ecf10 100644 --- a/lib/nickserver/hkp/key_info.rb +++ b/lib/nickserver/hkp/key_info.rb @@ -1,4 +1,5 @@ require 'cgi' +require 'nickserver/hkp' # # Class to represent the key information result from a query to a key server @@ -9,9 +10,9 @@ require 'cgi' # format definition of machine readable index output is here: # http://tools.ietf.org/html/draft-shaw-openpgp-hkp-00#section-5.2 # -module Nickserver; module Hkp +module Nickserver::Hkp class KeyInfo - attr_accessor :uids, :keyid, :algo, :keylen, :creationdate, :expirationdate, :flags + attr_accessor :uids, :keyid, :algo, :flags def initialize(hkp_record) uid_lines = hkp_record.split("\n") @@ -19,7 +20,7 @@ module Nickserver; module Hkp @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] + 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 @@ -66,4 +67,4 @@ module Nickserver; module Hkp end end -end; end +end -- cgit v1.2.3 From 9598e42722c13030b757b7b4ab47de0d50228d5c Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 25 May 2016 14:56:20 +0200 Subject: silence some warnings from evma_httpserver --- lib/nickserver/server.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lib/nickserver') diff --git a/lib/nickserver/server.rb b/lib/nickserver/server.rb index 8329406..2db2942 100644 --- a/lib/nickserver/server.rb +++ b/lib/nickserver/server.rb @@ -1,3 +1,4 @@ +require 'kernel_ext' require 'eventmachine' require 'evma_httpserver' require 'json' @@ -64,7 +65,9 @@ module Nickserver response.status = options[:status] response.content_type options[:content_type] response.content = options[:content] - response.send_response + silence_warnings do + response.send_response + end end def send_key(uid) -- cgit v1.2.3 From aed9ae1743eaf433f192a4602b2c6012ffb02a25 Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 25 May 2016 14:59:16 +0200 Subject: fix our own warnings --- lib/nickserver/config.rb | 2 +- lib/nickserver/daemon.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'lib/nickserver') diff --git a/lib/nickserver/config.rb b/lib/nickserver/config.rb index 46b6bef..13e284b 100644 --- a/lib/nickserver/config.rb +++ b/lib/nickserver/config.rb @@ -59,7 +59,7 @@ module Nickserver YAML.load(File.read(file_path)).each do |key, value| begin self.send("#{key}=", value) - rescue NoMethodError => exc + rescue NoMethodError STDERR.puts "ERROR in file #{file_path}, '#{key}' is not a valid option" exit(1) end diff --git a/lib/nickserver/daemon.rb b/lib/nickserver/daemon.rb index 7d0f02a..9b06a3c 100644 --- a/lib/nickserver/daemon.rb +++ b/lib/nickserver/daemon.rb @@ -60,7 +60,7 @@ module Nickserver def daemonize return bail("Process is already started") if daemon_running? - pid = fork do + _pid = fork do exit if fork Process.setsid exit if fork @@ -219,7 +219,7 @@ module Nickserver end def override_default_config(flag, value) - flag = flag.sub /^--/, '' + flag = flag.sub(/^--/, '') if Config.respond_to?("#{flag}=") Config.send("#{flag}=", value) else -- cgit v1.2.3 From a58ffc4d3e5bb63b7dc6aea93e76be4aa4c4345b Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 25 May 2016 15:01:41 +0200 Subject: silence all warnings of webmock and evma_httpserver --- lib/nickserver/server.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/nickserver') diff --git a/lib/nickserver/server.rb b/lib/nickserver/server.rb index 2db2942..cc6e3dd 100644 --- a/lib/nickserver/server.rb +++ b/lib/nickserver/server.rb @@ -1,6 +1,8 @@ require 'kernel_ext' require 'eventmachine' -require 'evma_httpserver' +silence_warnings do + require 'evma_httpserver' +end require 'json' # -- cgit v1.2.3 From a89e2ba55399e6bddd9e052cf2064ed0056c958a Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 8 Jun 2016 12:44:38 +0200 Subject: refactor: use new couch_db classes from fetch_key This moves all the em_http related stuff into a single adapter. We're also not using callback and errback inside fetch_key or server for couch requests anymore. Changing the interface for hkp to do the same will follow. --- lib/nickserver/adapters/couch_db.rb | 12 -------- lib/nickserver/adapters/em_http.rb | 24 ++++++++++++++++ lib/nickserver/config.rb | 15 ++++++++++ lib/nickserver/couch/fetch_key.rb | 56 ++++++------------------------------- lib/nickserver/couch_db/source.rb | 9 ++++-- lib/nickserver/server.rb | 27 ++++++++++-------- 6 files changed, 70 insertions(+), 73 deletions(-) delete mode 100644 lib/nickserver/adapters/couch_db.rb create mode 100644 lib/nickserver/adapters/em_http.rb (limited to 'lib/nickserver') diff --git a/lib/nickserver/adapters/couch_db.rb b/lib/nickserver/adapters/couch_db.rb deleted file mode 100644 index e8a23ad..0000000 --- a/lib/nickserver/adapters/couch_db.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'nickserver/adapters' - -class Nickserver::Adapters::CouchDB - - - protected - - def query_couch(nick) - yield 404, "{}" - end - -end diff --git a/lib/nickserver/adapters/em_http.rb b/lib/nickserver/adapters/em_http.rb new file mode 100644 index 0000000..16db5ae --- /dev/null +++ b/lib/nickserver/adapters/em_http.rb @@ -0,0 +1,24 @@ +require 'nickserver/adapters' +require 'em-http' + +module Nickserver::Adapters + class EmHttp + + def initialize + @timeout = 5 + end + + def get(url, options = {}) + get_request(url, options).callback {|http| + yield http.response_header.status, http.response + }.errback {|http| + yield 0, http.error + } + end + + def get_request(url, options = {}) + @request = EventMachine::HttpRequest.new(url) + @request.get timeout: @timeout, query: options[:query] + end + end +end diff --git a/lib/nickserver/config.rb b/lib/nickserver/config.rb index 13e284b..b1def7c 100644 --- a/lib/nickserver/config.rb +++ b/lib/nickserver/config.rb @@ -36,6 +36,21 @@ module Nickserver self.validate end + def self.couch_url + [ 'http://', + couch_auth, + couch_host, + ':', + couch_port, + '/', + couch_database + ].join + end + + def self.couch_auth + "#{couch_user}:#{couch_password}@" if couch_user + end + private def self.validate diff --git a/lib/nickserver/couch/fetch_key.rb b/lib/nickserver/couch/fetch_key.rb index 3fe2a63..2013bca 100644 --- a/lib/nickserver/couch/fetch_key.rb +++ b/lib/nickserver/couch/fetch_key.rb @@ -1,63 +1,25 @@ -require 'em-http' -require 'json' +require 'nickserver/couch_db/source' +require 'nickserver/adapters/em_http' module Nickserver; module Couch class FetchKey - include EM::Deferrable - - VIEW = "_design/Identity/_view/pgp_key_by_email" def initialize(options={}) - @timeout = 5 + @source = Nickserver::CouchDB::Source.new(adapter) end - def get(uid) - couch_request(uid) - self + def get(uid, &block) + source.query(uid, &block) end protected - # - # For example: - # curl "$COUCH/identities/_design/Identity/_view/pgp_key_by_email?key=\"test1@bitmask.net\"" - # - def couch_request(uid) - query = {"reduce" => "false", "key" => "\"#{uid}\""} - request = EventMachine::HttpRequest.new(FetchKey.couch_url).get(timeout: @timeout, query: query) - request.callback {|http| - if http.response_header.status != 200 - self.fail http.response_header.status, 'Unknown Error' - else - self.succeed parse_key_from_response(uid, http.response) - end - }.errback {|http| - self.fail 0, http.error - } - end + attr_reader :source - def parse_key_from_response(uid, response) - json = JSON.load(response) - if json["rows"].empty? - self.fail 404, "Not Found" - else - return json["rows"].first["value"] - end - rescue Exception - self.fail 0, "Error parsing CouchDB reply" + def adapter + @adapter ||= Nickserver::Adapters::EmHttp.new end - def self.couch_url - @couch_url ||= begin - url = ['http://'] - if Config.couch_user - url.push Config.couch_user, ':', Config.couch_password, '@' - end - url.push Config.couch_host, ':', Config.couch_port, '/', Config.couch_database - url.push '/', VIEW - url.join - end - end end -end; end \ No newline at end of file +end; end diff --git a/lib/nickserver/couch_db/source.rb b/lib/nickserver/couch_db/source.rb index fffa76e..874fe4f 100644 --- a/lib/nickserver/couch_db/source.rb +++ b/lib/nickserver/couch_db/source.rb @@ -2,6 +2,7 @@ # This class allows querying couch for public keys. # require 'nickserver/couch_db/response' +require 'nickserver/config' module Nickserver::CouchDB class Source @@ -13,13 +14,17 @@ module Nickserver::CouchDB end def query(nick) - adapter.get VIEW, query: query_for(nick) do |status, body| - yield Response.new nick, status: status, body: body + adapter.get url, query: query_for(nick) do |status, body| + yield Response.new(nick, status: status, body: body) end end protected + def url + Nickserver::Config.couch_url + VIEW + end + def query_for(nick) { reduce: "false", key: "\"#{nick}\"" } end diff --git a/lib/nickserver/server.rb b/lib/nickserver/server.rb index cc6e3dd..9e1551b 100644 --- a/lib/nickserver/server.rb +++ b/lib/nickserver/server.rb @@ -92,20 +92,23 @@ module Nickserver end def get_key_from_uid(uid) - fetcher = if local_address?(uid) - Nickserver::Couch::FetchKey.new + if local_address?(uid) + @fetcher = Nickserver::Couch::FetchKey.new + @fetcher.get(uid) do |response| + send_response(status: response.status, content: response.content) + end else - Nickserver::Hkp::FetchKey.new + @fetcher = Nickserver::Hkp::FetchKey.new + @fetcher.get(uid).callback {|key| + yield key + }.errback {|status, msg| + if status == 404 + send_not_found + else + send_response(status: status, content: msg) + end + } end - fetcher.get(uid).callback {|key| - yield key - }.errback {|status, msg| - if status == 404 - send_not_found - else - send_response(status: status, content: msg) - end - } end def format_response(map) -- cgit v1.2.3 From 1af940f49f9ba5507673c2131fcb228b778083fb Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 9 Jun 2016 11:10:35 +0200 Subject: refactor: remove middleman Couch::FetchKey --- lib/nickserver/couch/fetch_key.rb | 25 ------------------------- lib/nickserver/server.rb | 14 +++++++++++--- 2 files changed, 11 insertions(+), 28 deletions(-) delete mode 100644 lib/nickserver/couch/fetch_key.rb (limited to 'lib/nickserver') diff --git a/lib/nickserver/couch/fetch_key.rb b/lib/nickserver/couch/fetch_key.rb deleted file mode 100644 index 2013bca..0000000 --- a/lib/nickserver/couch/fetch_key.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'nickserver/couch_db/source' -require 'nickserver/adapters/em_http' - -module Nickserver; module Couch - class FetchKey - - def initialize(options={}) - @source = Nickserver::CouchDB::Source.new(adapter) - end - - def get(uid, &block) - source.query(uid, &block) - end - - protected - - attr_reader :source - - def adapter - @adapter ||= Nickserver::Adapters::EmHttp.new - end - - - end -end; end diff --git a/lib/nickserver/server.rb b/lib/nickserver/server.rb index 9e1551b..b528e4b 100644 --- a/lib/nickserver/server.rb +++ b/lib/nickserver/server.rb @@ -4,6 +4,9 @@ silence_warnings do require 'evma_httpserver' end require 'json' +require 'nickserver/couch_db/source' +require 'nickserver/adapters/em_http' + # # This is the main HTTP server that clients connect to in order to fetch keys @@ -93,8 +96,8 @@ module Nickserver def get_key_from_uid(uid) if local_address?(uid) - @fetcher = Nickserver::Couch::FetchKey.new - @fetcher.get(uid) do |response| + @source = Nickserver::CouchDB::Source.new(adapter) + @source.query(uid) do |response| send_response(status: response.status, content: response.content) end else @@ -135,8 +138,13 @@ module Nickserver return uid_domain == host end end - rescue + rescue # XXX what are we rescueing here? return false end + + def adapter + @adapter ||= Nickserver::Adapters::EmHttp.new + end + end end -- cgit v1.2.3 From 25e80931939fe31b4a451281f0772f085acc7f9f Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 9 Jun 2016 11:45:43 +0200 Subject: refactor: inline method get_key_from_uid well kind of since we were yielding this is more inlining the block and renaming the method --- lib/nickserver/server.rb | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'lib/nickserver') diff --git a/lib/nickserver/server.rb b/lib/nickserver/server.rb index b528e4b..82fb376 100644 --- a/lib/nickserver/server.rb +++ b/lib/nickserver/server.rb @@ -75,12 +75,6 @@ module Nickserver end end - def send_key(uid) - get_key_from_uid(uid) do |key| - send_response content: format_response(address: uid, openpgp: key) - end - end - def get_uid_from_request if @http_query_string params = CGI.parse(@http_query_string) @@ -94,7 +88,7 @@ module Nickserver end end - def get_key_from_uid(uid) + def send_key(uid) if local_address?(uid) @source = Nickserver::CouchDB::Source.new(adapter) @source.query(uid) do |response| @@ -103,7 +97,7 @@ module Nickserver else @fetcher = Nickserver::Hkp::FetchKey.new @fetcher.get(uid).callback {|key| - yield key + send_response content: format_response(address: uid, openpgp: key) }.errback {|status, msg| if status == 404 send_not_found -- cgit v1.2.3 From 80d85a0396fb0dbb27ac1b0885d5461ccc0cfbf2 Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 9 Jun 2016 11:54:04 +0200 Subject: refactor: introduce Hkp::Response --- lib/nickserver/hkp/response.rb | 18 ++++++++++++++++++ lib/nickserver/server.rb | 8 +++----- 2 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 lib/nickserver/hkp/response.rb (limited to 'lib/nickserver') diff --git a/lib/nickserver/hkp/response.rb b/lib/nickserver/hkp/response.rb new file mode 100644 index 0000000..c52e25f --- /dev/null +++ b/lib/nickserver/hkp/response.rb @@ -0,0 +1,18 @@ +module Nickserver::Hkp + class Response + + attr_reader :status, :content + + def initialize(uid, key) + @content = format_response(address: uid, openpgp: key) + @status = 200 + end + + protected + + def format_response(map) + map.to_json + end + + end +end diff --git a/lib/nickserver/server.rb b/lib/nickserver/server.rb index 82fb376..c6615d2 100644 --- a/lib/nickserver/server.rb +++ b/lib/nickserver/server.rb @@ -5,6 +5,7 @@ silence_warnings do end require 'json' require 'nickserver/couch_db/source' +require 'nickserver/hkp/response' require 'nickserver/adapters/em_http' @@ -97,7 +98,8 @@ module Nickserver else @fetcher = Nickserver::Hkp::FetchKey.new @fetcher.get(uid).callback {|key| - send_response content: format_response(address: uid, openpgp: key) + response = Nickserver::Hkp::Response.new(uid, key) + send_response(status: response.status, content: response.content) }.errback {|status, msg| if status == 404 send_not_found @@ -108,10 +110,6 @@ module Nickserver end end - def format_response(map) - map.to_json - end - # # Return true if the user address is for a user of this service provider. # e.g. if the provider is example.org, then alice@example.org returns true. -- cgit v1.2.3 From 56263b6512f60cf055a925f5446f1f504bb65a4d Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 9 Jun 2016 12:11:03 +0200 Subject: add Hkp::Source with same interface as CouchDB::Source --- lib/nickserver/hkp/fetch_key.rb | 2 +- lib/nickserver/hkp/source.rb | 20 ++++++++++++++++++++ lib/nickserver/server.rb | 22 ++++++---------------- 3 files changed, 27 insertions(+), 17 deletions(-) create mode 100644 lib/nickserver/hkp/source.rb (limited to 'lib/nickserver') diff --git a/lib/nickserver/hkp/fetch_key.rb b/lib/nickserver/hkp/fetch_key.rb index 55eeefa..fe00473 100644 --- a/lib/nickserver/hkp/fetch_key.rb +++ b/lib/nickserver/hkp/fetch_key.rb @@ -53,4 +53,4 @@ module Nickserver; module Hkp end end -end; end \ No newline at end of file +end; end diff --git a/lib/nickserver/hkp/source.rb b/lib/nickserver/hkp/source.rb new file mode 100644 index 0000000..79333f0 --- /dev/null +++ b/lib/nickserver/hkp/source.rb @@ -0,0 +1,20 @@ +require 'nickserver/hkp/response' +module Nickserver::Hkp + class Source + + def initialize(adapter) + end + + def query(nick) + fetcher.get(nick).callback {|key| + yield Response.new(nick, key) + }.errback {|status, msg| + yield Nickserver::Response.new(status, msg) + } + end + + def fetcher + Nickserver::Hkp::FetchKey.new + end + end +end diff --git a/lib/nickserver/server.rb b/lib/nickserver/server.rb index c6615d2..2453f94 100644 --- a/lib/nickserver/server.rb +++ b/lib/nickserver/server.rb @@ -5,7 +5,7 @@ silence_warnings do end require 'json' require 'nickserver/couch_db/source' -require 'nickserver/hkp/response' +require 'nickserver/hkp/source' require 'nickserver/adapters/em_http' @@ -91,22 +91,12 @@ module Nickserver def send_key(uid) if local_address?(uid) - @source = Nickserver::CouchDB::Source.new(adapter) - @source.query(uid) do |response| - send_response(status: response.status, content: response.content) - end + source = Nickserver::CouchDB::Source.new(adapter) else - @fetcher = Nickserver::Hkp::FetchKey.new - @fetcher.get(uid).callback {|key| - response = Nickserver::Hkp::Response.new(uid, key) - send_response(status: response.status, content: response.content) - }.errback {|status, msg| - if status == 404 - send_not_found - else - send_response(status: status, content: msg) - end - } + source = Nickserver::Hkp::Source.new(adapter) + end + source.query(uid) do |response| + send_response(status: response.status, content: response.content) end end -- cgit v1.2.3 From b4075771b2b1f3c688496d18d7a5a5f1db952004 Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 9 Jun 2016 13:51:02 +0200 Subject: refactor: remove EM specific stuff from Hkp::FetchKey interface --- lib/nickserver/hkp/fetch_key.rb | 29 ++++++++++++++++------------- lib/nickserver/hkp/source.rb | 16 ++++++++-------- 2 files changed, 24 insertions(+), 21 deletions(-) (limited to 'lib/nickserver') diff --git a/lib/nickserver/hkp/fetch_key.rb b/lib/nickserver/hkp/fetch_key.rb index fe00473..10c4926 100644 --- a/lib/nickserver/hkp/fetch_key.rb +++ b/lib/nickserver/hkp/fetch_key.rb @@ -1,4 +1,6 @@ require 'em-http' +require 'nickserver/response' +require 'nickserver/hkp/response' # # Fetch keys via HKP @@ -8,35 +10,36 @@ require 'em-http' module Nickserver; module Hkp class FetchKey - include EM::Deferrable - def get(uid) - FetchKeyInfo.new.search(uid).callback {|key_info_list| + def initialize(adapter) + @adapter = adapter + end + + def get(nick, &block) + FetchKeyInfo.new.search(nick).callback {|key_info_list| best = pick_best_key(key_info_list) - get_key_by_fingerprint(best.keyid) {|key| - self.succeed key - } + get_key_by_fingerprint(nick, best.keyid, &block) }.errback {|status, msg| - self.fail status, msg + yield Nickserver::Response.new(status, msg) } - self end # # fetches ascii armored OpenPGP public key from the keyserver # - def get_key_by_fingerprint(key_id) + def get_key_by_fingerprint(nick, key_id) params = {op: 'get', search: "0x" + key_id, exact: 'on', options: 'mr'} http = EventMachine::HttpRequest.new(Config.hkp_url).get(query: params) http.callback { - if http.response_header.status != 200 - self.fail http.response_header.status, "HKP Request failed" + status = http.response_header.status + if status != 200 + yield Nickserver::Response.new status, "HKP Request failed" else - yield http.response + yield Response.new nick, http.response end } http.errback { - self.fail 500, http.error + yield Nickserver::Response.new 500, http.error } end diff --git a/lib/nickserver/hkp/source.rb b/lib/nickserver/hkp/source.rb index 79333f0..f06a931 100644 --- a/lib/nickserver/hkp/source.rb +++ b/lib/nickserver/hkp/source.rb @@ -1,20 +1,20 @@ -require 'nickserver/hkp/response' module Nickserver::Hkp class Source def initialize(adapter) + @adapter = adapter end - def query(nick) - fetcher.get(nick).callback {|key| - yield Response.new(nick, key) - }.errback {|status, msg| - yield Nickserver::Response.new(status, msg) - } + def query(nick, &block) + fetcher.get(nick, &block) end + protected + + attr_reader :adapter + def fetcher - Nickserver::Hkp::FetchKey.new + Nickserver::Hkp::FetchKey.new(adapter) end end end -- cgit v1.2.3 From 10a57e4f92432ff2b82c4a6bb5027bb3bcbdfab9 Mon Sep 17 00:00:00 2001 From: Azul Date: Fri, 10 Jun 2016 10:28:09 +0200 Subject: turn Hkp::FetchKey into Hkp::Source The source was really just an empty shell now that we pushed the em specific stuff further down. --- lib/nickserver/hkp/fetch_key.rb | 59 ----------------------------------------- lib/nickserver/hkp/source.rb | 51 ++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 66 deletions(-) delete mode 100644 lib/nickserver/hkp/fetch_key.rb (limited to 'lib/nickserver') diff --git a/lib/nickserver/hkp/fetch_key.rb b/lib/nickserver/hkp/fetch_key.rb deleted file mode 100644 index 10c4926..0000000 --- a/lib/nickserver/hkp/fetch_key.rb +++ /dev/null @@ -1,59 +0,0 @@ -require 'em-http' -require 'nickserver/response' -require 'nickserver/hkp/response' - -# -# Fetch keys via HKP -# http://tools.ietf.org/html/draft-shaw-openpgp-hkp-00 -# - -module Nickserver; module Hkp - - class FetchKey - - def initialize(adapter) - @adapter = adapter - end - - def get(nick, &block) - FetchKeyInfo.new.search(nick).callback {|key_info_list| - best = pick_best_key(key_info_list) - get_key_by_fingerprint(nick, best.keyid, &block) - }.errback {|status, msg| - yield Nickserver::Response.new(status, msg) - } - end - - # - # fetches ascii armored OpenPGP public key from the keyserver - # - def get_key_by_fingerprint(nick, key_id) - params = {op: 'get', search: "0x" + key_id, exact: 'on', options: 'mr'} - http = EventMachine::HttpRequest.new(Config.hkp_url).get(query: params) - http.callback { - status = http.response_header.status - if status != 200 - yield Nickserver::Response.new status, "HKP Request failed" - else - yield Response.new nick, http.response - end - } - http.errback { - yield Nickserver::Response.new 500, http.error - } - end - - protected - - # - # for now, just pick the newest key. - # - # in the future, we should perhaps pick the newest key - # that is signed by the oldest key. - # - def pick_best_key(key_info_list) - key_info_list.sort {|a,b| a.creationdate <=> b.creationdate}.last - end - end - -end; end diff --git a/lib/nickserver/hkp/source.rb b/lib/nickserver/hkp/source.rb index f06a931..1dd386d 100644 --- a/lib/nickserver/hkp/source.rb +++ b/lib/nickserver/hkp/source.rb @@ -1,4 +1,12 @@ -module Nickserver::Hkp +require 'nickserver/response' +require 'nickserver/hkp/response' + +# +# Fetch keys via HKP +# http://tools.ietf.org/html/draft-shaw-openpgp-hkp-00 +# + +module Nickserver; module Hkp class Source def initialize(adapter) @@ -6,15 +14,44 @@ module Nickserver::Hkp end def query(nick, &block) - fetcher.get(nick, &block) + FetchKeyInfo.new.search(nick).callback {|key_info_list| + best = pick_best_key(key_info_list) + get_key_by_fingerprint(nick, best.keyid, &block) + }.errback {|status, msg| + yield Nickserver::Response.new(status, msg) + } end - protected + # + # fetches ascii armored OpenPGP public key from the keyserver + # + def get_key_by_fingerprint(nick, key_id) + params = {op: 'get', search: "0x" + key_id, exact: 'on', options: 'mr'} + http = EventMachine::HttpRequest.new(Config.hkp_url).get(query: params) + http.callback { + status = http.response_header.status + if status != 200 + yield Nickserver::Response.new status, "HKP Request failed" + else + yield Response.new nick, http.response + end + } + http.errback { + yield Nickserver::Response.new 500, http.error + } + end - attr_reader :adapter + protected - def fetcher - Nickserver::Hkp::FetchKey.new(adapter) + # + # for now, just pick the newest key. + # + # in the future, we should perhaps pick the newest key + # that is signed by the oldest key. + # + def pick_best_key(key_info_list) + key_info_list.sort {|a,b| a.creationdate <=> b.creationdate}.last end end -end + +end; end -- cgit v1.2.3 From 92c86fc4e1e6dcb86793992e69dfd0608c118c9a Mon Sep 17 00:00:00 2001 From: Azul Date: Sat, 11 Jun 2016 10:20:06 +0200 Subject: use the adapter not EM in hkp source --- lib/nickserver/hkp/source.rb | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'lib/nickserver') diff --git a/lib/nickserver/hkp/source.rb b/lib/nickserver/hkp/source.rb index 1dd386d..48a63d8 100644 --- a/lib/nickserver/hkp/source.rb +++ b/lib/nickserver/hkp/source.rb @@ -22,23 +22,22 @@ module Nickserver; module Hkp } end + protected + + attr_reader :adapter + # # fetches ascii armored OpenPGP public key from the keyserver # def get_key_by_fingerprint(nick, key_id) params = {op: 'get', search: "0x" + key_id, exact: 'on', options: 'mr'} - http = EventMachine::HttpRequest.new(Config.hkp_url).get(query: params) - http.callback { - status = http.response_header.status - if status != 200 - yield Nickserver::Response.new status, "HKP Request failed" + adapter.get Config.hkp_url, query: params do |status, response| + if status == 200 + yield Response.new nick, response else - yield Response.new nick, http.response + yield Nickserver::Response.new status, "HKP Request failed" end - } - http.errback { - yield Nickserver::Response.new 500, http.error - } + end end protected -- cgit v1.2.3 From f567ed80427d43019ceb1aaf77d4bc6c01e62729 Mon Sep 17 00:00:00 2001 From: Azul Date: Sat, 11 Jun 2016 15:19:50 +0200 Subject: use adapter for FetchKeyInfo --- lib/nickserver/hkp/fetch_key_info.rb | 28 ++++++++++++---------------- lib/nickserver/hkp/parse_key_info.rb | 22 +++++++++++++++------- lib/nickserver/hkp/source.rb | 14 ++++++++------ 3 files changed, 35 insertions(+), 29 deletions(-) (limited to 'lib/nickserver') diff --git a/lib/nickserver/hkp/fetch_key_info.rb b/lib/nickserver/hkp/fetch_key_info.rb index b7481d0..b23af15 100644 --- a/lib/nickserver/hkp/fetch_key_info.rb +++ b/lib/nickserver/hkp/fetch_key_info.rb @@ -1,30 +1,26 @@ -require 'em-http' - # # used to fetch an array of KeyInfo objects that match the given uid. # module Nickserver; module Hkp class FetchKeyInfo - include EM::Deferrable - def search(uid) + def initialize(adapter) + @adapter = adapter + end + + def search(uid, &block) # in practice, exact=on seems to have no effect params = {op: 'vindex', search: uid, exact: 'on', options: 'mr', fingerprint: 'on'} - EventMachine::HttpRequest.new(Config.hkp_url).get(query: params).callback {|http| - parser = ParseKeyInfo.new http.response_header, http.response - keys = parser.keys(uid) - if keys.any? - self.succeed keys - else - self.fail parser.status(uid), parser.msg(uid) - end - }.errback {|http| - self.fail 500, http.error - } - self + adapter.get(Config.hkp_url, query: params) do |status, response| + parser = ParseKeyInfo.new status, response + yield parser.status_for(uid), parser.response_for(uid) + end end + protected + attr_reader :adapter + end end; end diff --git a/lib/nickserver/hkp/parse_key_info.rb b/lib/nickserver/hkp/parse_key_info.rb index d8abe4f..9d59d6b 100644 --- a/lib/nickserver/hkp/parse_key_info.rb +++ b/lib/nickserver/hkp/parse_key_info.rb @@ -12,18 +12,26 @@ module Nickserver; module Hkp # which the output of sks does. MATCH_PUB_KEY = /(^pub:.+?\n(^uid:.+?\n)+)/m - # header -- header of the hkp response + # status -- http status of the hkp response # vindex_result -- raw output from a vindex hkp query (machine readable) - def initialize(header, vindex_result) - @header = header + def initialize(status, vindex_result) + @status = status @vindex_result = vindex_result end - def status(uid) + def status_for(uid) if hkp_ok? && keys(uid).empty? error_status(uid) else - header.status + status + end + end + + def response_for(uid) + if keys(uid).any? + keys(uid) + else + msg(uid) end end @@ -41,7 +49,7 @@ module Nickserver; module Hkp protected - attr_reader :header + attr_reader :status attr_reader :vindex_result def error_status(uid) @@ -78,7 +86,7 @@ module Nickserver; module Hkp end def hkp_ok? - header.status == 200 + status == 200 end def error_message(uid, key, err) diff --git a/lib/nickserver/hkp/source.rb b/lib/nickserver/hkp/source.rb index 48a63d8..1af8ac9 100644 --- a/lib/nickserver/hkp/source.rb +++ b/lib/nickserver/hkp/source.rb @@ -14,12 +14,14 @@ module Nickserver; module Hkp end def query(nick, &block) - FetchKeyInfo.new.search(nick).callback {|key_info_list| - best = pick_best_key(key_info_list) - get_key_by_fingerprint(nick, best.keyid, &block) - }.errback {|status, msg| - yield Nickserver::Response.new(status, msg) - } + FetchKeyInfo.new(adapter).search(nick) do |status, response| + if status == 200 + best = pick_best_key(response) + get_key_by_fingerprint(nick, best.keyid, &block) + else + yield Nickserver::Response.new(status, response) + end + end end protected -- cgit v1.2.3 From 48502085e5aa7a1d8d430fc1dd4913f34e818afa Mon Sep 17 00:00:00 2001 From: Azul Date: Tue, 14 Jun 2016 09:36:29 +0200 Subject: introduce Hkp::Client wraps the hkp protocol --- lib/nickserver/hkp/client.rb | 44 ++++++++++++++++++++++++++++++++++++ lib/nickserver/hkp/fetch_key_info.rb | 10 +++++--- lib/nickserver/hkp/source.rb | 28 +++++++++++------------ 3 files changed, 64 insertions(+), 18 deletions(-) create mode 100644 lib/nickserver/hkp/client.rb (limited to 'lib/nickserver') diff --git a/lib/nickserver/hkp/client.rb b/lib/nickserver/hkp/client.rb new file mode 100644 index 0000000..6bd239d --- /dev/null +++ b/lib/nickserver/hkp/client.rb @@ -0,0 +1,44 @@ +require 'nickserver/hkp' + +# +# Client for the HKP protocol. +# +# This is not a complete implementation - only the parts we need. +# Instantiate with an adapter that will take care of the http requests. +# +# For each request we yield http_status and the response content just +# like the adapter does. + + +module Nickserver; module Hkp + class Client + + def initialize(adapter) + @adapter = adapter + end + + # + # used to fetch an array of KeyInfo objects that match the given email + # + def get_key_infos_by_email(email, &block) + get op: 'vindex', search: email, fingerprint: 'on', &block + end + + # + # fetches ascii armored OpenPGP public key from the keyserver + # + def get_key_by_fingerprint(fingerprint, &block) + get op: 'get', search: "0x" + fingerprint, &block + end + + protected + + attr_reader :adapter + + def get(query, &block) + # in practice, exact=on seems to have no effect + query = {exact: 'on', options: 'mr'}.merge query + adapter.get Config.hkp_url, query: query, &block + end + end +end; end diff --git a/lib/nickserver/hkp/fetch_key_info.rb b/lib/nickserver/hkp/fetch_key_info.rb index b23af15..b8685bc 100644 --- a/lib/nickserver/hkp/fetch_key_info.rb +++ b/lib/nickserver/hkp/fetch_key_info.rb @@ -1,3 +1,5 @@ +require 'nickserver/hkp/client' + # # used to fetch an array of KeyInfo objects that match the given uid. # @@ -10,9 +12,7 @@ module Nickserver; module Hkp end def search(uid, &block) - # in practice, exact=on seems to have no effect - params = {op: 'vindex', search: uid, exact: 'on', options: 'mr', fingerprint: 'on'} - adapter.get(Config.hkp_url, query: params) do |status, response| + client.get_key_infos_by_email(uid) do |status, response| parser = ParseKeyInfo.new status, response yield parser.status_for(uid), parser.response_for(uid) end @@ -21,6 +21,10 @@ module Nickserver; module Hkp protected attr_reader :adapter + def client + @client ||= Client.new(adapter) + end + end end; end diff --git a/lib/nickserver/hkp/source.rb b/lib/nickserver/hkp/source.rb index 1af8ac9..cbff91a 100644 --- a/lib/nickserver/hkp/source.rb +++ b/lib/nickserver/hkp/source.rb @@ -1,5 +1,6 @@ require 'nickserver/response' require 'nickserver/hkp/response' +require 'nickserver/hkp/client' # # Fetch keys via HKP @@ -29,11 +30,17 @@ module Nickserver; module Hkp attr_reader :adapter # - # fetches ascii armored OpenPGP public key from the keyserver + # for now, just pick the newest key. # - def get_key_by_fingerprint(nick, key_id) - params = {op: 'get', search: "0x" + key_id, exact: 'on', options: 'mr'} - adapter.get Config.hkp_url, query: params do |status, response| + # in the future, we should perhaps pick the newest key + # that is signed by the oldest key. + # + def pick_best_key(key_info_list) + key_info_list.sort {|a,b| a.creationdate <=> b.creationdate}.last + end + + def get_key_by_fingerprint(nick, fingerprint) + client.get_key_by_fingerprint fingerprint do |status, response| if status == 200 yield Response.new nick, response else @@ -42,17 +49,8 @@ module Nickserver; module Hkp end end - protected - - # - # for now, just pick the newest key. - # - # in the future, we should perhaps pick the newest key - # that is signed by the oldest key. - # - def pick_best_key(key_info_list) - key_info_list.sort {|a,b| a.creationdate <=> b.creationdate}.last + def client + @client ||= Client.new(adapter) end end - end; end -- cgit v1.2.3 From 93258bd6fe6247e7af67f423243eba9808e920ee Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 15 Jun 2016 10:36:25 +0200 Subject: we don't need FetchKeyInfo anymore including in Source --- lib/nickserver/hkp/fetch_key_info.rb | 30 ------------------------------ lib/nickserver/hkp/source.rb | 12 +++++++++++- 2 files changed, 11 insertions(+), 31 deletions(-) delete mode 100644 lib/nickserver/hkp/fetch_key_info.rb (limited to 'lib/nickserver') diff --git a/lib/nickserver/hkp/fetch_key_info.rb b/lib/nickserver/hkp/fetch_key_info.rb deleted file mode 100644 index b8685bc..0000000 --- a/lib/nickserver/hkp/fetch_key_info.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'nickserver/hkp/client' - -# -# used to fetch an array of KeyInfo objects that match the given uid. -# - -module Nickserver; module Hkp - class FetchKeyInfo - - def initialize(adapter) - @adapter = adapter - end - - def search(uid, &block) - client.get_key_infos_by_email(uid) do |status, response| - parser = ParseKeyInfo.new status, response - yield parser.status_for(uid), parser.response_for(uid) - end - end - - protected - attr_reader :adapter - - def client - @client ||= Client.new(adapter) - end - - end - -end; end diff --git a/lib/nickserver/hkp/source.rb b/lib/nickserver/hkp/source.rb index cbff91a..cae3e01 100644 --- a/lib/nickserver/hkp/source.rb +++ b/lib/nickserver/hkp/source.rb @@ -1,6 +1,9 @@ require 'nickserver/response' require 'nickserver/hkp/response' require 'nickserver/hkp/client' +require "nickserver/hkp/parse_key_info" +require "nickserver/hkp/key_info" + # # Fetch keys via HKP @@ -15,7 +18,7 @@ module Nickserver; module Hkp end def query(nick, &block) - FetchKeyInfo.new(adapter).search(nick) do |status, response| + search(nick) do |status, response| if status == 200 best = pick_best_key(response) get_key_by_fingerprint(nick, best.keyid, &block) @@ -25,6 +28,13 @@ module Nickserver; module Hkp end end + def search(nick, &block) + client.get_key_infos_by_email(nick) do |status, response| + parser = ParseKeyInfo.new status, response + yield parser.status_for(nick), parser.response_for(nick) + end + end + protected attr_reader :adapter -- cgit v1.2.3