summaryrefslogtreecommitdiffstats
path: root/g10/keylist.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2016-09-12 17:42:50 +0200
committerWerner Koch <wk@gnupg.org>2016-09-12 17:45:01 +0200
commit31fc420727f45dd081f8ad5d056da6675dad29f2 (patch)
tree2475b9ddf076c416ab13dc1a11219a0468026958 /g10/keylist.c
parenttests: Simplify tofu test. (diff)
downloadgnupg2-31fc420727f45dd081f8ad5d056da6675dad29f2.tar.xz
gnupg2-31fc420727f45dd081f8ad5d056da6675dad29f2.zip
gpg: Avoid mixing up status and colon line output.
* g10/keylist.c (list_keyblock_colon): Avoid calling functions which trigger a status line output before having printed a LF. -- Status lines like KEY_CONSIDERED and KEYEPXIRED were messing up the colons output, like here: pub:[GNUPG:] KEY_CONSIDERED 94A5C9A03C2FE5CA3B095D8E1FDF723CF46[...] Reported-by: Andreas Stieger <astieger@suse.com> Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'g10/keylist.c')
-rw-r--r--g10/keylist.c83
1 files changed, 47 insertions, 36 deletions
diff --git a/g10/keylist.c b/g10/keylist.c
index dea9b171e..bef1e0775 100644
--- a/g10/keylist.c
+++ b/g10/keylist.c
@@ -1183,9 +1183,10 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
PKT_public_key *pk;
u32 keyid[2];
int trustletter = 0;
+ int trustletter_print;
+ int ownertrust_print;
int ulti_hack = 0;
int i;
- char *p;
char *hexgrip_buffer = NULL;
const char *hexgrip = NULL;
char *serialno = NULL;
@@ -1217,31 +1218,38 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
stubkey = 1; /* Key not found. */
keyid_from_pk (pk, keyid);
- es_fputs (secret? "sec:":"pub:", es_stdout);
if (!pk->flags.valid)
- es_putc ('i', es_stdout);
+ trustletter_print = 'i';
else if (pk->flags.revoked)
- es_putc ('r', es_stdout);
+ trustletter_print = 'r';
else if (pk->has_expired)
- es_putc ('e', es_stdout);
+ trustletter_print = 'e';
else if (opt.fast_list_mode || opt.no_expensive_trust_checks)
- ;
+ trustletter_print = 0;
else
{
trustletter = get_validity_info (ctrl, pk, NULL);
if (trustletter == 'u')
ulti_hack = 1;
- es_putc (trustletter, es_stdout);
+ trustletter_print = trustletter;
}
+ if (!opt.fast_list_mode && !opt.no_expensive_trust_checks)
+ ownertrust_print = get_ownertrust_info (pk);
+ else
+ ownertrust_print = 0;
+
+ es_fputs (secret? "sec:":"pub:", es_stdout);
+ if (trustletter_print)
+ es_putc (trustletter_print, es_stdout);
es_fprintf (es_stdout, ":%u:%d:%08lX%08lX:%s:%s::",
nbits_from_pk (pk),
pk->pubkey_algo,
(ulong) keyid[0], (ulong) keyid[1],
colon_datestr_from_pk (pk), colon_strtime (pk->expiredate));
- if (!opt.fast_list_mode && !opt.no_expensive_trust_checks)
- es_putc (get_ownertrust_info (pk), es_stdout);
+ if (ownertrust_print)
+ es_putc (ownertrust_print, es_stdout);
es_putc (':', es_stdout);
es_putc (':', es_stdout);
@@ -1286,31 +1294,27 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
{
if (node->pkt->pkttype == PKT_USER_ID)
{
- char *str;
PKT_user_id *uid = node->pkt->pkt.user_id;
+ int uid_validity;
if (attrib_fp && uid->attrib_data != NULL)
dump_attribs (uid, pk);
- /*
- * Fixme: We need a valid flag here too
- */
- str = uid->attrib_data ? "uat" : "uid";
+
if (uid->is_revoked)
- es_fprintf (es_stdout, "%s:r::::", str);
+ uid_validity = 'r';
else if (uid->is_expired)
- es_fprintf (es_stdout, "%s:e::::", str);
+ uid_validity = 'e';
else if (opt.no_expensive_trust_checks)
- es_fprintf (es_stdout, "%s:::::", str);
- else
- {
- int uid_validity;
+ uid_validity = 0;
+ else if (ulti_hack)
+ uid_validity = 'u';
+ else
+ uid_validity = get_validity_info (ctrl, pk, uid);
- if (!ulti_hack)
- uid_validity = get_validity_info (ctrl, pk, uid);
- else
- uid_validity = 'u';
- es_fprintf (es_stdout, "%s:%c::::", str, uid_validity);
- }
+ es_fputs (uid->attrib_data? "uat:":"uid:", es_stdout);
+ if (uid_validity)
+ es_putc (uid_validity, es_stdout);
+ es_fputs ("::::", es_stdout);
es_fprintf (es_stdout, "%s:", colon_strtime (uid->created));
es_fprintf (es_stdout, "%s:", colon_strtime (uid->expiredate));
@@ -1423,6 +1427,8 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
char *sigstr;
size_t fplen;
byte fparray[MAX_FINGERPRINT_LEN];
+ char *siguid;
+ size_t siguidlen;
if (sig->sig_class == 0x20 || sig->sig_class == 0x28
|| sig->sig_class == 0x30)
@@ -1482,6 +1488,16 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
rc = 0;
sigrc = ' ';
}
+
+ if (sigrc != '%' && sigrc != '?' && !opt.fast_list_mode)
+ siguid = get_user_id (sig->keyid, &siguidlen);
+ else
+ {
+ siguid = NULL;
+ siguidlen = 0;
+ }
+
+
es_fputs (sigstr, es_stdout);
es_putc (':', es_stdout);
if (sigrc != ' ')
@@ -1502,17 +1518,11 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
if (sigrc == '%')
es_fprintf (es_stdout, "[%s] ", gpg_strerror (rc));
- else if (sigrc == '?')
- ;
- else if (!opt.fast_list_mode)
- {
- size_t n;
- p = get_user_id (sig->keyid, &n);
- es_write_sanitized (es_stdout, p, n, ":", NULL);
- xfree (p);
- }
+ else if (siguid)
+ es_write_sanitized (es_stdout, siguid, siguidlen, ":", NULL);
+
es_fprintf (es_stdout, ":%02x%c::", sig->sig_class,
- sig->flags.exportable ? 'x' : 'l');
+ sig->flags.exportable ? 'x' : 'l');
if (opt.no_sig_cache && opt.check_sigs && fprokay)
{
@@ -1526,6 +1536,7 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
print_subpackets_colon (sig);
/* fixme: check or list other sigs here */
+ xfree (siguid);
}
}