dirmngr: Fix regression in KS_GET for mail address pattern.

* dirmngr/ks-engine-hkp.c (ks_hkp_search): Munge mail address pattern.
(ks_hkp_get): Allow for mail addresses.
-

Before the keyserver changes in 2.2.28 gpg passed dirmngr a pail
address as an exact pattern (e.g. "=foo@example.org").  Since 2.2.28
the mail address is detected gpg gpg and we see for example
"<foo@example.org>".  This patch fixes this to turn a mail address
into an exact match again.

GnuPG-bug-id: 5497
Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2021-06-21 09:22:17 +02:00
parent 8b6591c4c5
commit adf7bfba5d
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
1 changed files with 39 additions and 1 deletions

View File

@ -1440,6 +1440,7 @@ ks_hkp_search (ctrl_t ctrl, parsed_uri_t uri, const char *pattern,
gpg_error_t err;
KEYDB_SEARCH_DESC desc;
char fprbuf[2+40+1];
char *namebuffer = NULL;
char *hostport = NULL;
char *request = NULL;
estream_t fp = NULL;
@ -1463,10 +1464,26 @@ ks_hkp_search (ctrl_t ctrl, parsed_uri_t uri, const char *pattern,
{
case KEYDB_SEARCH_MODE_EXACT:
case KEYDB_SEARCH_MODE_SUBSTR:
case KEYDB_SEARCH_MODE_MAIL:
case KEYDB_SEARCH_MODE_MAILSUB:
pattern = desc.u.name;
break;
case KEYDB_SEARCH_MODE_MAIL:
namebuffer = xtrystrdup (desc.u.name);
if (!namebuffer)
{
err = gpg_error_from_syserror ();
goto leave;
}
/* Strip trailing angle bracket. */
if (namebuffer[0] && namebuffer[1]
&& namebuffer[strlen (namebuffer)-1] == '>')
namebuffer[strlen(namebuffer)-1] = 0;
/* Strip optional leading angle bracket. */
if (*namebuffer == '<' && namebuffer[1])
pattern = namebuffer + 1;
else
pattern = namebuffer;
break;
case KEYDB_SEARCH_MODE_SHORT_KID:
snprintf (fprbuf, sizeof fprbuf, "0x%08lX", (ulong)desc.u.kid[1]);
pattern = fprbuf;
@ -1577,6 +1594,7 @@ ks_hkp_search (ctrl_t ctrl, parsed_uri_t uri, const char *pattern,
xfree (request);
xfree (hostport);
xfree (httphost);
xfree (namebuffer);
return err;
}
@ -1592,6 +1610,7 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp)
KEYDB_SEARCH_DESC desc;
char kidbuf[2+40+1];
const char *exactname = NULL;
char *namebuffer = NULL;
char *searchkey = NULL;
char *hostport = NULL;
char *request = NULL;
@ -1633,6 +1652,24 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp)
exactname = desc.u.name;
break;
case KEYDB_SEARCH_MODE_MAIL:
namebuffer = xtrystrdup (desc.u.name);
if (!namebuffer)
{
err = gpg_error_from_syserror ();
goto leave;
}
/* Strip trailing angle bracket. */
if (namebuffer[0] && namebuffer[1]
&& namebuffer[strlen (namebuffer)-1] == '>')
namebuffer[strlen(namebuffer)-1] = 0;
/* Strip optional leading angle bracket. */
if (*namebuffer == '<' && namebuffer[1])
exactname = namebuffer + 1;
else
exactname = namebuffer;
break;
case KEYDB_SEARCH_MODE_FPR16:
log_error ("HKP keyservers do not support v3 fingerprints\n");
/* fall through */
@ -1697,6 +1734,7 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp)
leave:
es_fclose (fp);
xfree (namebuffer);
xfree (request);
xfree (hostport);
xfree (httphost);