X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=crypt.cpkg;h=203e685ab436a4a54a0842afc01b5172319ff83f;hp=1350166f147b793188f66670f8c3ec6318d538db;hb=refs%2Fheads%2Ftry-some-d;hpb=1951199b744b2104bf7fe60effe5dd0f455aee9c diff --git a/crypt.cpkg b/crypt.cpkg index 1350166..203e685 100644 --- a/crypt.cpkg +++ b/crypt.cpkg @@ -16,8 +16,7 @@ #include #include -#include -#include +#include #include #include @@ -98,6 +97,19 @@ ** to find out whether an encrypted message is also signed. ** (Crypto only) */ + bool smime_is_default = 0; + /* + ** .pp + ** The default behaviour of Madmutt is to use PGP on all auto-sign/encryption + ** operations. To override and to use OpenSSL instead this must be \fIset\fP. + ** .pp + ** However, this has no effect while replying, since Madmutt will automatically + ** select the same application that was used to sign/encrypt the original + ** message. + ** .pp + ** (Note that this variable can be overridden by unsetting $$crypt_autosmime.) + ** (S/MIME only) + */ quadopt_t verify_sig = M_YES; /* ** .pp @@ -106,6 +118,28 @@ ** If ``\fIno\fP'', never attempt to verify cryptographic signatures. ** (Crypto only) */ + + string_t pgp_entry_format = m_strdup("%4n %t%f %4l/0x%k %-4a %2c %u"); + /* + ** .pp + ** This variable allows you to customize the PGP key selection menu to + ** your personal taste. This string is similar to ``$$index_format'', but + ** has its own set of \fTprintf(3)\fP-like sequences: + ** .pp + ** .dl + ** .dt %n .dd number + ** .dt %k .dd key id + ** .dt %u .dd user id + ** .dt %a .dd algorithm + ** .dt %l .dd key length + ** .dt %f .dd flags + ** .dt %c .dd capabilities + ** .dt %t .dd trust/validity of the key-uid association + ** .dt %[] .dd date of the key where is an \fTstrftime(3)\fP expression + ** .de + ** .pp + ** (PGP only) + */ }; /* Values used for comparing addresses. */ @@ -162,7 +196,7 @@ static void convert_to_7bit (BODY * a) if (a->type == TYPEMULTIPART) { a->encoding = ENC7BIT; convert_to_7bit(a->parts); - } else if (a->type == TYPEMESSAGE && tok == MIME_DELIVERY_STATUS) { + } else if (a->type == TYPEMESSAGE && tok != MIME_DELIVERY_STATUS) { if (a->encoding != ENC7BIT) mutt_message_to_7bit(a, NULL); } else if (a->encoding == ENC8BIT) { @@ -184,7 +218,7 @@ static void print_utf8 (FILE * fp, const char *buf, ssize_t len) char *tstr; tstr = p_dupstr(buf, len); - mutt_convert_string(&tstr, "utf-8", MCharset.charset, M_ICONV_HOOK_FROM); + mutt_convert_string(&tstr, "utf-8", mod_cset.charset, M_ICONV_HOOK_FROM); fputs(tstr, fp); p_delete(&tstr); } @@ -292,7 +326,7 @@ static gpgme_ctx_t create_gpgme_context(int for_smime) if (err) { mutt_error(_("error creating gpgme context: %s\n"), gpgme_strerror(err)); - sleep(2); + mutt_sleep(2); mutt_exit(1); } if (!for_smime) @@ -301,7 +335,7 @@ static gpgme_ctx_t create_gpgme_context(int for_smime) err = gpgme_set_protocol(ctx, GPGME_PROTOCOL_CMS); if (err) { mutt_error(_("error enabling CMS protocol: %s\n"), gpgme_strerror(err)); - sleep(2); + mutt_sleep(2); mutt_exit(1); } return ctx; @@ -318,7 +352,7 @@ static gpgme_data_t create_gpgme_data(void) if (err) { mutt_error(_("error creating gpgme data object: %s\n"), gpgme_strerror(err)); - sleep(2); + mutt_sleep(2); mutt_exit(1); } return data; @@ -436,11 +470,11 @@ static int data_object_to_stream(gpgme_data_t data, FILE *fp) static char *data_object_to_tempfile(gpgme_data_t data, FILE **ret_fp) { int err; - char tempfile[_POSIX_PATH_MAX]; + char tempfile[_POSIX_PATH_MAX], buf[BUFSIZ]; FILE *fp; ssize_t nread = 0; - fp = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL); + fp = m_tempfile(tempfile, sizeof(tempfile), NONULL(mod_core.tmpdir), NULL); if (!fp) { mutt_perror (_("Can't create temporary file")); return NULL; @@ -448,24 +482,21 @@ static char *data_object_to_tempfile(gpgme_data_t data, FILE **ret_fp) err = ((gpgme_data_seek (data, 0, SEEK_SET) == -1) ? gpgme_error_from_errno (errno) : 0); - if (!err) { - char buf[4096]; + if (err) { + mutt_perror(_("Can't create temporary file")); + goto error; + } - while ((nread = gpgme_data_read(data, buf, sizeof(buf)))) { - if (fwrite (buf, nread, 1, fp) != 1) { - mutt_perror (_("Can't create temporary file")); - m_fclose(&fp); - unlink (tempfile); - return NULL; - } + while ((nread = gpgme_data_read(data, buf, sizeof(buf)))) { + if (fwrite (buf, nread, 1, fp) != 1) { + mutt_perror (_("Can't create temporary file")); + goto error; } } if (nread == -1) { mutt_error (_("error reading data object: %s\n"), gpgme_strerror (err)); - unlink (tempfile); - m_fclose(&fp); - return NULL; + goto error; } if (ret_fp) { rewind(fp); @@ -474,6 +505,11 @@ static char *data_object_to_tempfile(gpgme_data_t data, FILE **ret_fp) m_fclose(&fp); } return m_strdup(tempfile); + + error: + m_fclose(&fp); + unlink (tempfile); + return NULL; } @@ -655,7 +691,7 @@ static void print_time(time_t t, STATE *s) char p[STRING]; setlocale(LC_TIME, ""); -#ifdef HAVE_LANGINFO_D_T_FMT +#ifdef D_T_FMT strftime(p, sizeof(p), nl_langinfo(D_T_FMT), localtime(&t)); #else strftime(p, sizeof(p), "%c", localtime(&t)); @@ -1182,7 +1218,6 @@ static int crypt_verify_one(BODY *sigbdy, STATE *s, FILE *fp, int is_smime) state_attach_puts (_("[-- Begin signature information --]\n"), s); err = gpgme_op_verify (ctx, signature, message, NULL); - mutt_need_hard_redraw (); if (err) { char buf[200]; @@ -1545,7 +1580,7 @@ pgp_check_traditional_one_body(FILE *fp, BODY *b, int tagged_only) if (tagged_only && !b->tagged) return 0; - tempfd = m_tempfd(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL); + tempfd = m_tempfd(tempfile, sizeof(tempfile), NONULL(mod_core.tmpdir), NULL); if (mutt_decode_save_attachment (fp, b, tempfd, 0) != 0) { unlink (tempfile); return 0; @@ -1623,7 +1658,7 @@ static void copy_clearsigned(gpgme_data_t data, STATE * s, char *charset) unlink (fname); p_delete(&fname); - fc = fgetconv_open (fp, charset, MCharset.charset, M_ICONV_HOOK_FROM); + fc = fgetconv_open (fp, charset, mod_cset.charset, M_ICONV_HOOK_FROM); for (complete = 1, armor_header = 1; fgetconvs (buf, sizeof (buf), fc) != NULL; @@ -1839,7 +1874,7 @@ int crypt_pgp_application_pgp_handler(BODY *m, STATE *s) int c; rewind (pgpout); - fc = fgetconv_open (pgpout, "utf-8", MCharset.charset, 0); + fc = fgetconv_open (pgpout, "utf-8", mod_cset.charset, 0); while ((c = fgetconv (fc)) != EOF) { state_putc (c, s); if (c == '\n' && s->prefix) @@ -1875,9 +1910,9 @@ int crypt_pgp_application_pgp_handler(BODY *m, STATE *s) if (needpass == -1) { state_attach_puts (_("[-- Error: could not find beginning" " of PGP message! --]\n\n"), s); - return (-1); + return -1; } - return (err); + return err; } /* MIME handler for pgp/mime encrypted messages. */ @@ -1898,18 +1933,18 @@ int crypt_pgp_encrypted_handler (BODY * a, STATE * s) if (s->flags & M_DISPLAY) state_attach_puts (_("[-- Error: malformed PGP/MIME message! --]\n\n"), s); - return (-1); + return -1; } /* Move forward to the application/pgp-encrypted body. */ a = a->next; - fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL); + fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(mod_core.tmpdir), NULL); if (!fpout) { if (s->flags & M_DISPLAY) state_attach_puts (_("[-- Error: could not create temporary file! " "--]\n"), s); - return (-1); + return -1; } tattach = decrypt_part (a, s, fpout, 0, &is_signed); @@ -1951,7 +1986,7 @@ int crypt_pgp_encrypted_handler (BODY * a, STATE * s) m_fclose(&fpout); mutt_unlink (tempfile); - return (rc); + return rc; } /* Support for application/smime */ @@ -1964,12 +1999,12 @@ int crypt_smime_application_smime_handler (BODY * a, STATE * s) int rc = 0; a->warnsig = 0; - fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL); + fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(mod_core.tmpdir), NULL); if (!fpout) { if (s->flags & M_DISPLAY) state_attach_puts (_("[-- Error: could not create temporary file! " "--]\n"), s); - return (-1); + return -1; } tattach = decrypt_part (a, s, fpout, 1, &is_signed); @@ -2015,7 +2050,7 @@ int crypt_smime_application_smime_handler (BODY * a, STATE * s) m_fclose(&fpout); mutt_unlink (tempfile); - return (rc); + return rc; } @@ -2234,8 +2269,8 @@ static void crypt_entry (char *s, ssize_t l, MUTTMENU * menu, int num) entry.key = cryptkey_table[num]; entry.num = num + 1; - m_strformat(s, l, COLS - SW, PgpEntryFormat, crypt_entry_fmt, &entry, - option(OPTARROWCURSOR) ? M_FORMAT_ARROWCURSOR : 0); + m_strformat(s, l, getmaxx(main_w), mod_crypt.pgp_entry_format, + crypt_entry_fmt, &entry, 0); } /* Compare two addresses and the keyid to be used for sorting. */ @@ -2253,8 +2288,7 @@ static int _crypt_compare_address (const void *a, const void *b) static int crypt_compare_address (const void *a, const void *b) { - return ((PgpSortKeys & SORT_REVERSE) ? !_crypt_compare_address (a, b) - : _crypt_compare_address (a, b)); + return !(PgpSortKeys & SORT_REVERSE) == _crypt_compare_address(a, b); } @@ -2273,8 +2307,7 @@ static int _crypt_compare_keyid (const void *a, const void *b) static int crypt_compare_keyid (const void *a, const void *b) { - return ((PgpSortKeys & SORT_REVERSE) ? !_crypt_compare_keyid (a, b) - : _crypt_compare_keyid (a, b)); + return !(PgpSortKeys & SORT_REVERSE) == _crypt_compare_keyid(a, b); } /* Compare 2 creation dates and the addresses. For sorting. */ @@ -2299,8 +2332,7 @@ static int _crypt_compare_date (const void *a, const void *b) static int crypt_compare_date (const void *a, const void *b) { - return ((PgpSortKeys & SORT_REVERSE) ? !_crypt_compare_date (a, b) - : _crypt_compare_date (a, b)); + return !(PgpSortKeys & SORT_REVERSE) == _crypt_compare_date(a, b); } /* Compare two trust values, the key length, the creation dates. the @@ -2341,13 +2373,12 @@ static int _crypt_compare_trust (const void *a, const void *b) if ((r = m_strcasecmp((*s)->uid, (*t)->uid))) return r > 0; - return (m_strcasecmp(crypt_keyid ((*s)), crypt_keyid ((*t)))) > 0; + return m_strcasecmp(crypt_keyid(*s), crypt_keyid(*t)) > 0; } static int crypt_compare_trust (const void *a, const void *b) { - return ((PgpSortKeys & SORT_REVERSE) ? !_crypt_compare_trust (a, b) - : _crypt_compare_trust (a, b)); + return !(PgpSortKeys & SORT_REVERSE) == _crypt_compare_trust(a, b); } /* Print the X.500 Distinguished Name part KEY from the array of parts @@ -2645,7 +2676,7 @@ static void print_key_info (gpgme_key_t key, FILE * fp) tt = key->subkeys->timestamp; tm = localtime (&tt); -#ifdef HAVE_LANGINFO_D_T_FMT +#ifdef D_T_FMT strftime (shortbuf, sizeof shortbuf, nl_langinfo (D_T_FMT), tm); #else strftime (shortbuf, sizeof shortbuf, "%c", tm); @@ -2657,7 +2688,7 @@ static void print_key_info (gpgme_key_t key, FILE * fp) tt = key->subkeys->expires; tm = localtime (&tt); -#ifdef HAVE_LANGINFO_D_T_FMT +#ifdef D_T_FMT strftime (shortbuf, sizeof shortbuf, nl_langinfo (D_T_FMT), tm); #else strftime (shortbuf, sizeof shortbuf, "%c", tm); @@ -2768,7 +2799,7 @@ static void print_key_info (gpgme_key_t key, FILE * fp) tt = subkey->timestamp; tm = localtime (&tt); -#ifdef HAVE_LANGINFO_D_T_FMT +#ifdef D_T_FMT strftime (shortbuf, sizeof shortbuf, nl_langinfo (D_T_FMT), tm); #else strftime (shortbuf, sizeof shortbuf, "%c", tm); @@ -2780,7 +2811,7 @@ static void print_key_info (gpgme_key_t key, FILE * fp) tt = subkey->expires; tm = localtime (&tt); -#ifdef HAVE_LANGINFO_D_T_FMT +#ifdef D_T_FMT strftime (shortbuf, sizeof shortbuf, nl_langinfo (D_T_FMT), tm); #else strftime (shortbuf, sizeof shortbuf, "%c", tm); @@ -2835,7 +2866,7 @@ static void verify_key (cryptkey_t * key) gpgme_key_t k = NULL; int maxdepth = 100; - fp = m_tempfile (tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL); + fp = m_tempfile (tempfile, sizeof(tempfile), NONULL(mod_core.tmpdir), NULL); if (!fp) { mutt_perror (_("Can't create temporary file")); return; @@ -3001,7 +3032,7 @@ static cryptkey_t *crypt_select_key (cryptkey_t * keys, cryptkey_t **cryptkey_table; MUTTMENU *menu; int i, done = 0; - char helpstr[STRING], buf[LONG_STRING]; + char buf[LONG_STRING]; cryptkey_t *k; int (*f) (const void *, const void *); int menu_to_use = 0; @@ -3055,23 +3086,10 @@ static cryptkey_t *crypt_select_key (cryptkey_t * keys, else if (app & APPLICATION_SMIME) menu_to_use = MENU_KEY_SELECT_SMIME; - helpstr[0] = 0; - mutt_make_help (buf, sizeof (buf), _("Exit "), menu_to_use, OP_EXIT); - m_strcat(helpstr, sizeof(helpstr), buf); - mutt_make_help (buf, sizeof (buf), _("Select "), menu_to_use, - OP_GENERIC_SELECT_ENTRY); - m_strcat(helpstr, sizeof(helpstr), buf); - mutt_make_help (buf, sizeof (buf), _("Check key "), - menu_to_use, OP_VERIFY_KEY); - m_strcat(helpstr, sizeof(helpstr), buf); - mutt_make_help (buf, sizeof (buf), _("Help"), menu_to_use, OP_HELP); - m_strcat(helpstr, sizeof(helpstr), buf); - menu = mutt_new_menu (); menu->max = i; menu->make_entry = crypt_entry; menu->menu = menu_to_use; - menu->help = helpstr; menu->data = cryptkey_table; { @@ -3380,6 +3398,23 @@ crypt_ask_for_key(const char *tag, int abilities, int app, int *forced_valid) } } +static char *crypt_hook(address_t *adr) +{ + char *res = NULL; + lua_State *L = luaM_getruntime(); + lua_getglobal(L, "mod_core"); /* push mod_core 1 */ + lua_getfield(L, -1, "crypt_hook"); /* push folder_hook() 2 */ + if (lua_isfunction(L, -1)) { + lua_pushstring(L, adr->mailbox); + if (!lua_pcall(L, 1, 1, 0)) { + res = m_strdup(lua_tostring(L, -1)); + } + lua_pop(L, 1); + } + lua_pop(L, 2); + return res; +} + /* 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(ENVELOPE *env, unsigned int app) @@ -3402,10 +3437,10 @@ static char *find_keys(ENVELOPE *env, unsigned int app) while ((addr = address_list_pop(&lst))) { char buf[STRING]; int forced_valid = 0; - const char *keyID; + char *keyID; cryptkey_t *key = NULL; - if ((keyID = mutt_crypt_hook(addr))) { + if ((keyID = crypt_hook(addr))) { int r; snprintf(buf, sizeof(buf), _("Use keyID = \"%s\" for %s?"), keyID, @@ -3416,6 +3451,7 @@ static char *find_keys(ENVELOPE *env, unsigned int app) address_list_wipe(&lst); address_list_wipe(&addr); buffer_delete(&keylist); + p_delete(&keyID); return NULL; } @@ -3432,6 +3468,7 @@ static char *find_keys(ENVELOPE *env, unsigned int app) } } } + p_delete(&keyID); if (!key) { key = crypt_getkeybyaddr(addr, KEYFLAG_CANENCRYPT, app, &forced_valid); @@ -3663,16 +3700,6 @@ void crypt_pgp_extract_keys_from_attachment_list(FILE * fp, int tag, BODY * top) } } -void crypt_invoke_message (int type) -{ - if (type & APPLICATION_PGP) { - mutt_message _("Invoking PGP..."); - } - else if (type & APPLICATION_SMIME) { - mutt_message _("Invoking S/MIME..."); - } -} - int mutt_protect (HEADER * msg, char *keylist) { BODY *pbody = NULL, *tmp_pbody = NULL; @@ -3714,7 +3741,7 @@ int mutt_protect (HEADER * msg, char *keylist) if (!(tmp_pbody = crypt_smime_build_smime_entity (tmp_smime_pbody, keylist))) { /* signed ? free it! */ - return (-1); + return -1; } /* free tmp_body if messages was signed AND encrypted ... */ if (tmp_smime_pbody != msg->content && tmp_smime_pbody != tmp_pbody) { @@ -3739,7 +3766,7 @@ int mutt_protect (HEADER * msg, char *keylist) body_list_wipe(&tmp_pgp_pbody->next); } - return (-1); + return -1; } /* destroy temporary signature envelope when doing retainable @@ -4004,7 +4031,47 @@ int mutt_signed_handler(BODY *a, STATE *s) if (s->flags & M_DISPLAY && sigcnt) state_attach_puts (_("\n[-- End of signed data --]\n"), s); - return (rc); + return rc; +} + +static int _mutt_check_traditional_pgp (HEADER * h, int *redraw) +{ + MESSAGE *msg; + int rv = 0; + + h->security |= PGP_TRADITIONAL_CHECKED; + + mutt_parse_mime_message (Context, h); + if ((msg = mx_open_message (Context, h->msgno)) == NULL) + return 0; + if (crypt_pgp_check_traditional (msg->fp, h->content, 0)) { + h->security = crypt_query (h->content); + *redraw |= REDRAW_FULL; + rv = 1; + } + + h->security |= PGP_TRADITIONAL_CHECKED; + mx_close_message (&msg); + return rv; +} + +int mutt_check_traditional_pgp (HEADER * h, int *redraw) +{ + int i; + int rv = 0; + + if (h && !(h->security & PGP_TRADITIONAL_CHECKED)) + rv = _mutt_check_traditional_pgp (h, redraw); + else { + for (i = 0; i < Context->vcount; i++) + if (Context->hdrs[Context->v2r[i]]->tagged && + !(Context->hdrs[Context->v2r[i]]-> + security & PGP_TRADITIONAL_CHECKED)) + rv = + _mutt_check_traditional_pgp (Context->hdrs[Context->v2r[i]], redraw) + || rv; + } + return rv; } /* vim:set ft=c: */