gpg: Use AKL for angle bracketed mail address with -r.

* g10/getkey.c (get_pubkey_byname): Extend is_mbox checking.
(get_best_pubkey_byname): Ditto.
--

With this patch it is now possible to use

  gpg -e -r '<foo@example.org>'

and auto key locate will find the key.  Without that a plain mail
address; i.e.

  gpg -e -r 'foo@example.org'

was required.

GnuPG-bug-id: 4726
Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2019-12-04 14:39:42 +01:00
parent d2ff62dbdf
commit 1abb39fdaf
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
1 changed files with 31 additions and 6 deletions

View File

@ -928,6 +928,17 @@ get_pubkey_byname (ctrl_t ctrl, enum get_pubkey_modes mode,
/* Does NAME appear to be a mailbox (mail address)? */
is_mbox = is_valid_mailbox (name);
if (!is_mbox && *name == '<' && name[1] && name[strlen(name)-1]=='>'
&& name[1] != '>'
&& is_valid_mailbox_mem (name+1, strlen (name)-2))
{
/* The mailbox is in the form "<foo@example.org>" which is not
* detected by is_valid_mailbox. Set the flag but keep name as
* it is because the bracketed name is actual the better
* specification for a local search and the other methods
* extract the mail address anyway. */
is_mbox = 1;
}
/* The auto-key-locate feature works as follows: there are a number
* of methods to look up keys. By default, the local keyring is
@ -1359,7 +1370,7 @@ get_best_pubkey_byname (ctrl_t ctrl, enum get_pubkey_modes mode,
{
gpg_error_t err;
struct getkey_ctx_s *ctx = NULL;
int is_mbox = is_valid_mailbox (name);
int is_mbox;
int wkd_tried = 0;
PKT_public_key pk0;
@ -1371,6 +1382,18 @@ get_best_pubkey_byname (ctrl_t ctrl, enum get_pubkey_modes mode,
memset (&pk0, 0, sizeof pk0);
pk0.req_usage = pk? pk->req_usage : 0;
is_mbox = is_valid_mailbox (name);
if (!is_mbox && *name == '<' && name[1] && name[strlen(name)-1]=='>'
&& name[1] != '>'
&& is_valid_mailbox_mem (name+1, strlen (name)-2))
{
/* The mailbox is in the form "<foo@example.org>" which is not
* detected by is_valid_mailbox. Set the flag but keep name as
* it is because get_pubkey_byname does an is_valid_mailbox_mem
* itself. */
is_mbox = 1;
}
start_over:
if (ctx) /* Clear in case of a start over. */
{
@ -1384,8 +1407,7 @@ get_best_pubkey_byname (ctrl_t ctrl, enum get_pubkey_modes mode,
NULL, include_unusable);
if (err)
{
getkey_end (ctrl, ctx);
return err;
goto leave;
}
/* If the keyblock was retrieved from the local database and the key
@ -1530,10 +1552,13 @@ get_best_pubkey_byname (ctrl_t ctrl, enum get_pubkey_modes mode,
}
if (retctx && ctx)
*retctx = ctx;
else
getkey_end (ctrl, ctx);
{
*retctx = ctx;
ctx = NULL;
}
leave:
getkey_end (ctrl, ctx);
return err;
}