# HG changeset patch # User Kevin McCarthy # Date 1423248566 28800 # Fri Feb 06 10:49:26 2015 -0800 # Node ID 0cbb7cd6fb8d7925654845e429e2270c792dca8d # Parent d2f5832a9e6879e11ab633d66f8bc0b606ea99ca Refactor the address list generation out of the find_keys routines. All four find_keys routines have a similar set up code for generating a single address list out of the to, cc, bcc lists. This patch pulls all the code into crypt_get_keys. This is done to simplify the functions before later patches make them more complicated (with the oppenc_mode parameter). diff --git a/crypt-gpgme.c b/crypt-gpgme.c --- a/crypt-gpgme.c +++ b/crypt-gpgme.c @@ -4325,54 +4325,31 @@ BEEP (); } /* not reached */ } /* This routine attempts to find the keyids of the recipients of a message. It returns NULL if any of the keys can not be found. */ -static char *find_keys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc, - unsigned int app) +static char *find_keys (ADDRESS *adrlist, unsigned int app) { char *keyID, *keylist = NULL, *t; size_t keylist_size = 0; size_t keylist_used = 0; - ADDRESS *tmp = NULL, *addr = NULL; - ADDRESS **last = &tmp; + ADDRESS *addr = NULL; ADDRESS *p, *q; - int i; crypt_key_t *k_info, *key; const char *fqdn = mutt_fqdn (1); #if 0 *r_application = APPLICATION_PGP|APPLICATION_SMIME; #endif - - for (i = 0; i < 3; i++) - { - switch (i) - { - case 0: p = to; break; - case 1: p = cc; break; - case 2: p = bcc; break; - default: abort (); - } - - *last = rfc822_cpy_adr (p, 0); - while (*last) - last = &((*last)->next); - } - - if (fqdn) - rfc822_qualify (tmp, fqdn); - - tmp = mutt_remove_duplicates (tmp); - - for (p = tmp; p ; p = p->next) + + for (p = adrlist; p ; p = p->next) { char buf[LONG_STRING]; int forced_valid = 0; q = p; k_info = NULL; if ((keyID = mutt_crypt_hook (p)) != NULL) @@ -4399,17 +4376,16 @@ k_info = crypt_getkeybystr (keyID, KEYFLAG_CANENCRYPT, app, &forced_valid); #endif } } else if (r == -1) { FREE (&keylist); - rfc822_free_address (&tmp); rfc822_free_address (&addr); return NULL; } } if (k_info == NULL && (k_info = crypt_getkeybyaddr (q, KEYFLAG_CANENCRYPT, app, &forced_valid)) == NULL) @@ -4421,17 +4397,16 @@ #if 0 *r_application, #else app, #endif &forced_valid)) == NULL) { FREE (&keylist); - rfc822_free_address (&tmp); rfc822_free_address (&addr); return NULL; } } else key = k_info; { @@ -4450,28 +4425,27 @@ keylist_used ? " " : "", s, forced_valid? "!":""); } keylist_used = mutt_strlen (keylist); crypt_free_key (&key); rfc822_free_address (&addr); } - rfc822_free_address (&tmp); return (keylist); } -char *pgp_gpgme_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) +char *pgp_gpgme_findkeys (ADDRESS *adrlist) { - return find_keys (to, cc, bcc, APPLICATION_PGP); + return find_keys (adrlist, APPLICATION_PGP); } -char *smime_gpgme_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) +char *smime_gpgme_findkeys (ADDRESS *adrlist) { - return find_keys (to, cc, bcc, APPLICATION_SMIME); + return find_keys (adrlist, APPLICATION_SMIME); } #ifdef HAVE_GPGME_OP_EXPORT_KEYS BODY *pgp_gpgme_make_key_attachment (char *tempf) { crypt_key_t *key = NULL; gpgme_ctx_t context = NULL; gpgme_key_t export_keys[2]; diff --git a/crypt-gpgme.h b/crypt-gpgme.h --- a/crypt-gpgme.h +++ b/crypt-gpgme.h @@ -19,18 +19,18 @@ #ifndef CRYPT_GPGME_H #define CRYPT_GPGME_H #include "mutt_crypt.h" void pgp_gpgme_init (void); void smime_gpgme_init (void); -char *pgp_gpgme_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc); -char *smime_gpgme_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc); +char *pgp_gpgme_findkeys (ADDRESS *adrlist); +char *smime_gpgme_findkeys (ADDRESS *adrlist); BODY *pgp_gpgme_encrypt_message (BODY *a, char *keylist, int sign); BODY *smime_gpgme_build_smime_entity (BODY *a, char *keylist); int pgp_gpgme_decrypt_mime (FILE *fpin, FILE **fpout, BODY *b, BODY **cur); int smime_gpgme_decrypt_mime (FILE *fpin, FILE **fpout, BODY *b, BODY **cur); int pgp_gpgme_check_traditional (FILE *fp, BODY *b, int tagged_only); diff --git a/crypt-mod-pgp-classic.c b/crypt-mod-pgp-classic.c --- a/crypt-mod-pgp-classic.c +++ b/crypt-mod-pgp-classic.c @@ -41,19 +41,19 @@ { return pgp_decrypt_mime (a, b, c, d); } static int crypt_mod_pgp_application_handler (BODY *m, STATE *s) { return pgp_application_pgp_handler (m, s); } -static char *crypt_mod_pgp_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) +static char *crypt_mod_pgp_findkeys (ADDRESS *adrlist) { - return pgp_findKeys (to, cc, bcc); + return pgp_findKeys (adrlist); } static BODY *crypt_mod_pgp_sign_message (BODY *a) { return pgp_sign_message (a); } static int crypt_mod_pgp_verify_one (BODY *sigbdy, STATE *s, const char *tempf) diff --git a/crypt-mod-pgp-gpgme.c b/crypt-mod-pgp-gpgme.c --- a/crypt-mod-pgp-gpgme.c +++ b/crypt-mod-pgp-gpgme.c @@ -65,19 +65,19 @@ return pgp_gpgme_check_traditional (fp, b, tagged_only); } static void crypt_mod_pgp_invoke_import (const char *fname) { pgp_gpgme_invoke_import (fname); } -static char *crypt_mod_pgp_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) +static char *crypt_mod_pgp_findkeys (ADDRESS *adrlist) { - return pgp_gpgme_findkeys (to, cc, bcc); + return pgp_gpgme_findkeys (adrlist); } static BODY *crypt_mod_pgp_sign_message (BODY *a) { return pgp_gpgme_sign_message (a); } static int crypt_mod_pgp_verify_one (BODY *sigbdy, STATE *s, const char *tempf) diff --git a/crypt-mod-smime-classic.c b/crypt-mod-smime-classic.c --- a/crypt-mod-smime-classic.c +++ b/crypt-mod-smime-classic.c @@ -41,19 +41,19 @@ { return smime_decrypt_mime (a, b, c, d); } static int crypt_mod_smime_application_handler (BODY *m, STATE *s) { return smime_application_smime_handler (m, s); } -static char *crypt_mod_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) +static char *crypt_mod_smime_findkeys (ADDRESS *adrlist) { - return smime_findKeys (to, cc, bcc); + return smime_findKeys (adrlist); } static BODY *crypt_mod_smime_sign_message (BODY *a) { return smime_sign_message (a); } static int crypt_mod_smime_verify_one (BODY *sigbdy, STATE *s, const char *tempf) diff --git a/crypt-mod-smime-gpgme.c b/crypt-mod-smime-gpgme.c --- a/crypt-mod-smime-gpgme.c +++ b/crypt-mod-smime-gpgme.c @@ -50,19 +50,19 @@ return smime_gpgme_decrypt_mime (a, b, c, d); } static int crypt_mod_smime_application_handler (BODY *m, STATE *s) { return smime_gpgme_application_handler (m, s); } -static char *crypt_mod_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) +static char *crypt_mod_smime_findkeys (ADDRESS *adrlist) { - return smime_gpgme_findkeys (to, cc, bcc); + return smime_gpgme_findkeys (adrlist); } static BODY *crypt_mod_smime_sign_message (BODY *a) { return smime_gpgme_sign_message (a); } static int crypt_mod_smime_verify_one (BODY *sigbdy, STATE *s, const char *tempf) diff --git a/crypt-mod.h b/crypt-mod.h --- a/crypt-mod.h +++ b/crypt-mod.h @@ -38,18 +38,17 @@ typedef int (*crypt_func_encrypted_handler_t) (BODY *m, STATE *s); typedef void (*crypt_func_pgp_invoke_getkeys_t) (ADDRESS *addr); typedef int (*crypt_func_pgp_check_traditional_t) (FILE *fp, BODY *b, int tagged_only); typedef BODY *(*crypt_func_pgp_traditional_encryptsign_t) (BODY *a, int flags, char *keylist); typedef BODY *(*crypt_func_pgp_make_key_attachment_t) (char *tempf); -typedef char *(*crypt_func_findkeys_t) (ADDRESS *to, - ADDRESS *cc, ADDRESS *bcc); +typedef char *(*crypt_func_findkeys_t) (ADDRESS *adrlist); typedef BODY *(*crypt_func_sign_message_t) (BODY *a); typedef BODY *(*crypt_func_pgp_encrypt_message_t) (BODY *a, char *keylist, int sign); typedef void (*crypt_func_pgp_invoke_import_t) (const char *fname); typedef int (*crypt_func_verify_one_t) (BODY *sigbdy, STATE *s, const char *tempf); typedef void (*crypt_func_pgp_extract_keys_from_attachment_list_t) (FILE *fp, int tag, BODY *top); diff --git a/crypt.c b/crypt.c --- a/crypt.c +++ b/crypt.c @@ -704,46 +704,63 @@ if ((WithCrypto & APPLICATION_PGP)) unset_option (OPTDONTHANDLEPGPKEYS); } int crypt_get_keys (HEADER *msg, char **keylist) { + ADDRESS *adrlist = NULL, *last = NULL; + const char *fqdn = mutt_fqdn (1); + /* Do a quick check to make sure that we can find all of the encryption * keys if the user has requested this service. */ if (!WithCrypto) return 0; if ((WithCrypto & APPLICATION_PGP)) set_option (OPTPGPCHECKTRUST); + last = rfc822_append (&adrlist, msg->env->to, 0); + last = rfc822_append (last ? &last : &adrlist, msg->env->cc, 0); + rfc822_append (last ? &last : &adrlist, msg->env->bcc, 0); + + if (fqdn) + rfc822_qualify (adrlist, fqdn); + adrlist = mutt_remove_duplicates (adrlist); + *keylist = NULL; if (msg->security & ENCRYPT) { if ((WithCrypto & APPLICATION_PGP) && (msg->security & APPLICATION_PGP)) { - if ((*keylist = crypt_pgp_findkeys (msg->env->to, msg->env->cc, - msg->env->bcc)) == NULL) + if ((*keylist = crypt_pgp_findkeys (adrlist)) == NULL) + { + rfc822_free_address (&adrlist); return (-1); + } unset_option (OPTPGPCHECKTRUST); } if ((WithCrypto & APPLICATION_SMIME) && (msg->security & APPLICATION_SMIME)) { - if ((*keylist = crypt_smime_findkeys (msg->env->to, msg->env->cc, - msg->env->bcc)) == NULL) + if ((*keylist = crypt_smime_findkeys (adrlist)) == NULL) + { + rfc822_free_address (&adrlist); return (-1); + } } } + + rfc822_free_address (&adrlist); return (0); } static void crypt_fetch_signatures (BODY ***signatures, BODY *a, int *n) { diff --git a/cryptglue.c b/cryptglue.c --- a/cryptglue.c +++ b/cryptglue.c @@ -195,20 +195,20 @@ if (CRYPT_MOD_CALL_CHECK (PGP, pgp_make_key_attachment)) return (CRYPT_MOD_CALL (PGP, pgp_make_key_attachment)) (tempf); return NULL; } /* This routine attempts to find the keyids of the recipients of a message. It returns NULL if any of the keys can not be found. */ -char *crypt_pgp_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) +char *crypt_pgp_findkeys (ADDRESS *adrlist) { if (CRYPT_MOD_CALL_CHECK (PGP, findkeys)) - return (CRYPT_MOD_CALL (PGP, findkeys)) (to, cc, bcc); + return (CRYPT_MOD_CALL (PGP, findkeys)) (adrlist); return NULL; } /* Create a new body with a PGP signed message from A. */ BODY *crypt_pgp_sign_message (BODY *a) { if (CRYPT_MOD_CALL_CHECK (PGP, sign_message)) @@ -329,20 +329,20 @@ if (CRYPT_MOD_CALL_CHECK (SMIME, smime_verify_sender)) return (CRYPT_MOD_CALL (SMIME, smime_verify_sender)) (h); return 1; } /* This routine attempts to find the keyids of the recipients of a message. It returns NULL if any of the keys can not be found. */ -char *crypt_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) +char *crypt_smime_findkeys (ADDRESS *adrlist) { if (CRYPT_MOD_CALL_CHECK (SMIME, findkeys)) - return (CRYPT_MOD_CALL (SMIME, findkeys)) (to, cc, bcc); + return (CRYPT_MOD_CALL (SMIME, findkeys)) (adrlist); return NULL; } /* fixme: Needs documentation. */ BODY *crypt_smime_sign_message (BODY *a) { if (CRYPT_MOD_CALL_CHECK (SMIME, sign_message)) diff --git a/mutt_crypt.h b/mutt_crypt.h --- a/mutt_crypt.h +++ b/mutt_crypt.h @@ -192,17 +192,17 @@ /* Release the PGP key KPP (note, that we pass a pointer to it). */ void crypt_pgp_free_key (pgp_key_t *kpp); /* Generate a PGP public key attachment. */ BODY *crypt_pgp_make_key_attachment (char *tempf); /* This routine attempts to find the keyids of the recipients of a message. It returns NULL if any of the keys can not be found. */ -char *crypt_pgp_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc); +char *crypt_pgp_findkeys (ADDRESS *adrlist); /* Create a new body with a PGP signed message from A. */ BODY *crypt_pgp_sign_message (BODY *a); /* Warning: A is no longer freed in this routine, you need to free it later. This is necessary for $fcc_attach. */ BODY *crypt_pgp_encrypt_message (BODY *a, char *keylist, int sign); @@ -241,17 +241,17 @@ /* Check that the sender matches. */ int crypt_smime_verify_sender(HEADER *h); /* Ask for an SMIME key. */ char *crypt_smime_ask_for_key (char *prompt, char *mailbox, short public); /* This routine attempts to find the keyids of the recipients of a message. It returns NULL if any of the keys can not be found. */ -char *crypt_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc); +char *crypt_smime_findkeys (ADDRESS *adrlist); /* fixme: Needs documentation. */ BODY *crypt_smime_sign_message (BODY *a); /* fixme: needs documentation. */ BODY *crypt_smime_build_smime_entity (BODY *a, char *certlist); /* Add a certificate and update index file (externally). */ diff --git a/pgp.c b/pgp.c --- a/pgp.c +++ b/pgp.c @@ -1166,50 +1166,28 @@ return 0; return 1; } /* This routine attempts to find the keyids of the recipients of a message. * It returns NULL if any of the keys can not be found. */ -char *pgp_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) +char *pgp_findKeys (ADDRESS *adrlist) { char *keyID, *keylist = NULL; size_t keylist_size = 0; size_t keylist_used = 0; - ADDRESS *tmp = NULL, *addr = NULL; - ADDRESS **last = &tmp; + ADDRESS *addr = NULL; ADDRESS *p, *q; - int i; pgp_key_t k_info = NULL, key = NULL; const char *fqdn = mutt_fqdn (1); - for (i = 0; i < 3; i++) - { - switch (i) - { - case 0: p = to; break; - case 1: p = cc; break; - case 2: p = bcc; break; - default: abort (); - } - - *last = rfc822_cpy_adr (p, 0); - while (*last) - last = &((*last)->next); - } - - if (fqdn) - rfc822_qualify (tmp, fqdn); - - tmp = mutt_remove_duplicates (tmp); - - for (p = tmp; p ; p = p->next) + for (p = adrlist; p ; p = p->next) { char buf[LONG_STRING]; q = p; k_info = NULL; if ((keyID = mutt_crypt_hook (p)) != NULL) { @@ -1232,34 +1210,32 @@ q = addr; } else k_info = pgp_getkeybystr (keyID, KEYFLAG_CANENCRYPT, PGP_PUBRING); } else if (r == -1) { FREE (&keylist); - rfc822_free_address (&tmp); rfc822_free_address (&addr); return NULL; } } if (k_info == NULL) pgp_invoke_getkeys (q); if (k_info == NULL && (k_info = pgp_getkeybyaddr (q, KEYFLAG_CANENCRYPT, PGP_PUBRING)) == NULL) { snprintf (buf, sizeof (buf), _("Enter keyID for %s: "), q->mailbox); if ((key = pgp_ask_for_key (buf, q->mailbox, KEYFLAG_CANENCRYPT, PGP_PUBRING)) == NULL) { FREE (&keylist); - rfc822_free_address (&tmp); rfc822_free_address (&addr); return NULL; } } else key = k_info; keyID = pgp_keyid (key); @@ -1270,17 +1246,16 @@ sprintf (keylist + keylist_used, "%s0x%s", keylist_used ? " " : "", /* __SPRINTF_CHECKED__ */ keyID); keylist_used = mutt_strlen (keylist); pgp_free_key (&key); rfc822_free_address (&addr); } - rfc822_free_address (&tmp); return (keylist); } /* Warning: "a" is no longer freed in this routine, you need * to free it later. This is necessary for $fcc_attach. */ BODY *pgp_encrypt_message (BODY *a, char *keylist, int sign) { diff --git a/pgp.h b/pgp.h --- a/pgp.h +++ b/pgp.h @@ -46,17 +46,17 @@ /* int pgp_string_matches_hint (const char *s, LIST * hints); */ /* pgp_key_t gpg_get_candidates (struct pgp_vinfo *, pgp_ring_t, LIST *); */ pgp_key_t pgp_ask_for_key (char *, char *, short, pgp_ring_t); pgp_key_t pgp_get_candidates (pgp_ring_t, LIST *); pgp_key_t pgp_getkeybyaddr (ADDRESS *, short, pgp_ring_t); pgp_key_t pgp_getkeybystr (char *, short, pgp_ring_t); -char *pgp_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc); +char *pgp_findKeys (ADDRESS *adrlist); void pgp_forget_passphrase (void); int pgp_application_pgp_handler (BODY *, STATE *); int pgp_encrypted_handler (BODY *, STATE *); void pgp_extract_keys_from_attachment_list (FILE * fp, int tag, BODY * top); void pgp_void_passphrase (void); int pgp_valid_passphrase (void); diff --git a/smime.c b/smime.c --- a/smime.c +++ b/smime.c @@ -726,79 +726,49 @@ rfc822_free_address (&t); } } /* This routine attempts to find the keyids of the recipients of a message. * It returns NULL if any of the keys can not be found. */ -char *smime_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) +char *smime_findKeys (ADDRESS *adrlist) { char *keyID, *keylist = NULL; size_t keylist_size = 0; size_t keylist_used = 0; - ADDRESS *tmp = NULL, *addr = NULL; - ADDRESS **last = &tmp; ADDRESS *p, *q; - int i; - const char *fqdn = mutt_fqdn (1); - - for (i = 0; i < 3; i++) - { - switch (i) - { - case 0: p = to; break; - case 1: p = cc; break; - case 2: p = bcc; break; - default: abort (); - } - - *last = rfc822_cpy_adr (p, 0); - while (*last) - last = &((*last)->next); - } - - if (fqdn) - rfc822_qualify (tmp, fqdn); - - tmp = mutt_remove_duplicates (tmp); - - for (p = tmp; p ; p = p->next) + for (p = adrlist; p ; p = p->next) { char buf[LONG_STRING]; q = p; if ((keyID = smime_get_field_from_db (q->mailbox, NULL, 1, 1)) == NULL) { snprintf(buf, sizeof(buf), _("Enter keyID for %s: "), q->mailbox); keyID = smime_ask_for_key(buf, q->mailbox, 1); } if(!keyID) { mutt_message (_("No (valid) certificate found for %s."), q->mailbox); FREE (&keylist); - rfc822_free_address (&tmp); - rfc822_free_address (&addr); return NULL; } keylist_size += mutt_strlen (keyID) + 2; safe_realloc (&keylist, keylist_size); sprintf (keylist + keylist_used, "%s\n", keyID); /* __SPRINTF_CHECKED__ */ keylist_used = mutt_strlen (keylist); - rfc822_free_address (&addr); - } - rfc822_free_address (&tmp); return (keylist); } diff --git a/smime.h b/smime.h --- a/smime.h +++ b/smime.h @@ -45,17 +45,17 @@ char* smime_get_field_from_db (char *, char *, short, short); void smime_getkeys (ENVELOPE *); char* smime_ask_for_key (char *, char *, short); -char *smime_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc); +char *smime_findKeys (ADDRESS *adrlist); void smime_invoke_import (char *, char *); int smime_send_menu (HEADER *msg, int *redraw); #endif