X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-crypt%2Fcrypt-gpgme.c;h=29a676e0b57ef065e81d2894a63a8aee4a253fa6;hp=3afaea001d0345eef3a8938dcfe5ed6a8e5584f4;hb=916e4872caf252a5850e64f79427b9dd7808435d;hpb=69f4685e616347559d4ec714fd826d7f97a472ef diff --git a/lib-crypt/crypt-gpgme.c b/lib-crypt/crypt-gpgme.c index 3afaea0..29a676e 100644 --- a/lib-crypt/crypt-gpgme.c +++ b/lib-crypt/crypt-gpgme.c @@ -12,48 +12,28 @@ * please see the file GPL in the top level source directory. */ -#if HAVE_CONFIG_H -# include "config.h" -#endif +#include #ifdef CRYPT_BACKEND_GPGME -#include -#include -#include -#include -#include -#include -#include - #ifdef HAVE_LOCALE_H # include #endif #ifdef HAVE_LANGINFO_D_T_FMT # include #endif -#ifdef HAVE_SYS_TIME_H -# include -#endif #ifdef HAVE_SYS_RESOURCE_H # include #endif #include -#include -#include -#include -#include -#include - #include #include #include #include -#include "mutt.h" #include "lib.h" #include "alias.h" #include @@ -62,6 +42,7 @@ #include "pager.h" #include "recvattach.h" #include "sort.h" +#include "crypt-gpgme.h" /* * Helper macros. @@ -367,10 +348,9 @@ static gpgme_data_t body_to_data_object (BODY * a, int convert) int err = 0; gpgme_data_t data; - mutt_mktemp (tempfile); - fptmp = safe_fopen (tempfile, "w+"); + fptmp = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL); if (!fptmp) { - mutt_perror (tempfile); + mutt_perror (_("Can't create temporary file")); return NULL; } @@ -399,13 +379,11 @@ static gpgme_data_t body_to_data_object (BODY * a, int convert) buf[0] = c; gpgme_data_write (data, buf, 1); } - fclose (fptmp); gpgme_data_seek (data, 0, SEEK_SET); - } - else { - fclose (fptmp); + } else { err = gpgme_data_new_from_file (&data, tempfile, 1); } + m_fclose(&fptmp); unlink (tempfile); if (err) { mutt_error (_("error allocating data object: %s\n"), gpgme_strerror (err)); @@ -476,10 +454,9 @@ static char *data_object_to_tempfile (gpgme_data_t data, FILE ** ret_fp) FILE *fp; ssize_t nread = 0; - mutt_mktemp (tempfile); - fp = safe_fopen (tempfile, "w+"); + fp = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL); if (!fp) { - mutt_perror (tempfile); + mutt_perror (_("Can't create temporary file")); return NULL; } @@ -491,7 +468,7 @@ static char *data_object_to_tempfile (gpgme_data_t data, FILE ** ret_fp) while ((nread = gpgme_data_read (data, buf, sizeof (buf)))) { if (fwrite (buf, nread, 1, fp) != 1) { mutt_perror (tempfile); - fclose (fp); + m_fclose(&fp); unlink (tempfile); return NULL; } @@ -500,11 +477,11 @@ static char *data_object_to_tempfile (gpgme_data_t data, FILE ** ret_fp) if (ret_fp) rewind (fp); else - fclose (fp); + m_fclose(&fp); if (nread == -1) { mutt_error (_("error reading data object: %s\n"), gpgme_strerror (err)); unlink (tempfile); - fclose (fp); + m_fclose(&fp); return NULL; } if (ret_fp) @@ -758,7 +735,7 @@ static BODY *sign_message (BODY * a, int use_smime) return NULL; } - t = mutt_new_body (); + t = body_new(); t->type = TYPEMULTIPART; t->subtype = m_strdup("signed"); t->encoding = ENC7BIT; @@ -780,7 +757,7 @@ static BODY *sign_message (BODY * a, int use_smime) t->parts = a; a = t; - t->parts->next = mutt_new_body (); + t->parts->next = body_new(); t = t->parts->next; t->type = TYPEAPPLICATION; if (use_smime) { @@ -845,7 +822,7 @@ BODY *pgp_gpgme_encrypt_message (BODY * a, char *keylist, int sign) if (!outfile) return NULL; - t = mutt_new_body (); + t = body_new(); t->type = TYPEMULTIPART; t->subtype = m_strdup("encrypted"); t->encoding = ENC7BIT; @@ -855,12 +832,12 @@ BODY *pgp_gpgme_encrypt_message (BODY * a, char *keylist, int sign) parameter_set_boundary(&t->parameter); parameter_setval(&t->parameter, "protocol", "application/pgp-encrypted"); - t->parts = mutt_new_body (); + t->parts = body_new(); t->parts->type = TYPEAPPLICATION; t->parts->subtype = m_strdup("pgp-encrypted"); t->parts->encoding = ENC7BIT; - t->parts->next = mutt_new_body (); + t->parts->next = body_new(); t->parts->next->type = TYPEAPPLICATION; t->parts->next->subtype = m_strdup("octet-stream"); t->parts->next->encoding = ENC7BIT; @@ -903,7 +880,7 @@ BODY *smime_gpgme_build_smime_entity (BODY * a, char *keylist) if (!outfile) return NULL; - t = mutt_new_body (); + t = body_new(); t->type = TYPEAPPLICATION; t->subtype = m_strdup("pkcs7-mime"); parameter_setval(&t->parameter, "name", "smime.p7m"); @@ -1488,9 +1465,9 @@ int pgp_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b, BODY ** cur) p_clear(&s, 1); s.fpin = fpin; - mutt_mktemp (tempfile); - if (!(*fpout = safe_fopen (tempfile, "w+"))) { - mutt_perror (tempfile); + *fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL); + if (!*fpout) { + mutt_perror (_("Can't create temporary file")); return -1; } unlink (tempfile); @@ -1533,9 +1510,9 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b, p_clear(&s, 1); s.fpin = fpin; fseeko (s.fpin, b->offset, 0); - mutt_mktemp (tempfile); - if (!(tmpfp = safe_fopen (tempfile, "w+"))) { - mutt_perror (tempfile); + tmpfp = m_tempfile (tempfile, sizeof(tempfile), NONULL(Tempdir), NULL); + if (!tmpfp) { + mutt_perror (_("Can't create temporary file")); return -1; } mutt_unlink (tempfile); @@ -1550,9 +1527,9 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b, p_clear(&s, 1); s.fpin = tmpfp; s.fpout = 0; - mutt_mktemp (tempfile); - if (!(*fpout = safe_fopen (tempfile, "w+"))) { - mutt_perror (tempfile); + *fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL); + if (!*fpout) { + mutt_perror (_("Can't create temporary file")); return -1; } mutt_unlink (tempfile); @@ -1563,7 +1540,7 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b, b->type = saved_b_type; b->length = saved_b_length; b->offset = saved_b_offset; - fclose (tmpfp); + m_fclose(&tmpfp); rewind (*fpout); if (*cur && !is_signed && !(*cur)->parts && mutt_is_application_smime (*cur)) { @@ -1585,9 +1562,9 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b, p_clear(&s, 1); s.fpin = *fpout; fseeko (s.fpin, bb->offset, 0); - mutt_mktemp (tempfile); - if (!(tmpfp = safe_fopen (tempfile, "w+"))) { - mutt_perror (tempfile); + tmpfp = m_tempfile (tempfile, sizeof(tempfile), NONULL(Tempdir), NULL); + if (!tmpfp) { + mutt_perror (_("Can't create temporary file")); return -1; } mutt_unlink (tempfile); @@ -1598,14 +1575,14 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b, bb->length = ftello (s.fpout); bb->offset = 0; rewind (tmpfp); - fclose (*fpout); + m_fclose(&*fpout); p_clear(&s, 1); s.fpin = tmpfp; s.fpout = 0; - mutt_mktemp (tempfile); - if (!(*fpout = safe_fopen (tempfile, "w+"))) { - mutt_perror (tempfile); + *fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL); + if (!*fpout) { + mutt_perror (_("Can't create temporary file")); return -1; } mutt_unlink (tempfile); @@ -1616,9 +1593,9 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b, bb->type = saved_b_type; bb->length = saved_b_length; bb->offset = saved_b_offset; - fclose (tmpfp); + m_fclose(&tmpfp); rewind (*fpout); - mutt_free_body (cur); + body_list_wipe(cur); *cur = tmp_b; } return *cur ? 0 : -1; @@ -1664,7 +1641,7 @@ static int pgp_check_traditional_one_body (FILE * fp, BODY * b, sgn = 1; } } - safe_fclose (&tfp); + m_fclose(&tfp); unlink (tempfile); if (!enc && !sgn) @@ -1757,7 +1734,7 @@ static void copy_clearsigned (gpgme_data_t data, STATE * s, char *charset) } fgetconv_close (&fc); - fclose (fp); + m_fclose(&fp); } @@ -1965,7 +1942,7 @@ int pgp_gpgme_application_handler (BODY * m, STATE * s) } if (pgpout) { - safe_fclose (&pgpout); + m_fclose(&pgpout); } } else { @@ -2014,8 +1991,8 @@ int pgp_gpgme_encrypted_handler (BODY * a, STATE * s) /* Move forward to the application/pgp-encrypted body. */ a = a->next; - mutt_mktemp (tempfile); - if (!(fpout = safe_fopen (tempfile, "w+"))) { + fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL); + if (!fpout) { if (s->flags & M_DISPLAY) state_attach_puts (_("[-- Error: could not create temporary file! " "--]\n"), s); @@ -2056,10 +2033,10 @@ int pgp_gpgme_encrypted_handler (BODY * a, STATE * s) : _("[-- End of PGP/MIME encrypted data --]\n"), s); } - mutt_free_body (&tattach); + body_list_wipe(&tattach); } - fclose (fpout); + m_fclose(&fpout); mutt_unlink (tempfile); return (rc); } @@ -2074,8 +2051,8 @@ int smime_gpgme_application_handler (BODY * a, STATE * s) int rc = 0; a->warnsig = 0; - mutt_mktemp (tempfile); - if (!(fpout = safe_fopen (tempfile, "w+"))) { + fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL); + if (!fpout) { if (s->flags & M_DISPLAY) state_attach_puts (_("[-- Error: could not create temporary file! " "--]\n"), s); @@ -2120,10 +2097,10 @@ int smime_gpgme_application_handler (BODY * a, STATE * s) _("[-- End of S/MIME encrypted data --]\n"), s); } - mutt_free_body (&tattach); + body_list_wipe(&tattach); } - fclose (fpout); + m_fclose(&fpout); mutt_unlink (tempfile); return (rc); } @@ -2946,10 +2923,9 @@ static void verify_key (crypt_key_t * key) gpgme_key_t k = NULL; int maxdepth = 100; - mutt_mktemp (tempfile); - if (!(fp = safe_fopen (tempfile, "w"))) { + fp = m_tempfile (tempfile, sizeof(tempfile), NONULL(Tempdir), NULL); + if (!fp) { mutt_perror (_("Can't create temporary file")); - return; } mutt_message _("Collecting data..."); @@ -2991,7 +2967,7 @@ static void verify_key (crypt_key_t * key) leave: gpgme_key_release (k); gpgme_release (listctx); - fclose (fp); + m_fclose(&fp); mutt_clear_error (); snprintf (cmd, sizeof (cmd), _("Key ID: 0x%s"), crypt_keyid (key)); mutt_do_pager (cmd, tempfile, 0, NULL); @@ -3522,7 +3498,7 @@ static crypt_key_t *crypt_getkeybyaddr (address_t * a, short abilities, } -static crypt_key_t *crypt_getkeybystr (char *p, short abilities, +static crypt_key_t *crypt_getkeybystr (const char *p, short abilities, unsigned int app, int *forced_valid) { string_list_t *hints = NULL; @@ -3636,7 +3612,8 @@ static crypt_key_t *crypt_ask_for_key (char *tag, static char *find_keys (address_t * to, address_t * cc, address_t * bcc, unsigned int app) { - char *keyID, *keylist = NULL, *t; + char *keylist = NULL, *t; + const char *keyID; ssize_t keylist_size = 0; ssize_t keylist_used = 0; address_t *tmp = NULL, *addr = NULL; @@ -3673,7 +3650,7 @@ static char *find_keys (address_t * to, address_t * cc, address_t * bcc, if (fqdn) rfc822_qualify (tmp, fqdn); - tmp = mutt_remove_duplicates (tmp); + address_list_uniq(tmp); for (p = tmp; p; p = p->next) { char buf[LONG_STRING]; @@ -3696,13 +3673,8 @@ static char *find_keys (address_t * to, address_t * cc, address_t * bcc, q = addr; } else { -#if 0 - k_info = crypt_getkeybystr (keyID, KEYFLAG_CANENCRYPT, - *r_application, &forced_valid); -#else k_info = crypt_getkeybystr (keyID, KEYFLAG_CANENCRYPT, app, &forced_valid); -#endif } } else if (r == -1) { @@ -3719,11 +3691,7 @@ static char *find_keys (address_t * to, address_t * cc, address_t * bcc, snprintf (buf, sizeof (buf), _("Enter keyID for %s: "), q->mailbox); if ((key = crypt_ask_for_key (buf, q->mailbox, KEYFLAG_CANENCRYPT, -#if 0 - *r_application, -#else app, -#endif &forced_valid)) == NULL) { p_delete(&keylist); address_list_wipe(&tmp); @@ -3737,13 +3705,6 @@ static char *find_keys (address_t * to, address_t * cc, address_t * bcc, { const char *s = crypt_fpr (key); -#if 0 - if (key->flags & KEYFLAG_ISX509) - *r_application &= ~APPLICATION_PGP; - if (!(key->flags & KEYFLAG_ISX509)) - *r_application &= ~APPLICATION_SMIME; -#endif - keylist_size += m_strlen(s) + 4 + 1; p_realloc(&keylist, keylist_size); sprintf (keylist + keylist_used, "%s0x%s%s", /* __SPRINTF_CHECKED__ */ @@ -3837,11 +3798,6 @@ static int gpgme_send_menu (HEADER * msg, int *redraw, int is_smime) msg->security |= (is_smime ? SMIMESIGN : PGPSIGN); } -#if 0 - else { - msg->security &= (is_smime ? ~SMIMESIGN : ~PGPSIGN); - } -#endif *redraw = REDRAW_FULL; break;