NeoMutt  2023-05-17-56-ga67199
Teaching an old dog new tricks
DOXYGEN
find_keys()

Find the keyids of the recipients of a message. More...

+ Collaboration diagram for find_keys():

Functions

char * pgp_gpgme_find_keys (const struct AddressList *addrlist, bool oppenc_mode)
 Implements CryptModuleSpecs::find_keys() -. More...
 
char * smime_gpgme_find_keys (const struct AddressList *addrlist, bool oppenc_mode)
 Implements CryptModuleSpecs::find_keys() -. More...
 
char * pgp_class_find_keys (const struct AddressList *addrlist, bool oppenc_mode)
 Implements CryptModuleSpecs::find_keys() -. More...
 
char * smime_class_find_keys (const struct AddressList *al, bool oppenc_mode)
 Implements CryptModuleSpecs::find_keys() -. More...
 

Detailed Description

Find the keyids of the recipients of a message.

Parameters
addrlistAddress List
oppenc_modeIf true, use opportunistic encryption
Return values
ptrSpace-separated string of keys
NULLAt least one of the keys can't be found

If oppenc_mode is true, only keys that can be determined without prompting will be used.

Function Documentation

◆ pgp_gpgme_find_keys()

char * pgp_gpgme_find_keys ( const struct AddressList *  addrlist,
bool  oppenc_mode 
)

Implements CryptModuleSpecs::find_keys() -.

Definition at line 3544 of file crypt_gpgme.c.

3545{
3546 return find_keys(addrlist, APPLICATION_PGP, oppenc_mode);
3547}
static char * find_keys(const struct AddressList *addrlist, unsigned int app, bool oppenc_mode)
Find keys of the recipients of the message.
Definition: crypt_gpgme.c:3419
#define APPLICATION_PGP
Use PGP to encrypt/sign.
Definition: lib.h:90
+ Here is the call graph for this function:

◆ smime_gpgme_find_keys()

char * smime_gpgme_find_keys ( const struct AddressList *  addrlist,
bool  oppenc_mode 
)

Implements CryptModuleSpecs::find_keys() -.

Definition at line 3552 of file crypt_gpgme.c.

3553{
3554 return find_keys(addrlist, APPLICATION_SMIME, oppenc_mode);
3555}
#define APPLICATION_SMIME
Use SMIME to encrypt/sign.
Definition: lib.h:91
+ Here is the call graph for this function:

◆ pgp_class_find_keys()

char * pgp_class_find_keys ( const struct AddressList *  addrlist,
bool  oppenc_mode 
)

Implements CryptModuleSpecs::find_keys() -.

Definition at line 1468 of file pgp.c.

