mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-03 22:56:33 +02:00
wkd: New command --print-wkd-hash for gpg-wks-client.
* tools/gpg-wks-client.c (aPrintWKDHash): New. (opts) : Add "--print-wkd-hash". (main): Implement that command. (proc_userid_from_stdin): New. * tools/wks-util.c (wks_fname_from_userid): Add option HASH_ONLY. (wks_cmd_print_wkd_hash): New. -- GnuPG-bug-id: 4418 Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
393269948c
commit
e847cf1df7
5 changed files with 129 additions and 12 deletions
|
@ -61,6 +61,7 @@ enum cmd_and_opt_values
|
|||
aRead,
|
||||
aInstallKey,
|
||||
aRemoveKey,
|
||||
aPrintWKDHash,
|
||||
|
||||
oGpgProgram,
|
||||
oSend,
|
||||
|
@ -90,6 +91,8 @@ static ARGPARSE_OPTS opts[] = {
|
|||
"install a key into a directory"),
|
||||
ARGPARSE_c (aRemoveKey, "remove-key",
|
||||
"remove a key from a directory"),
|
||||
ARGPARSE_c (aPrintWKDHash, "print-wkd-hash",
|
||||
"Print the WKD identifier for the given user ids"),
|
||||
|
||||
ARGPARSE_group (301, ("@\nOptions:\n ")),
|
||||
|
||||
|
@ -129,6 +132,8 @@ const char *fake_submission_addr;
|
|||
|
||||
|
||||
static void wrong_args (const char *text) GPGRT_ATTR_NORETURN;
|
||||
static gpg_error_t proc_userid_from_stdin (gpg_error_t (*func)(const char *),
|
||||
const char *text);
|
||||
static gpg_error_t command_supported (char *userid);
|
||||
static gpg_error_t command_check (char *userid);
|
||||
static gpg_error_t command_send (const char *fingerprint, const char *userid);
|
||||
|
@ -230,6 +235,7 @@ parse_arguments (ARGPARSE_ARGS *pargs, ARGPARSE_OPTS *popts)
|
|||
case aCheck:
|
||||
case aInstallKey:
|
||||
case aRemoveKey:
|
||||
case aPrintWKDHash:
|
||||
cmd = pargs->r_opt;
|
||||
break;
|
||||
|
||||
|
@ -246,7 +252,7 @@ parse_arguments (ARGPARSE_ARGS *pargs, ARGPARSE_OPTS *popts)
|
|||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
gpg_error_t err;
|
||||
gpg_error_t err, delayed_err;
|
||||
ARGPARSE_ARGS pargs;
|
||||
enum cmd_and_opt_values cmd;
|
||||
|
||||
|
@ -377,6 +383,28 @@ main (int argc, char **argv)
|
|||
err = wks_cmd_remove_key (*argv);
|
||||
break;
|
||||
|
||||
case aPrintWKDHash:
|
||||
if (!argc)
|
||||
err = proc_userid_from_stdin (wks_cmd_print_wkd_hash, "printing hash");
|
||||
else
|
||||
{
|
||||
for (err = delayed_err = 0; !err && argc; argc--, argv++)
|
||||
{
|
||||
err = wks_cmd_print_wkd_hash (*argv);
|
||||
if (gpg_err_code (err) == GPG_ERR_INV_USER_ID)
|
||||
{
|
||||
/* Diagnostic already printed. */
|
||||
delayed_err = err;
|
||||
err = 0;
|
||||
}
|
||||
else if (err)
|
||||
log_error ("printing hash failed: %s\n", gpg_strerror (err));
|
||||
}
|
||||
if (!err)
|
||||
err = delayed_err;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
usage (1);
|
||||
err = 0;
|
||||
|
@ -390,10 +418,63 @@ main (int argc, char **argv)
|
|||
wks_write_status (STATUS_FAILURE, "- %u", GPG_ERR_GENERAL);
|
||||
else
|
||||
wks_write_status (STATUS_SUCCESS, NULL);
|
||||
return log_get_errorcount (0)? 1:0;
|
||||
return (err || log_get_errorcount (0))? 1:0;
|
||||
}
|
||||
|
||||
|
||||
/* Read user ids from stdin and call FUNC for each user id. TEXT is
|
||||
* used for error messages. */
|
||||
static gpg_error_t
|
||||
proc_userid_from_stdin (gpg_error_t (*func)(const char *), const char *text)
|
||||
{
|
||||
gpg_error_t err = 0;
|
||||
gpg_error_t delayed_err = 0;
|
||||
char line[2048];
|
||||
size_t n = 0;
|
||||
|
||||
/* If we are on a terminal disable buffering to get direct response. */
|
||||
if (gnupg_isatty (es_fileno (es_stdin))
|
||||
&& gnupg_isatty (es_fileno (es_stdout)))
|
||||
{
|
||||
es_setvbuf (es_stdin, NULL, _IONBF, 0);
|
||||
es_setvbuf (es_stdout, NULL, _IOLBF, 0);
|
||||
}
|
||||
|
||||
while (es_fgets (line, sizeof line - 1, es_stdin))
|
||||
{
|
||||
n = strlen (line);
|
||||
if (!n || line[n-1] != '\n')
|
||||
{
|
||||
err = gpg_error (*line? GPG_ERR_LINE_TOO_LONG
|
||||
: GPG_ERR_INCOMPLETE_LINE);
|
||||
log_error ("error reading stdin: %s\n", gpg_strerror (err));
|
||||
break;
|
||||
}
|
||||
trim_spaces (line);
|
||||
err = func (line);
|
||||
if (gpg_err_code (err) == GPG_ERR_INV_USER_ID)
|
||||
{
|
||||
delayed_err = err;
|
||||
err = 0;
|
||||
}
|
||||
else if (err)
|
||||
log_error ("%s failed: %s\n", text, gpg_strerror (err));
|
||||
}
|
||||
if (es_ferror (es_stdin))
|
||||
{
|
||||
err = gpg_error_from_syserror ();
|
||||
log_error ("error reading stdin: %s\n", gpg_strerror (err));
|
||||
goto leave;
|
||||
}
|
||||
|
||||
leave:
|
||||
if (!err)
|
||||
err = delayed_err;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Add the user id UID to the key identified by FINGERPRINT. */
|
||||
static gpg_error_t
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue