From 40916407517f4bdb75a295caf29e02d4f403349b Mon Sep 17 00:00:00 2001 From: Azul Date: Sat, 23 Sep 2017 11:07:32 +0200 Subject: style: rubocop mostly auto-correct --- lib/nickserver/hkp/client.rb | 31 ++++++++++++++----------------- lib/nickserver/hkp/key_info.rb | 13 ++++--------- lib/nickserver/hkp/parse_key_info.rb | 19 +++++++++---------- lib/nickserver/hkp/response.rb | 2 -- lib/nickserver/hkp/source.rb | 29 +++++++++++++---------------- lib/nickserver/hkp/v_index_response.rb | 15 +++++++-------- 6 files changed, 47 insertions(+), 62 deletions(-) (limited to 'lib/nickserver/hkp') diff --git a/lib/nickserver/hkp/client.rb b/lib/nickserver/hkp/client.rb index d53daad..3dbb1de 100644 --- a/lib/nickserver/hkp/client.rb +++ b/lib/nickserver/hkp/client.rb @@ -1,18 +1,15 @@ 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 +module 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. class Client - def initialize(adapter) @adapter = adapter end @@ -20,7 +17,7 @@ module Nickserver; module Hkp # # used to fetch an array of KeyInfo objects that match the given email # - def get_key_infos_by_email(email, &block) + def get_key_infos_by_email(email) get op: 'vindex', search: email.to_s, fingerprint: 'on' end @@ -28,7 +25,7 @@ module Nickserver; module Hkp # fetches ascii armored OpenPGP public key from the keyserver # def get_key_by_fingerprint(fingerprint) - get op: 'get', search: "0x" + fingerprint + get op: 'get', search: '0x' + fingerprint end protected @@ -37,9 +34,9 @@ module Nickserver; module Hkp def get(query) # in practice, exact=on seems to have no effect - query = {exact: 'on', options: 'mr'}.merge query + query = { exact: 'on', options: 'mr' }.merge query response = adapter.get Config.hkp_url, query: query - return response + response end end -end; end +end diff --git a/lib/nickserver/hkp/key_info.rb b/lib/nickserver/hkp/key_info.rb index d4ecf10..ed38643 100644 --- a/lib/nickserver/hkp/key_info.rb +++ b/lib/nickserver/hkp/key_info.rb @@ -32,26 +32,22 @@ module Nickserver::Hkp def creationdate @creationdate ||= begin - if @creationdate_s - Time.at(@creationdate_s.to_i) - end + Time.at(@creationdate_s.to_i) if @creationdate_s end end def expirationdate @expirationdate ||= begin - if @expirationdate_s - Time.at(@expirationdate_s.to_i) - end + Time.at(@expirationdate_s.to_i) if @expirationdate_s end end def rsa? - @algo == "1" + @algo == '1' end def dsa? - @algo == "17" + @algo == '17' end def revoked? @@ -66,5 +62,4 @@ module Nickserver::Hkp @flags =~ /e/ end end - end diff --git a/lib/nickserver/hkp/parse_key_info.rb b/lib/nickserver/hkp/parse_key_info.rb index 2f928a0..09dc69e 100644 --- a/lib/nickserver/hkp/parse_key_info.rb +++ b/lib/nickserver/hkp/parse_key_info.rb @@ -5,9 +5,8 @@ # 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::Hkp class ParseKeyInfo - # 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 @@ -47,7 +46,7 @@ module Nickserver; module Hkp if errors(uid).any? error_messages(uid).join "\n" else - "Could not fetch keyinfo." + 'Could not fetch keyinfo.' end end @@ -63,7 +62,7 @@ module Nickserver; module Hkp end def errors(uid) - key_infos(uid).map{|key| error_for_key(key) }.compact + key_infos(uid).map { |key| error_for_key(key) }.compact end def error_messages(uid) @@ -97,16 +96,16 @@ module Nickserver; module Hkp def error_for_key(key) if key.keylen < 2048 - "key length is too short." + 'key length is too short.' elsif key.expired? - "key expired." + 'key expired.' elsif key.revoked? - "key revoked." + 'key revoked.' elsif key.disabled? - "key disabled." + 'key disabled.' elsif key.expirationdate && key.expirationdate < Time.now - "key expired" + 'key expired' end end end -end; end +end diff --git a/lib/nickserver/hkp/response.rb b/lib/nickserver/hkp/response.rb index c52e25f..2cc69d3 100644 --- a/lib/nickserver/hkp/response.rb +++ b/lib/nickserver/hkp/response.rb @@ -1,6 +1,5 @@ module Nickserver::Hkp class Response - attr_reader :status, :content def initialize(uid, key) @@ -13,6 +12,5 @@ module Nickserver::Hkp def format_response(map) map.to_json end - end end diff --git a/lib/nickserver/hkp/source.rb b/lib/nickserver/hkp/source.rb index 82c94a0..d7c86a3 100644 --- a/lib/nickserver/hkp/source.rb +++ b/lib/nickserver/hkp/source.rb @@ -2,24 +2,21 @@ require 'nickserver/source' 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 -# http://tools.ietf.org/html/draft-shaw-openpgp-hkp-00 -# - -module Nickserver; module Hkp +require 'nickserver/hkp/parse_key_info' +require 'nickserver/hkp/key_info' + +module Nickserver::Hkp + # + # Fetch keys via HKP + # http://tools.ietf.org/html/draft-shaw-openpgp-hkp-00 + # class Source < Nickserver::Source - def query(nick) status, response = search(nick) if status == 200 best = pick_best_key(response) get_key_by_fingerprint(best.keyid, nick) - elsif status != 404 # 404 means no key found and we proceed + elsif status != 404 # 404 means no key found and we proceed Nickserver::Response.new(status, response) end end @@ -27,7 +24,7 @@ module Nickserver; module Hkp def search(nick) status, response = client.get_key_infos_by_email(nick) parser = ParseKeyInfo.new status, response - return parser.status_for(nick), parser.response_for(nick) + [parser.status_for(nick), parser.response_for(nick)] end def get_key_by_fingerprint(fingerprint, nick = nil) @@ -35,7 +32,7 @@ module Nickserver; module Hkp if status == 200 Response.new nick, response else - Nickserver::Response.new status, "HKP Request failed" + Nickserver::Response.new status, 'HKP Request failed' end end @@ -48,11 +45,11 @@ module Nickserver; module Hkp # 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 + key_info_list.sort_by(&:creationdate).last end def client @client ||= Client.new(adapter) end end -end; end +end diff --git a/lib/nickserver/hkp/v_index_response.rb b/lib/nickserver/hkp/v_index_response.rb index 865d476..a2a7b0d 100644 --- a/lib/nickserver/hkp/v_index_response.rb +++ b/lib/nickserver/hkp/v_index_response.rb @@ -9,7 +9,6 @@ require 'nickserver/hkp/key_info' # 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 @@ -36,7 +35,7 @@ module Nickserver::Hkp if errors.any? error_messages.join "\n" else - "Could not fetch keyinfo." + 'Could not fetch keyinfo.' end end @@ -53,7 +52,7 @@ module Nickserver::Hkp end def errors - key_infos.map{|key| error_for_key(key) }.compact + key_infos.map { |key| error_for_key(key) }.compact end def error_messages @@ -81,15 +80,15 @@ module Nickserver::Hkp def error_for_key(key) if key.keylen < 2048 - "key length is too short." + 'key length is too short.' elsif key.expired? - "key expired." + 'key expired.' elsif key.revoked? - "key revoked." + 'key revoked.' elsif key.disabled? - "key disabled." + 'key disabled.' elsif key.expirationdate && key.expirationdate < Time.now - "key expired" + 'key expired' end end end -- cgit v1.2.3 From f40ef14010af08c49810c0a6a2349072948170e6 Mon Sep 17 00:00:00 2001 From: Azul Date: Sat, 23 Sep 2017 13:43:29 +0200 Subject: style: more rubocop fixes --- lib/nickserver/hkp/client.rb | 3 +- lib/nickserver/hkp/key_info.rb | 76 ++++++++++++++++++++++-------------- lib/nickserver/hkp/parse_key_info.rb | 14 +++---- 3 files changed, 56 insertions(+), 37 deletions(-) (limited to 'lib/nickserver/hkp') 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. -- cgit v1.2.3 From b2543051d0629ab11adae1a64a1aed2105a1b9d9 Mon Sep 17 00:00:00 2001 From: Azul Date: Sat, 23 Sep 2017 15:10:11 +0200 Subject: refactor: move error detection into key_info Still needs something better than all these elsifs though --- lib/nickserver/hkp/key_info.rb | 14 ++++++++++++++ lib/nickserver/hkp/parse_key_info.rb | 25 +++++-------------------- lib/nickserver/hkp/v_index_response.rb | 23 ++++------------------- 3 files changed, 23 insertions(+), 39 deletions(-) (limited to 'lib/nickserver/hkp') diff --git a/lib/nickserver/hkp/key_info.rb b/lib/nickserver/hkp/key_info.rb index 5c8b845..568a798 100644 --- a/lib/nickserver/hkp/key_info.rb +++ b/lib/nickserver/hkp/key_info.rb @@ -21,6 +21,20 @@ module Nickserver::Hkp @uids = extract_uids(uid_lines) end + def error + if keylen < 2048 + 'key length is too short.' + elsif expired? + 'key expired.' + elsif revoked? + 'key revoked.' + elsif disabled? + 'key disabled.' + elsif expirationdate && expirationdate < Time.now + 'key expired' + end + end + def keyid properties.first end diff --git a/lib/nickserver/hkp/parse_key_info.rb b/lib/nickserver/hkp/parse_key_info.rb index c23751b..a6f170c 100644 --- a/lib/nickserver/hkp/parse_key_info.rb +++ b/lib/nickserver/hkp/parse_key_info.rb @@ -39,7 +39,7 @@ module Nickserver::Hkp protected def keys(uid) - key_infos(uid).reject { |key| error_for_key(key) } + key_infos(uid).reject(&:error) end def msg(uid) @@ -62,13 +62,12 @@ module Nickserver::Hkp end def errors(uid) - key_infos(uid).map { |key| error_for_key(key) }.compact + key_infos(uid).map(&:error).compact end def error_messages(uid) key_infos(uid).map do |key| - err = error_for_key(key) - error_message(uid, key, err) + error_message(uid, key) end.compact end @@ -90,22 +89,8 @@ module Nickserver::Hkp status == 200 end - def error_message(uid, key, err) - "Ignoring key #{key.keyid} for #{uid}: #{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 + def error_message(uid, key) + "Ignoring key #{key.keyid} for #{uid}: #{key.error}" if key.error end end end diff --git a/lib/nickserver/hkp/v_index_response.rb b/lib/nickserver/hkp/v_index_response.rb index a2a7b0d..a44af51 100644 --- a/lib/nickserver/hkp/v_index_response.rb +++ b/lib/nickserver/hkp/v_index_response.rb @@ -28,7 +28,7 @@ module Nickserver::Hkp end def keys - key_infos.reject { |key| error_for_key(key) } + key_infos.reject &:error end def msg @@ -57,8 +57,7 @@ module Nickserver::Hkp def error_messages key_infos.map do |key| - err = error_for_key(key) - error_message(key, err) + error_message(key) end.compact end @@ -74,22 +73,8 @@ module Nickserver::Hkp 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 + def error_message(key) + "Ignoring key #{key.keyid} for #{nick}: #{key.error}" if key.error end end end -- cgit v1.2.3 From 8ac6bb8492c9a3b9ec5d7b5bf2b35907a1f8c332 Mon Sep 17 00:00:00 2001 From: Azul Date: Sat, 23 Sep 2017 15:41:56 +0200 Subject: style: avoid endless elsif in KeyInfo#error using an array of symbols representing the different checks now. --- lib/nickserver/hkp/key_info.rb | 49 +++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 22 deletions(-) (limited to 'lib/nickserver/hkp') diff --git a/lib/nickserver/hkp/key_info.rb b/lib/nickserver/hkp/key_info.rb index 568a798..e1a9500 100644 --- a/lib/nickserver/hkp/key_info.rb +++ b/lib/nickserver/hkp/key_info.rb @@ -21,17 +21,12 @@ module Nickserver::Hkp @uids = extract_uids(uid_lines) end + CHECKS = %i[too_short? expired? revoked? disabled? outdated?].freeze + def error - if keylen < 2048 - 'key length is too short.' - elsif expired? - 'key expired.' - elsif revoked? - 'key revoked.' - elsif disabled? - 'key disabled.' - elsif expirationdate && expirationdate < Time.now - 'key expired' + CHECKS.find do |check| + msg = check.to_s.chop.tr('_', ' ') + "key is #{msg}." if send(check) end end @@ -69,18 +64,6 @@ module Nickserver::Hkp algo == '17' end - def revoked? - flags =~ /r/ - end - - def disabled? - flags =~ /d/ - end - - def expired? - flags =~ /e/ - end - protected attr_reader :properties @@ -93,5 +76,27 @@ module Nickserver::Hkp CGI.unescape(uid.sub(/.*<(.+)>.*/, '\1')) end end + + # CHECKS + + def too_short? + keylen < 2048 + end + + def expired? + flags =~ /e/ + end + + def revoked? + flags =~ /r/ + end + + def disabled? + flags =~ /d/ + end + + def outdated? + expirationdate && expirationdate < Time.now + end end end -- cgit v1.2.3