wkd: New command --print-wkd-url for gpg-wks-client.
authorWerner Koch <wk@gnupg.org>
Mon, 25 Mar 2019 14:13:59 +0000 (15:13 +0100)
committerWerner Koch <wk@gnupg.org>
Mon, 25 Mar 2019 14:13:59 +0000 (15:13 +0100)
* tools/gpg-wks-client.c (aPrintWKDURL): New.
(opts): Add option.
(main): Implement.
* tools/wks-util.c (wks_cmd_print_wkd_url): New.

Signed-off-by: Werner Koch <wk@gnupg.org>
doc/wks.texi
tools/gpg-wks-client.c
tools/gpg-wks.h
tools/wks-util.c

index 0ebd3db..9f1fff2 100644 (file)
@@ -101,10 +101,14 @@ fingerprint and the mailbox separated by a space.  The command
 @option{--remove-key} removes a key from that directory, its only
 argument is a user-id.
 
-The command @option{--print-wkd-hash} prints a WKD user id identifier
-and the corresponding mailbox from the user-ids given on the command
+The command @option{--print-wkd-hash} prints the WKD user-id identifiers
+and the corresponding mailboxes from the user-ids given on the command
 line or via stdin (one user-id per line).
 
+The command @option{--print-wkd-url} prints the URLs used to fetch the
+key for the given user-ids from WKD.  The meanwhile preferred format
+with sub-domains is used here.
+
 @command{gpg-wks-client} is not commonly invoked directly and thus it
 is not installed in the bin directory.  Here is an example how it can
 be invoked manually to check for a Web Key Directory entry for
index 2c40d7e..861a1fc 100644 (file)
@@ -62,6 +62,7 @@ enum cmd_and_opt_values
     aInstallKey,
     aRemoveKey,
     aPrintWKDHash,
+    aPrintWKDURL,
 
     oGpgProgram,
     oSend,
@@ -93,6 +94,8 @@ static ARGPARSE_OPTS opts[] = {
               "remove a key from a directory"),
   ARGPARSE_c (aPrintWKDHash, "print-wkd-hash",
               "Print the WKD identifier for the given user ids"),
+  ARGPARSE_c (aPrintWKDURL, "print-wkd-url",
+              "Print the WKD URL for the given user id"),
 
   ARGPARSE_group (301, ("@\nOptions:\n ")),
 
@@ -236,6 +239,7 @@ parse_arguments (ARGPARSE_ARGS *pargs, ARGPARSE_OPTS *popts)
         case aInstallKey:
         case aRemoveKey:
         case aPrintWKDHash:
+        case aPrintWKDURL:
           cmd = pargs->r_opt;
           break;
 
@@ -384,13 +388,24 @@ main (int argc, char **argv)
       break;
 
     case aPrintWKDHash:
+    case aPrintWKDURL:
       if (!argc)
-        err = proc_userid_from_stdin (wks_cmd_print_wkd_hash, "printing hash");
+        {
+          if (cmd == aPrintWKDHash)
+            err = proc_userid_from_stdin (wks_cmd_print_wkd_hash,
+                                          "printing WKD hash");
+          else
+            err = proc_userid_from_stdin (wks_cmd_print_wkd_url,
+                                          "printing WKD URL");
+        }
       else
         {
           for (err = delayed_err = 0; !err && argc; argc--, argv++)
             {
-              err = wks_cmd_print_wkd_hash (*argv);
+              if (cmd == aPrintWKDHash)
+                err = wks_cmd_print_wkd_hash (*argv);
+              else
+                err = wks_cmd_print_wkd_url (*argv);
               if (gpg_err_code (err) == GPG_ERR_INV_USER_ID)
                 {
                   /* Diagnostic already printed.  */
index 99969c1..9acd7c3 100644 (file)
@@ -104,6 +104,7 @@ gpg_error_t wks_compute_hu_fname (char **r_fname, const char *addrspec);
 gpg_error_t wks_cmd_install_key (const char *fname, const char *userid);
 gpg_error_t wks_cmd_remove_key (const char *userid);
 gpg_error_t wks_cmd_print_wkd_hash (const char *userid);
+gpg_error_t wks_cmd_print_wkd_url (const char *userid);
 
 
 /*-- wks-receive.c --*/
index d5cfcd8..1c1ac8c 100644 (file)
@@ -1103,7 +1103,7 @@ wks_cmd_remove_key (const char *userid)
 }
 
 
-/* Print the WKD hash for the user ids to stdout.  */
+/* Print the WKD hash for the user id to stdout.  */
 gpg_error_t
 wks_cmd_print_wkd_hash (const char *userid)
 {
@@ -1120,3 +1120,28 @@ wks_cmd_print_wkd_hash (const char *userid)
   xfree (addrspec);
   return err;
 }
+
+
+/* Print the WKD URL for the user id to stdout.  */
+gpg_error_t
+wks_cmd_print_wkd_url (const char *userid)
+{
+  gpg_error_t err;
+  char *addrspec, *fname;
+  char *domain;
+
+  err = wks_fname_from_userid (userid, 1, &fname, &addrspec);
+  if (err)
+    return err;
+
+  domain = strchr (addrspec, '@');
+  if (domain)
+    *domain++ = 0;
+
+  es_printf ("https://openpgpkey.%s/.well-known/openpgpkey/%s/hu/%s?l=%s\n",
+             domain, domain, fname, addrspec);
+
+  xfree (fname);
+  xfree (addrspec);
+  return err;
+}