diff options
author | Werner Koch <[email protected]> | 2014-03-17 14:39:33 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2014-03-17 14:39:33 +0000 |
commit | 1e2e39c5758ffaf62f8bb85b4a86dc49c41f3a68 (patch) | |
tree | 9e5621516371bdb453a22c2d5040de6f847c8e1f /dirmngr | |
parent | gpg: New mechanism "clear" for --auto-key-locate. (diff) | |
download | gnupg-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.c | 30 | ||||
-rw-r--r-- | dirmngr/server.c | 3 |
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) { |