1469{
1470 struct ListHead crypt_hook_list = STAILQ_HEAD_INITIALIZER(crypt_hook_list);
1471 struct ListNode *crypt_hook = NULL;
1472 const char *keyid = NULL;
1473 char *keylist = NULL;
1474 size_t keylist_size = 0;
1475 size_t keylist_used = 0;
1476 struct Address *p = NULL;
1477 struct PgpKeyInfo *k_info = NULL;
1478 const char *fqdn = mutt_fqdn(true, NeoMutt->sub);
1479 char buf[1024] = { 0 };
1480 bool key_selected;
1481 struct AddressList hookal = TAILQ_HEAD_INITIALIZER(hookal);
1482
1483 struct Address *a = NULL;
1484 const bool c_crypt_confirm_hook = cs_subset_bool(NeoMutt->sub, "crypt_confirm_hook");
1485 TAILQ_FOREACH(a, addrlist, entries)
1486 {
1487 key_selected = false;
1488 mutt_crypt_hook(&crypt_hook_list, a);
1489 crypt_hook = STAILQ_FIRST(&crypt_hook_list);
1490 do
1491 {
1492 p = a;
1493 k_info = NULL;
1494
1495 if (crypt_hook)
1496 {
1497 keyid = crypt_hook->data;
1498 enum QuadOption ans = MUTT_YES;
1499 if (!oppenc_mode && c_crypt_confirm_hook)
1500 {
1501 snprintf(buf, sizeof(buf), _("Use keyID = \"%s\" for %s?"), keyid,
1502 buf_string(p->mailbox));
1503 ans = mutt_yesorno(buf, MUTT_YES);
1504 }
1505 if (ans == MUTT_YES)
1506 {
1507 if (crypt_is_numerical_keyid(keyid))
1508 {
1509 if (mutt_strn_equal(keyid, "0x", 2))
1510 keyid += 2;
1511 goto bypass_selection; /* you don't see this. */
1512 }
1513
1514 /* check for e-mail address */
1515 mutt_addrlist_clear(&hookal);
1516 if (strchr(keyid, '@') && (mutt_addrlist_parse(&hookal, keyid) != 0))
1517 {
1518 mutt_addrlist_qualify(&hookal, fqdn);
1519 p = TAILQ_FIRST(&hookal);
1520 }
1521 else if (!oppenc_mode)
1522 {
1524 }
1525 }
1526 else if (ans == MUTT_NO)
1527 {
1528 if (key_selected || STAILQ_NEXT(crypt_hook, entries))
1529 {
1530 crypt_hook = STAILQ_NEXT(crypt_hook, entries);
1531 continue;
1532 }
1533 }
1534 else if (ans == MUTT_ABORT)
1535 {
1536 FREE(&keylist);
1537 mutt_addrlist_clear(&hookal);
1538 mutt_list_free(&crypt_hook_list);
1539 return NULL;
1540 }
1541 }
1542
1543 if (!k_info)
1544 {
1546 k_info = pgp_getkeybyaddr(p, KEYFLAG_CANENCRYPT, PGP_PUBRING, oppenc_mode);
1547 }
1548
1549 if (!k_info && !oppenc_mode)
1550 {
1551 snprintf(buf, sizeof(buf), _("Enter keyID for %s: "), buf_string(p->mailbox));
1553 }
1554
1555 if (!k_info)
1556 {
1557 FREE(&keylist);
1558 mutt_addrlist_clear(&hookal);
1559 mutt_list_free(&crypt_hook_list);
1560 return NULL;
1561 }
1562
1563 keyid = pgp_fpr_or_lkeyid(k_info);
1564
1565 bypass_selection:
1566 keylist_size += mutt_str_len(keyid) + 4;
1567 mutt_mem_realloc(&keylist, keylist_size);
1568 sprintf(keylist + keylist_used, "%s0x%s", keylist_used ? " " : "", keyid);
1569 keylist_used = mutt_str_len(keylist);
1570
1571 key_selected = true;
1572
1573 pgp_key_free(&k_info);
1574 mutt_addrlist_clear(&hookal);
1575
1576 if (crypt_hook)
1577 crypt_hook = STAILQ_NEXT(crypt_hook, entries);
1578
1579 } while (crypt_hook);
1580
1581 mutt_list_free(&crypt_hook_list);
1582 }
1583 return keylist;
1584}
void mutt_addrlist_qualify(struct AddressList *al, const char *host)
Expand local names in an Address list using a hostname.
Definition: address.c:665
void mutt_addrlist_clear(struct AddressList *al)
Unlink and free all Address in an AddressList.
Definition: address.c:1449
int mutt_addrlist_parse(struct AddressList *al, const char *s)
Parse a list of email addresses.
Definition: address.c:472
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:90
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition: helpers.c:73
bool crypt_is_numerical_keyid(const char *s)
Is this a numerical keyid.
Definition: crypt.c:1367
void pgp_class_invoke_getkeys(struct Address *addr)
Implements CryptModuleSpecs::pgp_invoke_getkeys() -.
Definition: pgpinvoke.c:445
void mutt_crypt_hook(struct ListHead *list, struct Address *addr)
Find crypto hooks for an Address.
Definition: hook.c:838
void mutt_list_free(struct ListHead *h)
Free a List AND its strings.
Definition: list.c:122
void mutt_mem_realloc(void *ptr, size_t size)
Resize a block of memory on the heap.
Definition: memory.c:114
#define FREE(x)
Definition: memory.h:43
#define _(a)
Definition: message.h:28
bool mutt_strn_equal(const char *a, const char *b, size_t num)
Check for equality of two strings (to a maximum), safely.
Definition: string.c:497
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
Definition: string.c:568
#define KEYFLAG_CANENCRYPT
Key is suitable for encryption.
Definition: lib.h:128
char * pgp_fpr_or_lkeyid(struct PgpKeyInfo *k)
Get the fingerprint or long keyid.
Definition: pgp.c:235
struct PgpKeyInfo * pgp_ask_for_key(char *tag, const char *whatfor, KeyFlags abilities, enum PgpRing keyring)
Ask the user for a PGP key.
Definition: pgpkey.c:179
struct PgpKeyInfo * pgp_getkeybyaddr(struct Address *a, KeyFlags abilities, enum PgpRing keyring, bool oppenc_mode)
Find a PGP key by address.
Definition: pgpkey.c:356
struct PgpKeyInfo * pgp_getkeybystr(const char *cp, KeyFlags abilities, enum PgpRing keyring)
Find a PGP key by string.
Definition: pgpkey.c:495
@ PGP_PUBRING
Public keys.
Definition: pgpkey.h:39
void pgp_key_free(struct PgpKeyInfo **kpp)
Free a PGP key info.
Definition: pgplib.c:199
QuadOption
Possible values for a quad-option.
Definition: quad.h:36
@ MUTT_ABORT
User aborted the question (with Ctrl-G)
Definition: quad.h:37
@ MUTT_NO
User answered 'No', or assume 'No'.
Definition: quad.h:38
@ MUTT_YES
User answered 'Yes', or assume 'Yes'.
Definition: quad.h:39
enum QuadOption mutt_yesorno(const char *msg, enum QuadOption def)
Ask the user a Yes/No question.
Definition: question.c:194
#define TAILQ_FOREACH(var, head, field)
Definition: queue.h:725
#define STAILQ_HEAD_INITIALIZER(head)
Definition: queue.h:324
#define STAILQ_FIRST(head)
Definition: queue.h:350
#define TAILQ_FIRST(head)
Definition: queue.h:723
#define TAILQ_HEAD_INITIALIZER(head)
Definition: queue.h:637
#define STAILQ_NEXT(elm, field)
Definition: queue.h:400
const char * mutt_fqdn(bool may_hide_host, const struct ConfigSubset *sub)
Get the Fully-Qualified Domain Name.
Definition: sendlib.c:701
An email address.
Definition: address.h:36
struct Buffer * mailbox
Mailbox and host address.
Definition: address.h:38
A List node for strings.
Definition: list.h:35
char * data
String.
Definition: list.h:36
Container for Accounts, Notifications.
Definition: neomutt.h:37
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:39
Information about a PGP key.
Definition: pgplib.h:47
+ Here is the call graph for this function:

