Find a PGP key by address.
359{
360 if (!a)
361 return NULL;
362
364
365 bool multi = false;
366
367 struct PgpKeyInfo *keys = NULL, *k = NULL, *kn = NULL;
368 struct PgpKeyInfo *the_strong_valid_key = NULL;
369 struct PgpKeyInfo *a_valid_addrmatch_key = NULL;
373
378
379 if (!oppenc_mode)
382
384
385 if (!keys)
386 return NULL;
387
390
391 for (k = keys; k; k = kn)
392 {
393 kn = k->next;
394
396
397 if (abilities && !(k->flags & abilities))
398 {
400 continue;
401 }
402
403 bool match = false;
404
405 for (q = k->address; q; q = q->
next)
406 {
411 {
413
415 match = true;
416
418 {
420 {
421 if (the_strong_valid_key && (the_strong_valid_key != k))
422 multi = true;
423 the_strong_valid_key = k;
424 }
425 else
426 {
427 a_valid_addrmatch_key = k;
428 }
429 }
430 }
431
433 }
434
435 if (match)
436 {
440 }
441 }
442
444
445 if (matches)
446 {
447 if (oppenc_mode)
448 {
449 const bool c_crypt_opportunistic_encrypt_strong_keys =
451 if (the_strong_valid_key)
452 {
454 k = the_strong_valid_key;
455 }
456 else if (a_valid_addrmatch_key && !c_crypt_opportunistic_encrypt_strong_keys)
457 {
459 k = a_valid_addrmatch_key;
460 }
461 else
462 {
463 k = NULL;
464 }
465 }
466 else if (the_strong_valid_key && !multi)
467 {
468
469
471 k = the_strong_valid_key;
472 }
473 else
474 {
475
477 if (k)
479 }
480
482
483 return k;
484 }
485
486 return NULL;
487}
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,...)
struct ListNode * mutt_list_insert_tail(struct ListHead *h, char *s)
Append a string to the end of a List.
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.
#define PGP_KV_STRONGID
PGP Key is strong.
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.
#define PGP_KV_VALID
PGP Key ID is valid.
#define PGP_KV_ADDR
PGP Key address is valid.
static struct PgpKeyInfo ** pgp_get_lastp(struct PgpKeyInfo *p)
Get the last PGP key in a list.
uint8_t PgpKeyValidFlags
Flags for valid Pgp Key fields, e.g. PGP_KV_VALID.
struct PgpKeyInfo * pgp_principal_key(struct PgpKeyInfo *key)
Get the main (parent) PGP key.
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)
struct Buffer * personal
Real name of address.
struct Buffer * mailbox
Mailbox and host address.
Container for Accounts, Notifications.
struct ConfigSubset * sub
Inherited config items.
struct PgpUid * next
Linked list.