summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2014-08-12 10:36:30 +0200
committerAndre Heinecke <aheinecke@intevation.de>2014-08-12 18:54:16 +0200
commit7a0e7f93f727e82d9404655b96abb0a8558cb2e5 (patch)
treebdd2fb272964b8014635d0fb80c372b1daf4543a
parent998e454a320db77361feddf0dcc5ba39ebd9a49b (diff)
downloadgpgme-1.4-branch.tar.gz
Handle modern keyserver output which may emit the fingerprint.gpgme-1.4-branch
* src/engine-gpg.c (read_colon_line): Split preprocessed lines. (gpg_keylist_preprocess): Limit keyid field and print fingerprint.
-rw-r--r--src/engine-gpg.c53
1 files changed, 44 insertions, 9 deletions
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index 36f035ac..924ba446 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -1237,10 +1237,26 @@ read_colon_line (engine_gpg_t gpg)
}
assert (gpg->colon.fnc);
- gpg->colon.fnc (gpg->colon.fnc_value, line ? line : buffer);
- if (line)
- free (line);
- }
+ if (line)
+ {
+ char *linep = line;
+ char *endp;
+
+ do
+ {
+ endp = strchr (linep, '\n');
+ if (endp)
+ *endp++ = 0;
+ gpg->colon.fnc (gpg->colon.fnc_value, linep);
+ linep = endp;
+ }
+ while (linep && *linep);
+
+ free (line);
+ }
+ else
+ gpg->colon.fnc (gpg->colon.fnc_value, buffer);
+ }
/* To reuse the buffer for the next line we have to
shift the remaining data to the buffer start and
@@ -2059,6 +2075,7 @@ gpg_keylist_preprocess (char *line, char **r_line)
#define NR_FIELDS 16
char *field[NR_FIELDS];
int fields = 0;
+ size_t n;
*r_line = NULL;
@@ -2094,16 +2111,34 @@ gpg_keylist_preprocess (char *line, char **r_line)
pub:<keyid>:<algo>:<keylen>:<creationdate>:<expirationdate>:<flags>
as defined in 5.2. Machine Readable Indexes of the OpenPGP
- HTTP Keyserver Protocol (draft).
+ HTTP Keyserver Protocol (draft). Modern versions of the SKS
+ keyserver return the fingerprint instead of the keyid. We
+ detect this here and use the v4 fingerprint format to convert
+ it to a key id.
We want:
pub:o<flags>:<keylen>:<algo>:<keyid>:<creatdate>:<expdate>::::::::
*/
- if (asprintf (r_line, "pub:o%s:%s:%s:%s:%s:%s::::::::",
- field[6], field[3], field[2], field[1],
- field[4], field[5]) < 0)
- return gpg_error_from_syserror ();
+ n = strlen (field[1]);
+ if (n > 16)
+ {
+ if (asprintf (r_line,
+ "pub:o%s:%s:%s:%s:%s:%s::::::::\n"
+ "fpr:::::::::%s:",
+ field[6], field[3], field[2], field[1] + n - 16,
+ field[4], field[5], field[1]) < 0)
+ return gpg_error_from_syserror ();
+ }
+ else
+ {
+ if (asprintf (r_line,
+ "pub:o%s:%s:%s:%s:%s:%s::::::::",
+ field[6], field[3], field[2], field[1],
+ field[4], field[5]) < 0)
+ return gpg_error_from_syserror ();
+ }
+
return 0;
case RT_UID: