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 <wk@gnupg.org>
This commit is contained in:
Werner Koch 2019-03-25 15:13:59 +01:00
parent 7a38af6a10
commit 2f3eebf186
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
4 changed files with 50 additions and 5 deletions

View 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 @option{--remove-key} removes a key from that directory, its only
argument is a user-id. argument is a user-id.
The command @option{--print-wkd-hash} prints a WKD user id identifier The command @option{--print-wkd-hash} prints the WKD user-id identifiers
and the corresponding mailbox from the user-ids given on the command and the corresponding mailboxes from the user-ids given on the command
line or via stdin (one user-id per line). 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 @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 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 be invoked manually to check for a Web Key Directory entry for

View File

@ -62,6 +62,7 @@ enum cmd_and_opt_values
aInstallKey, aInstallKey,
aRemoveKey, aRemoveKey,
aPrintWKDHash, aPrintWKDHash,
aPrintWKDURL,
oGpgProgram, oGpgProgram,
oSend, oSend,
@ -93,6 +94,8 @@ static ARGPARSE_OPTS opts[] = {
"remove a key from a directory"), "remove a key from a directory"),
ARGPARSE_c (aPrintWKDHash, "print-wkd-hash", ARGPARSE_c (aPrintWKDHash, "print-wkd-hash",
"Print the WKD identifier for the given user ids"), "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 ")), ARGPARSE_group (301, ("@\nOptions:\n ")),
@ -236,6 +239,7 @@ parse_arguments (ARGPARSE_ARGS *pargs, ARGPARSE_OPTS *popts)
case aInstallKey: case aInstallKey:
case aRemoveKey: case aRemoveKey:
case aPrintWKDHash: case aPrintWKDHash:
case aPrintWKDURL:
cmd = pargs->r_opt; cmd = pargs->r_opt;
break; break;
@ -384,13 +388,24 @@ main (int argc, char **argv)
break; break;
case aPrintWKDHash: case aPrintWKDHash:
case aPrintWKDURL:
if (!argc) 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 else
{ {
for (err = delayed_err = 0; !err && argc; argc--, argv++) 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) if (gpg_err_code (err) == GPG_ERR_INV_USER_ID)
{ {
/* Diagnostic already printed. */ /* Diagnostic already printed. */

View 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_install_key (const char *fname, const char *userid);
gpg_error_t wks_cmd_remove_key (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_hash (const char *userid);
gpg_error_t wks_cmd_print_wkd_url (const char *userid);
/*-- wks-receive.c --*/ /*-- wks-receive.c --*/

View File

@ -1104,7 +1104,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 gpg_error_t
wks_cmd_print_wkd_hash (const char *userid) wks_cmd_print_wkd_hash (const char *userid)
{ {
@ -1121,3 +1121,28 @@ wks_cmd_print_wkd_hash (const char *userid)
xfree (addrspec); xfree (addrspec);
return err; 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;
}