summaryrefslogtreecommitdiff
path: root/lib/nickserver/hkp/fetch_key.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/nickserver/hkp/fetch_key.rb')
-rw-r--r--lib/nickserver/hkp/fetch_key.rb51
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/nickserver/hkp/fetch_key.rb b/lib/nickserver/hkp/fetch_key.rb
new file mode 100644
index 0000000..c72ee11
--- /dev/null
+++ b/lib/nickserver/hkp/fetch_key.rb
@@ -0,0 +1,51 @@
+require 'em-http'
+
+module Nickserver; module HKP
+
+ class FetchKey
+ include EM::Deferrable
+
+ def get(uid)
+ FetchKeyInfo.new.search(uid).callback {|key_info_list|
+ best = pick_best_key(key_info_list)
+ get_key_by_fingerprint(best.keyid) {|key|
+ self.succeed key
+ }
+ }.errback {|msg|
+ self.fail msg
+ }
+ self
+ end
+
+ #
+ # fetches ascii armored OpenPGP public key from the keyserver
+ #
+ def get_key_by_fingerprint(key_id)
+ params = {:op => 'get', :search => "0x" + key_id, :exact => 'on', :options => 'mr'}
+ http = EventMachine::HttpRequest.new(Config.sks_url).get(:query => params)
+ http.callback {
+ if http.response_header.status != 200
+ self.fail http.response_header.status #"Request failed with #{http.response_header.status}: #{http.response}"
+ else
+ yield http.response
+ end
+ }
+ http.errback {
+ self.fail 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 \ No newline at end of file