aboutsummaryrefslogtreecommitdiffstats
path: root/dirmngr
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2014-03-17 14:39:33 +0000
committerWerner Koch <[email protected]>2014-03-17 14:39:33 +0000
commit1e2e39c5758ffaf62f8bb85b4a86dc49c41f3a68 (patch)
tree9e5621516371bdb453a22c2d5040de6f847c8e1f /dirmngr
parentgpg: New mechanism "clear" for --auto-key-locate. (diff)
downloadgnupg-1e2e39c5758ffaf62f8bb85b4a86dc49c41f3a68.tar.gz
gnupg-1e2e39c5758ffaf62f8bb85b4a86dc49c41f3a68.zip
gpg: Make --auto-key-locate work again with keyservers.
* dirmngr/ks-engine-hkp.c (ks_hkp_get): Allow exact search mode. * g10/keyserver.c (keyserver_import_name): Implement. (keyserver_get): Use exact mode for name based import. (keyserver_get): Add args R_FPR and R_FPRLEN. Change all callers.
Diffstat (limited to 'dirmngr')
-rw-r--r--dirmngr/ks-engine-hkp.c30
-rw-r--r--dirmngr/server.c3
2 files changed, 26 insertions, 7 deletions
diff --git a/dirmngr/ks-engine-hkp.c b/dirmngr/ks-engine-hkp.c
index 7b67302ab..e485e6288 100644
--- a/dirmngr/ks-engine-hkp.c
+++ b/dirmngr/ks-engine-hkp.c
@@ -1040,7 +1040,9 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp)
{
gpg_error_t err;
KEYDB_SEARCH_DESC desc;
- char kidbuf[40+1];
+ char kidbuf[2+40+1];
+ const char *exactname = NULL;
+ char *searchkey = NULL;
char *hostport = NULL;
char *request = NULL;
estream_t fp = NULL;
@@ -1060,16 +1062,22 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp)
switch (desc.mode)
{
case KEYDB_SEARCH_MODE_SHORT_KID:
- snprintf (kidbuf, sizeof kidbuf, "%08lX", (ulong)desc.u.kid[1]);
+ snprintf (kidbuf, sizeof kidbuf, "0x%08lX", (ulong)desc.u.kid[1]);
break;
case KEYDB_SEARCH_MODE_LONG_KID:
- snprintf (kidbuf, sizeof kidbuf, "%08lX%08lX",
+ snprintf (kidbuf, sizeof kidbuf, "0x%08lX%08lX",
(ulong)desc.u.kid[0], (ulong)desc.u.kid[1]);
break;
case KEYDB_SEARCH_MODE_FPR20:
case KEYDB_SEARCH_MODE_FPR:
/* This is a v4 fingerprint. */
- bin2hex (desc.u.fpr, 20, kidbuf);
+ kidbuf[0] = '0';
+ kidbuf[1] = 'x';
+ bin2hex (desc.u.fpr, 20, kidbuf+2);
+ break;
+
+ case KEYDB_SEARCH_MODE_EXACT:
+ exactname = desc.u.name;
break;
case KEYDB_SEARCH_MODE_FPR16:
@@ -1078,6 +1086,14 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp)
return gpg_error (GPG_ERR_INV_USER_ID);
}
+ searchkey = http_escape_string (exactname? exactname : kidbuf,
+ EXTRA_ESCAPE_CHARS);
+ if (!searchkey)
+ {
+ err = gpg_error_from_syserror ();
+ goto leave;
+ }
+
reselect = 0;
again:
/* Build the request string. */
@@ -1092,8 +1108,9 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp)
xfree (request);
request = strconcat (hostport,
- "/pks/lookup?op=get&options=mr&search=0x",
- kidbuf,
+ "/pks/lookup?op=get&options=mr&search=",
+ searchkey,
+ exactname? "&exact=on":"",
NULL);
if (!request)
{
@@ -1123,6 +1140,7 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp)
es_fclose (fp);
xfree (request);
xfree (hostport);
+ xfree (searchkey);
return err;
}
diff --git a/dirmngr/server.c b/dirmngr/server.c
index f1319ad28..bdfb755d3 100644
--- a/dirmngr/server.c
+++ b/dirmngr/server.c
@@ -1603,7 +1603,8 @@ static const char hlp_ks_get[] =
"KS_GET {<pattern>}\n"
"\n"
"Get the keys matching PATTERN from the configured OpenPGP keyservers\n"
- "(see command KEYSERVER). Each pattern should be a keyid or a fingerprint";
+ "(see command KEYSERVER). Each pattern should be a keyid, a fingerprint,\n"
+ "or an exact name indicastes by the '=' prefix.";
static gpg_error_t
cmd_ks_get (assuan_context_t ctx, char *line)
{