core: Treat email-only user IDs with upper case letters as email address

* src/key.c (_gpgme_key_append_name): Support email-only user IDs with
upper case letters.

* tests/gpg/t-keylist.c (struct key_info_s): Add algo, length, sec_algo,
sec_length.
(keys): Add expected algo and length for primary and secondary subkeys.
(main): Factor out code for checking a key and the code for the keylist
test. Call the factored out test function and a new test function.
(check_key, test_keylist, key_with_email_only_user_id,
key_info_email_only_user_id,
test_email_only_user_id_with_upper_case_letters): New.
--

Email-only user IDs with upper case letters are now also parsed as a
user ID with empty name and the complete user ID as email.

GnuPG-bug-id: 7280
This commit is contained in:
Ingo Klöcker 2024-09-04 14:31:12 +02:00
parent ecd0c86d62
commit 2264b64b85
No known key found for this signature in database
GPG Key ID: F5A5D1692277A1E9
2 changed files with 557 additions and 420 deletions

View File

@ -237,12 +237,24 @@ _gpgme_key_append_name (gpgme_key_t key, const char *src, int convert)
uid->address = _gpgme_mailbox_from_userid (uid->uid); uid->address = _gpgme_mailbox_from_userid (uid->uid);
if ((!uid->email || !*uid->email) && uid->address && uid->name if ((!uid->email || !*uid->email) && uid->address && uid->name
&& !strcmp (uid->name, uid->address)) && !strcasecmp (uid->name, uid->address))
{ {
/* Name and address are the same. This is a mailbox only key. /* Name and address are the same except that some letters may have
Use address as email and remove name. */ different case. This is a mailbox only key. */
*uid->name = '\0'; if (!strcmp (uid->name, uid->address))
uid->email = uid->address; {
/* Name and address are the identical. Use address as email
and remove name. */
*uid->name = '\0';
uid->email = uid->address;
}
else
{
/* Name and address are the same except for different case of
some letters. Use name as email and point name to EOS. */
uid->email = uid->name;
uid->name = (dst - 1);
}
} }
if (!key->uids) if (!key->uids)

File diff suppressed because it is too large Load Diff