summaryrefslogtreecommitdiff
path: root/lib/nickserver/hkp/source.rb
blob: fe3c4a517b08516d4f7b93133d3ba5c58d17edc0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
require 'nickserver/source'
require 'nickserver/response'
require 'nickserver/key_response'
require 'nickserver/hkp/client'
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
        Nickserver::Response.new(status, response)
      end
    end

    def search(nick)
      status, response = client.get_key_infos_by_email(nick)
      parser = ParseKeyInfo.new status, response
      [parser.status_for(nick), parser.response_for(nick)]
    end

    def get_key_by_fingerprint(fingerprint, nick = nil)
      status, response = client.get_key_by_fingerprint fingerprint
      if status == 200
        Nickserver::KeyResponse.new nick, response
      else
        Nickserver::Response.new status, 'HKP Request failed'
      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_by(&:creationdate).last
    end

    def client
      @client ||= Client.new(adapter)
    end
  end
end