Handle modern keyserver output which may emit the fingerprint.
* src/engine-gpg.c (read_colon_line): Split preprocessed lines. (gpg_keylist_preprocess): Limit keyid field and print fingerprint.
This commit is contained in:
parent
998e454a32
commit
7a0e7f93f7
@ -1237,10 +1237,26 @@ read_colon_line (engine_gpg_t gpg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert (gpg->colon.fnc);
|
assert (gpg->colon.fnc);
|
||||||
gpg->colon.fnc (gpg->colon.fnc_value, line ? line : buffer);
|
|
||||||
if (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);
|
free (line);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
gpg->colon.fnc (gpg->colon.fnc_value, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
/* To reuse the buffer for the next line we have to
|
/* To reuse the buffer for the next line we have to
|
||||||
shift the remaining data to the buffer start and
|
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
|
#define NR_FIELDS 16
|
||||||
char *field[NR_FIELDS];
|
char *field[NR_FIELDS];
|
||||||
int fields = 0;
|
int fields = 0;
|
||||||
|
size_t n;
|
||||||
|
|
||||||
*r_line = NULL;
|
*r_line = NULL;
|
||||||
|
|
||||||
@ -2094,16 +2111,34 @@ gpg_keylist_preprocess (char *line, char **r_line)
|
|||||||
pub:<keyid>:<algo>:<keylen>:<creationdate>:<expirationdate>:<flags>
|
pub:<keyid>:<algo>:<keylen>:<creationdate>:<expirationdate>:<flags>
|
||||||
|
|
||||||
as defined in 5.2. Machine Readable Indexes of the OpenPGP
|
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:
|
We want:
|
||||||
pub:o<flags>:<keylen>:<algo>:<keyid>:<creatdate>:<expdate>::::::::
|
pub:o<flags>:<keylen>:<algo>:<keyid>:<creatdate>:<expdate>::::::::
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (asprintf (r_line, "pub:o%s:%s:%s:%s:%s:%s::::::::",
|
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[6], field[3], field[2], field[1],
|
||||||
field[4], field[5]) < 0)
|
field[4], field[5]) < 0)
|
||||||
return gpg_error_from_syserror ();
|
return gpg_error_from_syserror ();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case RT_UID:
|
case RT_UID:
|
||||||
|
Loading…
Reference in New Issue
Block a user