mirror of
git://git.gnupg.org/gnupg.git
synced 2025-04-17 15:44:34 +02:00
g10: Only show the TOFU warning once per key.
* g10/tofu.c (show_statistics): Return whether to call show_warning. Move the warning from here... (show_warning): ... to this new function. (tofu_get_validity): If show_statistics returns a non-zero value, call show_warning. -- Signed-off-by: Neal H. Walfield <neal@g10code.com>
This commit is contained in:
parent
875ac9216f
commit
67cef405cb
90
g10/tofu.c
90
g10/tofu.c
@ -2454,10 +2454,13 @@ write_stats_status (estream_t fp,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Note: If OUTFP is not NULL, this function merely prints a "tfs" record
|
/* Note: If OUTFP is not NULL, this function merely prints a "tfs" record
|
||||||
* to OUTFP. In this case USER_ID is not required. */
|
* to OUTFP. In this case USER_ID is not required.
|
||||||
static void
|
*
|
||||||
|
* Returns whether the caller should call show_warning after iterating
|
||||||
|
* over all user ids.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
show_statistics (tofu_dbs_t dbs, const char *fingerprint,
|
show_statistics (tofu_dbs_t dbs, const char *fingerprint,
|
||||||
const char *email, const char *user_id,
|
const char *email, const char *user_id,
|
||||||
estream_t outfp)
|
estream_t outfp)
|
||||||
@ -2477,6 +2480,8 @@ show_statistics (tofu_dbs_t dbs, const char *fingerprint,
|
|||||||
unsigned long encryption_most_recent = 0;
|
unsigned long encryption_most_recent = 0;
|
||||||
unsigned long encryption_count = 0;
|
unsigned long encryption_count = 0;
|
||||||
|
|
||||||
|
int show_warning = 0;
|
||||||
|
|
||||||
fingerprint_pp = format_hexfingerprint (fingerprint, NULL, 0);
|
fingerprint_pp = format_hexfingerprint (fingerprint, NULL, 0);
|
||||||
|
|
||||||
/* Get the signature stats. */
|
/* Get the signature stats. */
|
||||||
@ -2666,51 +2671,59 @@ show_statistics (tofu_dbs_t dbs, const char *fingerprint,
|
|||||||
&& (sqrtu32 (encryption_count) + sqrtu32 (signature_count)
|
&& (sqrtu32 (encryption_count) + sqrtu32 (signature_count)
|
||||||
< sqrtu32 (2 * BASIC_TRUST_THRESHOLD)))
|
< sqrtu32 (2 * BASIC_TRUST_THRESHOLD)))
|
||||||
{
|
{
|
||||||
char *set_policy_command;
|
|
||||||
char *text;
|
|
||||||
char *tmpmsg;
|
|
||||||
|
|
||||||
if (signature_count == 0)
|
if (signature_count == 0)
|
||||||
log_info (_("Warning: we have yet to see"
|
log_info (_("Warning: we have yet to see"
|
||||||
" a message signed by this key and user id!\n"));
|
" a message signed using this key and user id!\n"));
|
||||||
else if (signature_count == 1)
|
else if (signature_count == 1)
|
||||||
log_info (_("Warning: we've only seen a single message"
|
log_info (_("Warning: we've only seen a single message"
|
||||||
" signed by this key and user id!\n"));
|
" signed using this key and user id!\n"));
|
||||||
|
|
||||||
set_policy_command =
|
show_warning = 1;
|
||||||
xasprintf ("gpg --tofu-policy bad %s", fingerprint);
|
|
||||||
|
|
||||||
tmpmsg = xasprintf
|
|
||||||
(ngettext
|
|
||||||
("Warning: if you think you've seen more than %ld message "
|
|
||||||
"signed by this key and user id, then this key might be a "
|
|
||||||
"forgery! Carefully examine the email address for small "
|
|
||||||
"variations. If the key is suspect, then use\n"
|
|
||||||
" %s\n"
|
|
||||||
"to mark it as being bad.\n",
|
|
||||||
"Warning: if you think you've seen more than %ld messages "
|
|
||||||
"signed by this key, then this key might be a forgery! "
|
|
||||||
"Carefully examine the email address for small "
|
|
||||||
"variations. If the key is suspect, then use\n"
|
|
||||||
" %s\n"
|
|
||||||
"to mark it as being bad.\n",
|
|
||||||
signature_count),
|
|
||||||
signature_count, set_policy_command);
|
|
||||||
text = format_text (tmpmsg, 0, 72, 80);
|
|
||||||
xfree (tmpmsg);
|
|
||||||
log_string (GPGRT_LOG_INFO, text);
|
|
||||||
xfree (text);
|
|
||||||
|
|
||||||
es_free (set_policy_command);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
xfree (fingerprint_pp);
|
xfree (fingerprint_pp);
|
||||||
|
|
||||||
return;
|
return show_warning;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
show_warning (const char *fingerprint, strlist_t user_id_list)
|
||||||
|
{
|
||||||
|
char *set_policy_command;
|
||||||
|
char *text;
|
||||||
|
char *tmpmsg;
|
||||||
|
|
||||||
|
set_policy_command =
|
||||||
|
xasprintf ("gpg --tofu-policy bad %s", fingerprint);
|
||||||
|
|
||||||
|
tmpmsg = xasprintf
|
||||||
|
(ngettext
|
||||||
|
("Warning: if you think you've seen more signatures "
|
||||||
|
"by this key and user id, then this key might be a "
|
||||||
|
"forgery! Carefully examine the email address for small "
|
||||||
|
"variations. If the key is suspect, then use\n"
|
||||||
|
" %s\n"
|
||||||
|
"to mark it as being bad.\n",
|
||||||
|
"Warning: if you think you've seen more signatures "
|
||||||
|
"by this key and these user ids, then this key might be a "
|
||||||
|
"forgery! Carefully examine the email addresses for small "
|
||||||
|
"variations. If the key is suspect, then use\n"
|
||||||
|
" %s\n"
|
||||||
|
"to mark it as being bad.\n",
|
||||||
|
strlist_length (user_id_list)),
|
||||||
|
set_policy_command);
|
||||||
|
|
||||||
|
text = format_text (tmpmsg, 0, 72, 80);
|
||||||
|
xfree (tmpmsg);
|
||||||
|
log_string (GPGRT_LOG_INFO, text);
|
||||||
|
xfree (text);
|
||||||
|
|
||||||
|
es_free (set_policy_command);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Extract the email address from a user id and normalize it. If the
|
/* Extract the email address from a user id and normalize it. If the
|
||||||
user id doesn't contain an email address, then we use the whole
|
user id doesn't contain an email address, then we use the whole
|
||||||
user_id and normalize that. The returned string must be freed. */
|
user_id and normalize that. The returned string must be freed. */
|
||||||
@ -3120,6 +3133,7 @@ tofu_get_validity (ctrl_t ctrl, PKT_public_key *pk, strlist_t user_id_list,
|
|||||||
int trust_level = TRUST_UNKNOWN;
|
int trust_level = TRUST_UNKNOWN;
|
||||||
int bindings = 0;
|
int bindings = 0;
|
||||||
int bindings_valid = 0;
|
int bindings_valid = 0;
|
||||||
|
int need_warning = 0;
|
||||||
|
|
||||||
dbs = opendbs (ctrl);
|
dbs = opendbs (ctrl);
|
||||||
if (! dbs)
|
if (! dbs)
|
||||||
@ -3162,7 +3176,8 @@ tofu_get_validity (ctrl_t ctrl, PKT_public_key *pk, strlist_t user_id_list,
|
|||||||
bindings_valid ++;
|
bindings_valid ++;
|
||||||
|
|
||||||
if (may_ask && tl != TRUST_ULTIMATE && tl != TRUST_EXPIRED)
|
if (may_ask && tl != TRUST_ULTIMATE && tl != TRUST_EXPIRED)
|
||||||
show_statistics (dbs, fingerprint, email, user_id->d, NULL);
|
need_warning |=
|
||||||
|
show_statistics (dbs, fingerprint, email, user_id->d, NULL);
|
||||||
|
|
||||||
if (tl == TRUST_NEVER)
|
if (tl == TRUST_NEVER)
|
||||||
trust_level = TRUST_NEVER;
|
trust_level = TRUST_NEVER;
|
||||||
@ -3188,6 +3203,9 @@ tofu_get_validity (ctrl_t ctrl, PKT_public_key *pk, strlist_t user_id_list,
|
|||||||
xfree (email);
|
xfree (email);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (need_warning)
|
||||||
|
show_warning (fingerprint, user_id_list);
|
||||||
|
|
||||||
die:
|
die:
|
||||||
tofu_end_batch_update (ctrl);
|
tofu_end_batch_update (ctrl);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user