]> git.draconx.ca Git - homepage.git/blobdiff - lib/gpg-wkd.rb
Suggest keyserver (again) for retrievng public keys.
[homepage.git] / lib / gpg-wkd.rb
index 589369838817c34c2d75c92ed0270c8ea5d566e1..b2379f16853d00664b479444d4197dec5065e5c5 100644 (file)
@@ -1,4 +1,5 @@
-# Nick's web site: Export public keys for the Web Key Directory
+# Nick's web site: Export GPG public keys for HTTP Keyserver and the
+# Web Key Directory
 #
 # Copyright © 2022 Nick Bowler
 #
@@ -33,14 +34,35 @@ module WKD
     end
 
     # Helper for implementing export filters below
-    def WKD.export(item, uid, *args)
+    def WKD.export(item, id, *args)
         data, result = Open3.capture2(@@gpg2, "--export", *args,
-            *WKD.keyring_args(item[:keyrings]), uid.chomp)
+            *WKD.keyring_args(item[:keyrings]), id.chomp)
         raise "gpg failed" unless result.success?
         return data
     end
 
-    # Return a list list of all UIDs known from the given GPG keyrings.
+    # Return a list of all key fingerprints known from the given GPG keyrings.
+    def WKD.keys_from_keyrings(*args)
+        fps = {}
+
+        Open3.popen2(@@gpg2,
+            "--with-colons", "--list-keys", *WKD.keyring_args(args)
+        ) do |stdin, stdout, result|
+            stdin.close
+            stdout.each do |line|
+                fields = line.split(":")
+                next if fields[0] != "fpr"
+                fps[fields[9]] = true
+            end
+            stdout.close
+
+            raise "gpg failed" unless result.value.success?
+        end
+
+        return fps.keys
+    end
+
+    # Return a list of all UIDs known from the given GPG keyrings.
     def WKD.uids_from_keyrings(*args)
         uids = {}
 
@@ -125,6 +147,34 @@ def create_wkd_items(keyring_items)
     end
 end
 
+def create_hkp_items(keyring_items)
+    keyring_files = {}
+    [*keyring_items].each { |item| keyring_files[item.raw_filename] = true }
+
+    fps = WKD.keys_from_keyrings(*keyring_files.keys)
+    keyids_64 = {}
+    keyids_32 = {}
+
+    fps.each do |fp|
+        id64 = fp[-16..]
+        id32 = fp[-8..]
+
+        keyids_64[id64] = keyids_64[id64].to_i + 1
+        keyids_32[id32] = keyids_32[id32].to_i + 1
+    end
+
+    fps.each do |fp|
+        id64 = fp[-16..]
+        id32 = fp[-8..]
+
+        attrs = { keyrings: keyring_files.keys }
+        attrs[:id64] = id64 if keyids_64[id64] == 1
+        attrs[:id32] = id32 if keyids_32[id32] == 1
+
+        @items.create("0x"+fp, attrs, "/gpg/" + fp)
+    end
+end
+
 # Convert items created by create_wkd_items into real GPG keyrings.
 class WKDExport < Nanoc::Filter
     identifier :wkd_export