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/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 ++++++++++++++++++++++++++++++++++ 5 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 lib/nickserver/hkp/v_index_response.rb (limited to 'lib/nickserver/hkp') 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 -- 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/hkp') 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 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 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 lib/nickserver/hkp/response.rb (limited to 'lib/nickserver/hkp') 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 -- 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 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 lib/nickserver/hkp/source.rb (limited to 'lib/nickserver/hkp') 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 -- 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/hkp') 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/hkp') 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/hkp') 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/hkp') 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/hkp') 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/hkp') 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