Find a PGP key by address.
376{
377 if (!a)
378 return NULL;
379
381
382 bool multi = false;
383
384 struct PgpKeyInfo *keys = NULL, *k = NULL, *kn = NULL;
385 struct PgpKeyInfo *the_strong_valid_key = NULL;
386 struct PgpKeyInfo *a_valid_addrmatch_key = NULL;
390
395
396 if (!oppenc_mode)
399
401
402 if (!keys)
403 return NULL;
404
407
408 for (k = keys; k; k = kn)
409 {
410 kn = k->next;
411
413
414 if (abilities && !(k->flags & abilities))
415 {
417 continue;
418 }
419
420 bool match = false;
421
422 for (q = k->address; q; q = q->
next)
423 {
428 {
430
432 match = true;
433
435 {
437 {
438 if (the_strong_valid_key && (the_strong_valid_key != k))
439 multi = true;
440 the_strong_valid_key = k;
441 }
442 else
443 {
444 a_valid_addrmatch_key = k;
445 }
446 }
447 }
448
450 }
451
452 if (match)
453 {
457 }
458 }
459
461
462 if (matches)
463 {
464 if (oppenc_mode || !isatty(STDIN_FILENO))
465 {
466 const bool c_crypt_opportunistic_encrypt_strong_keys =
468 if (the_strong_valid_key)
469 {
471 k = the_strong_valid_key;
472 }
473 else if (a_valid_addrmatch_key && !c_crypt_opportunistic_encrypt_strong_keys)
474 {
476 k = a_valid_addrmatch_key;
477 }
478 else
479 {
480 k = NULL;
481 }
482 }
483 else if (the_strong_valid_key && !multi)
484 {
485
486
488 k = the_strong_valid_key;
489 }
490 else
491 {
492
494 if (k)
496 }
497
499
500 return k;
501 }
502
503 return NULL;
504}
void mutt_addrlist_clear(struct AddressList *al)
Unlink and free all Address in an AddressList.
int mutt_addrlist_parse(struct AddressList *al, const char *s)
Parse a list of email addresses.
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
struct PgpKeyInfo * pgp_get_candidates(enum PgpRing keyring, struct ListHead *hints)
Find PGP keys matching a list of hints.
struct PgpKeyInfo * dlg_pgp(struct PgpKeyInfo *keys, struct Address *p, const char *s)
Let the user select a key to use -.
#define mutt_message(...)
#define mutt_debug(LEVEL,...)
void mutt_list_free(struct ListHead *h)
Free a List AND its strings.
@ LL_DEBUG3
Log at debug level 3.
@ LL_DEBUG5
Log at debug level 5.
char * pgp_keyid(struct PgpKeyInfo *k)
Get the ID of the main (parent) key.
static void pgp_add_string_to_hints(const char *str, struct ListHead *hints)
Split a string and add the parts to a List.
static PgpKeyValidFlags pgp_id_matches_addr(struct Address *addr, struct Address *u_addr, struct PgpUid *uid)
Does the key ID match the address.
static struct PgpKeyInfo ** pgp_get_lastp(struct PgpKeyInfo *p)
Get the last PGP key in a list.
void pgp_key_free(struct PgpKeyInfo **kpp)
Free a PGP key info.
struct PgpKeyInfo * pgp_remove_key(struct PgpKeyInfo **klist, struct PgpKeyInfo *key)
Remove a PGP key from a list.
#define TAILQ_FOREACH(var, head, field)
#define STAILQ_HEAD_INITIALIZER(head)
#define TAILQ_HEAD_INITIALIZER(head)
Container for Accounts, Notifications.
struct ConfigSubset * sub
Inherited config items.
char * addr
Email address.
struct PgpUid * next
Linked list.