Find a PGP key by address.
377{
378 if (!a)
379 return NULL;
380
382
383 bool multi = false;
384
385 struct PgpKeyInfo *keys = NULL, *k = NULL, *kn = NULL;
386 struct PgpKeyInfo *the_strong_valid_key = NULL;
387 struct PgpKeyInfo *a_valid_addrmatch_key = NULL;
391
396
397 if (!oppenc_mode)
400
402
403 if (!keys)
404 return NULL;
405
408
409 for (k = keys; k; k = kn)
410 {
411 kn = k->next;
412
414
415 if (abilities && !(k->flags & abilities))
416 {
418 continue;
419 }
420
421 bool match = false;
422
423 for (q = k->address; q; q = q->
next)
424 {
429 {
431
433 match = true;
434
436 {
438 {
439 if (the_strong_valid_key && (the_strong_valid_key != k))
440 multi = true;
441 the_strong_valid_key = k;
442 }
443 else
444 {
445 a_valid_addrmatch_key = k;
446 }
447 }
448 }
449
451 }
452
453 if (match)
454 {
458 }
459 }
460
462
463 if (matches)
464 {
465 if (oppenc_mode || !isatty(STDIN_FILENO))
466 {
467 const bool c_crypt_opportunistic_encrypt_strong_keys =
469 if (the_strong_valid_key)
470 {
472 k = the_strong_valid_key;
473 }
474 else if (a_valid_addrmatch_key && !c_crypt_opportunistic_encrypt_strong_keys)
475 {
477 k = a_valid_addrmatch_key;
478 }
479 else
480 {
481 k = NULL;
482 }
483 }
484 else if (the_strong_valid_key && !multi)
485 {
486
487
489 k = the_strong_valid_key;
490 }
491 else
492 {
493
495 if (k)
497 }
498
500
501 return k;
502 }
503
504 return NULL;
505}
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.
struct PgpUid * next
Linked list.