◆ smime_class_find_keys()

char * smime_class_find_keys ( const struct AddressList *  al,
bool  oppenc_mode 
)

Implements CryptModuleSpecs::find_keys() -.

Definition at line 853 of file smime.c.

854{
855 struct SmimeKey *key = NULL;
856 char *keyid = NULL, *keylist = NULL;
857 size_t keylist_size = 0;
858 size_t keylist_used = 0;
859
860 struct Address *a = NULL;
861 TAILQ_FOREACH(a, al, entries)
862 {
863 key = smime_get_key_by_addr(buf_string(a->mailbox), KEYFLAG_CANENCRYPT, true, oppenc_mode);
864 if (!key && !oppenc_mode)
865 {
866 char buf[1024] = { 0 };
867 snprintf(buf, sizeof(buf), _("Enter keyID for %s: "), buf_string(a->mailbox));
868 key = smime_ask_for_key(buf, KEYFLAG_CANENCRYPT, true);
869 }
870 if (!key)
871 {
872 if (!oppenc_mode)
873 mutt_message(_("No (valid) certificate found for %s"), buf_string(a->mailbox));
874 FREE(&keylist);
875 return NULL;
876 }
877
878 keyid = key->hash;
879 keylist_size += mutt_str_len(keyid) + 2;
880 mutt_mem_realloc(&keylist, keylist_size);
881 sprintf(keylist + keylist_used, "%s%s", keylist_used ? " " : "", keyid);
882 keylist_used = mutt_str_len(keylist);
883
884 smime_key_free(&key);
885 }
886 return keylist;
887}
#define mutt_message(...)
Definition: logging2.h:89
static struct SmimeKey * smime_get_key_by_addr(const char *mailbox, KeyFlags abilities, bool only_public_key, bool oppenc_mode)
Find an SIME key by address.
Definition: smime.c:614
static struct SmimeKey * smime_ask_for_key(char *prompt, KeyFlags abilities, bool only_public_key)
Ask the user to select a key.
Definition: smime.c:741
static void smime_key_free(struct SmimeKey **keylist)
Free a list of SMIME keys.
Definition: smime.c:114
An SIME key.
Definition: smime.h:44
char * hash
Definition: smime.h:46
+ Here is the call graph for this function: