mirror of
git://git.gnupg.org/gnupg.git
synced 2025-04-17 15:44:34 +02:00
g10: On a TOFU conflict, show whether the uids are expired or revoked
* g10/tofu.c (struct signature_stats): Add fields is_expired and is_revoked. (signature_stats_prepend): Clear *stats when allocating it. (ask_about_binding): Also show whether the user ids are expired or revoked. -- Signed-off-by: Neal H. Walfield <neal@g10code.com>
This commit is contained in:
parent
b69b2cb082
commit
edfb6934ca
107
g10/tofu.c
107
g10/tofu.c
@ -111,6 +111,7 @@ struct tofu_dbs_s
|
|||||||
|
|
||||||
/* Local prototypes. */
|
/* Local prototypes. */
|
||||||
static gpg_error_t end_transaction (ctrl_t ctrl, int only_batch);
|
static gpg_error_t end_transaction (ctrl_t ctrl, int only_batch);
|
||||||
|
static char *email_from_user_id (const char *user_id);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -913,6 +914,10 @@ struct signature_stats
|
|||||||
/* Number of signatures during this time. */
|
/* Number of signatures during this time. */
|
||||||
unsigned long count;
|
unsigned long count;
|
||||||
|
|
||||||
|
/* If the corresponding key/user id has been expired / revoked. */
|
||||||
|
int is_expired;
|
||||||
|
int is_revoked;
|
||||||
|
|
||||||
/* The key that generated this signature. */
|
/* The key that generated this signature. */
|
||||||
char fingerprint[1];
|
char fingerprint[1];
|
||||||
};
|
};
|
||||||
@ -936,7 +941,7 @@ signature_stats_prepend (struct signature_stats **statsp,
|
|||||||
unsigned long count)
|
unsigned long count)
|
||||||
{
|
{
|
||||||
struct signature_stats *stats =
|
struct signature_stats *stats =
|
||||||
xmalloc (sizeof (*stats) + strlen (fingerprint));
|
xmalloc_clear (sizeof (*stats) + strlen (fingerprint));
|
||||||
|
|
||||||
stats->next = *statsp;
|
stats->next = *statsp;
|
||||||
*statsp = stats;
|
*statsp = stats;
|
||||||
@ -1324,6 +1329,7 @@ ask_about_binding (tofu_dbs_t dbs,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
KEYDB_HANDLE hd;
|
||||||
char *key = NULL;
|
char *key = NULL;
|
||||||
|
|
||||||
if (! stats || strcmp (stats->fingerprint, fingerprint))
|
if (! stats || strcmp (stats->fingerprint, fingerprint))
|
||||||
@ -1335,6 +1341,93 @@ ask_about_binding (tofu_dbs_t dbs,
|
|||||||
signature_stats_prepend (&stats, fingerprint, TOFU_POLICY_AUTO, 0, 0);
|
signature_stats_prepend (&stats, fingerprint, TOFU_POLICY_AUTO, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Figure out which user ids are revoked or expired. */
|
||||||
|
hd = keydb_new ();
|
||||||
|
for (stats_iter = stats; stats_iter; stats_iter = stats_iter->next)
|
||||||
|
{
|
||||||
|
KEYDB_SEARCH_DESC desc;
|
||||||
|
kbnode_t kb;
|
||||||
|
PKT_public_key *pk;
|
||||||
|
kbnode_t n;
|
||||||
|
int found_user_id;
|
||||||
|
|
||||||
|
rc = keydb_search_reset (hd);
|
||||||
|
if (rc)
|
||||||
|
{
|
||||||
|
log_error (_("resetting keydb: %s\n"),
|
||||||
|
gpg_strerror (rc));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = classify_user_id (stats_iter->fingerprint, &desc, 0);
|
||||||
|
if (rc)
|
||||||
|
{
|
||||||
|
log_error (_("error parsing key specification '%s': %s\n"),
|
||||||
|
stats_iter->fingerprint, gpg_strerror (rc));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = keydb_search (hd, &desc, 1, NULL);
|
||||||
|
if (rc)
|
||||||
|
{
|
||||||
|
log_error (_("key \"%s\" not found: %s\n"),
|
||||||
|
stats_iter->fingerprint,
|
||||||
|
gpg_strerror (rc));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = keydb_get_keyblock (hd, &kb);
|
||||||
|
if (rc)
|
||||||
|
{
|
||||||
|
log_error (_("error reading keyblock: %s\n"),
|
||||||
|
gpg_strerror (rc));
|
||||||
|
print_further_info ("fingerprint: %s", stats_iter->fingerprint);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
merge_keys_and_selfsig (kb);
|
||||||
|
|
||||||
|
log_assert (kb->pkt->pkttype == PKT_PUBLIC_KEY);
|
||||||
|
pk = kb->pkt->pkt.public_key;
|
||||||
|
|
||||||
|
if (pk->has_expired)
|
||||||
|
stats_iter->is_expired = 1;
|
||||||
|
if (pk->flags.revoked)
|
||||||
|
stats_iter->is_revoked = 1;
|
||||||
|
|
||||||
|
n = kb;
|
||||||
|
found_user_id = 0;
|
||||||
|
while ((n = find_next_kbnode (n, PKT_USER_ID)) && ! found_user_id)
|
||||||
|
{
|
||||||
|
PKT_user_id *user_id2 = n->pkt->pkt.user_id;
|
||||||
|
char *email2;
|
||||||
|
|
||||||
|
if (user_id2->attrib_data)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
email2 = email_from_user_id (user_id2->name);
|
||||||
|
|
||||||
|
if (strcmp (email, email2) == 0)
|
||||||
|
{
|
||||||
|
found_user_id = 1;
|
||||||
|
|
||||||
|
if (user_id2->is_revoked)
|
||||||
|
stats_iter->is_revoked = 1;
|
||||||
|
if (user_id2->is_expired)
|
||||||
|
stats_iter->is_expired = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
xfree (email2);
|
||||||
|
}
|
||||||
|
release_kbnode (kb);
|
||||||
|
|
||||||
|
if (! found_user_id)
|
||||||
|
log_info (_("TOFU db may be corrupted: user id (%s)"
|
||||||
|
" not on key block (%s)\n"),
|
||||||
|
email, fingerprint);
|
||||||
|
}
|
||||||
|
keydb_release (hd);
|
||||||
|
|
||||||
es_fprintf (fp, _("Statistics for keys with the email address \"%s\":\n"),
|
es_fprintf (fp, _("Statistics for keys with the email address \"%s\":\n"),
|
||||||
email);
|
email);
|
||||||
for (stats_iter = stats; stats_iter; stats_iter = stats_iter->next)
|
for (stats_iter = stats; stats_iter; stats_iter = stats_iter->next)
|
||||||
@ -1348,6 +1441,18 @@ ask_about_binding (tofu_dbs_t dbs,
|
|||||||
this_key = strcmp (key, fingerprint) == 0;
|
this_key = strcmp (key, fingerprint) == 0;
|
||||||
key_pp = format_hexfingerprint (key, NULL, 0);
|
key_pp = format_hexfingerprint (key, NULL, 0);
|
||||||
es_fprintf (fp, " %s (", key_pp);
|
es_fprintf (fp, " %s (", key_pp);
|
||||||
|
|
||||||
|
if (stats_iter->is_revoked)
|
||||||
|
{
|
||||||
|
es_fprintf (fp, _("revoked"));
|
||||||
|
es_fprintf (fp, _(", "));
|
||||||
|
}
|
||||||
|
else if (stats_iter->is_expired)
|
||||||
|
{
|
||||||
|
es_fprintf (fp, _("expired"));
|
||||||
|
es_fprintf (fp, _(", "));
|
||||||
|
}
|
||||||
|
|
||||||
if (this_key)
|
if (this_key)
|
||||||
es_fprintf (fp, _("this key"));
|
es_fprintf (fp, _("this key"));
|
||||||
else
|
else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user