From 70c97a862aa586c314a64190d1e489a272e552ea Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Mon, 25 Mar 2019 15:13:59 +0100 Subject: [PATCH] wkd: New command --print-wkd-url for gpg-wks-client. * 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 --- doc/wks.texi | 8 ++++++-- tools/gpg-wks-client.c | 19 +++++++++++++++++-- tools/gpg-wks.h | 1 + tools/wks-util.c | 27 ++++++++++++++++++++++++++- 4 files changed, 50 insertions(+), 5 deletions(-) diff --git a/doc/wks.texi b/doc/wks.texi index 0ebd3db3f..9f1fff2a8 100644 --- a/doc/wks.texi +++ b/doc/wks.texi @@ -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 diff --git a/tools/gpg-wks-client.c b/tools/gpg-wks-client.c index 2c40d7e17..861a1fc61 100644 --- a/tools/gpg-wks-client.c +++ b/tools/gpg-wks-client.c @@ -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. */ diff --git a/tools/gpg-wks.h b/tools/gpg-wks.h index 99969c1ef..9acd7c37f 100644 --- a/tools/gpg-wks.h +++ b/tools/gpg-wks.h @@ -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 --*/ diff --git a/tools/wks-util.c b/tools/wks-util.c index d5cfcd874..1c1ac8c0b 100644 --- a/tools/wks-util.c +++ b/tools/wks-util.c @@ -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; +}