X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-crypt%2Fcrypt.c;h=f8cf4716a0c2c206a88398f2228b242326c6d10e;hp=66b8531dbf4837e3d5a4be2ac3da87dd996d977c;hb=4956024f0d540c5dd689444113307fa7f9dd4067;hpb=4761fa78a6dfc9437caa6e6e0aac806e50e01c83 diff --git a/lib-crypt/crypt.c b/lib-crypt/crypt.c index 66b8531..f8cf471 100644 --- a/lib-crypt/crypt.c +++ b/lib-crypt/crypt.c @@ -12,47 +12,26 @@ * please see the file GPL in the top level source directory. */ -#if HAVE_CONFIG_H -# include "config.h" -#endif +#include -#include -#include -#include -#include -#include +#ifdef HAVE_LOCALE_H +# include +#endif +#ifdef HAVE_SYS_RESOURCE_H +# include +#endif #include -#include "mutt.h" +#include +#include + +#include "alias.h" #include "handler.h" -#include "mutt_curses.h" #include "copy.h" #include "crypt.h" #include "pgp.h" - -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_LOCALE_H -#include -#endif - -#ifdef HAVE_SYS_TIME_H -# include -#endif - -#ifdef HAVE_SYS_RESOURCE_H -# include -#endif - - /* print the current time to avoid spoofing of the signature output */ void crypt_current_time (STATE * s, const char *app_name) { @@ -83,7 +62,7 @@ void crypt_forget_passphrase (void) } -#if defined(HAVE_SETRLIMIT) && (!defined(DEBUG)) +#if defined(HAVE_SETRLIMIT) static void disable_coredumps (void) { @@ -103,7 +82,7 @@ int crypt_valid_passphrase (int flags) { int ret = 0; -# if defined(HAVE_SETRLIMIT) &&(!defined(DEBUG)) +# if defined(HAVE_SETRLIMIT) disable_coredumps (); # endif @@ -141,10 +120,8 @@ int mutt_protect (HEADER * msg, char *keylist) } /* otherwise inline won't work...ask for revert */ - if ((i = - query_quadoption (OPT_PGPMIMEAUTO, - _ - ("Message can't be sent inline. Revert to using PGP/MIME?"))) + if ((i = query_quadoption(OPT_PGPMIMEAUTO, + _("Message can't be sent inline. Revert to using PGP/MIME?"))) != M_YES) { mutt_error _("Mail not sent."); @@ -196,7 +173,7 @@ int mutt_protect (HEADER * msg, char *keylist) which tmp_smime_pbody->parts after signing. */ tmp_smime_pbody->parts = tmp_smime_pbody->parts->next; msg->content->next = NULL; - mutt_free_body (&tmp_smime_pbody); + body_list_wipe(&tmp_smime_pbody); } pbody = tmp_pbody; } @@ -210,7 +187,7 @@ int mutt_protect (HEADER * msg, char *keylist) /* remove the outer multipart layer */ tmp_pgp_pbody = mutt_remove_multipart (tmp_pgp_pbody); /* get rid of the signature */ - mutt_free_body (&tmp_pgp_pbody->next); + body_list_wipe(&tmp_pgp_pbody->next); } return (-1); @@ -222,7 +199,7 @@ int mutt_protect (HEADER * msg, char *keylist) */ if (flags != msg->security) { tmp_pgp_pbody = mutt_remove_multipart (tmp_pgp_pbody); - mutt_free_body (&tmp_pgp_pbody->next); + body_list_wipe(&tmp_pgp_pbody->next); } } } @@ -234,162 +211,6 @@ int mutt_protect (HEADER * msg, char *keylist) } - - -int mutt_is_multipart_signed (BODY * b) -{ - char *p; - - if (!b || !(b->type == TYPEMULTIPART) || - !b->subtype || ascii_strcasecmp (b->subtype, "signed")) - return 0; - - if (!(p = mutt_get_parameter ("protocol", b->parameter))) - return 0; - - if (!(ascii_strcasecmp (p, "multipart/mixed"))) - return SIGN; - - if (!(ascii_strcasecmp (p, "application/pgp-signature"))) - return PGPSIGN; - - if (!(ascii_strcasecmp (p, "application/x-pkcs7-signature"))) - return SMIMESIGN; - if (!(ascii_strcasecmp (p, "application/pkcs7-signature"))) - return SMIMESIGN; - - return 0; -} - - -int mutt_is_multipart_encrypted (BODY * b) -{ - char *p; - - if (!b || b->type != TYPEMULTIPART || - !b->subtype || ascii_strcasecmp (b->subtype, "encrypted") || - !(p = mutt_get_parameter ("protocol", b->parameter)) || - ascii_strcasecmp (p, "application/pgp-encrypted")) - return 0; - - return PGPENCRYPT; -} - - -int mutt_is_application_pgp (BODY * m) -{ - int t = 0; - char *p; - - if (m->type == TYPEAPPLICATION) { - if (!ascii_strcasecmp (m->subtype, "pgp") - || !ascii_strcasecmp (m->subtype, "x-pgp-message")) { - if ((p = mutt_get_parameter ("x-action", m->parameter)) - && (!ascii_strcasecmp (p, "sign") - || !ascii_strcasecmp (p, "signclear"))) - t |= PGPSIGN; - - if ((p = mutt_get_parameter ("format", m->parameter)) && - !ascii_strcasecmp (p, "keys-only")) - t |= PGPKEY; - - if (!t) - t |= PGPENCRYPT; /* not necessarily correct, but... */ - } - - if (!ascii_strcasecmp (m->subtype, "pgp-signed")) - t |= PGPSIGN; - - if (!ascii_strcasecmp (m->subtype, "pgp-keys")) - t |= PGPKEY; - } - else if (m->type == TYPETEXT && ascii_strcasecmp ("plain", m->subtype) == 0) { - if (((p = mutt_get_parameter ("x-mutt-action", m->parameter)) - || (p = mutt_get_parameter ("x-action", m->parameter)) - || (p = mutt_get_parameter ("action", m->parameter))) - && !ascii_strncasecmp ("pgp-sign", p, 8)) - t |= PGPSIGN; - else if (p && !ascii_strncasecmp ("pgp-encrypt", p, 11)) - t |= PGPENCRYPT; - else if (p && !ascii_strncasecmp ("pgp-keys", p, 7)) - t |= PGPKEY; - } - if (t) - t |= PGPINLINE; - - return t; -} - -int mutt_is_application_smime (BODY * m) -{ - char *t = NULL; - int len, complain = 0; - - if (!m) - return 0; - - if ((m->type & TYPEAPPLICATION) && m->subtype) { - /* S/MIME MIME types don't need x- anymore, see RFC2311 */ - if (!ascii_strcasecmp (m->subtype, "x-pkcs7-mime") || - !ascii_strcasecmp (m->subtype, "pkcs7-mime")) { - if ((t = mutt_get_parameter ("smime-type", m->parameter))) { - if (!ascii_strcasecmp (t, "enveloped-data")) - return SMIMEENCRYPT; - else if (!ascii_strcasecmp (t, "signed-data")) - return (SMIMESIGN | SMIMEOPAQUE); - else - return 0; - } - /* Netscape 4.7 uses - * Content-Description: S/MIME Encrypted Message - * instead of Content-Type parameter - */ - if (!ascii_strcasecmp (m->description, "S/MIME Encrypted Message")) - return SMIMEENCRYPT; - complain = 1; - } - else if (ascii_strcasecmp (m->subtype, "octet-stream")) - return 0; - - t = mutt_get_parameter ("name", m->parameter); - - if (!t) - t = m->d_filename; - if (!t) - t = m->filename; - if (!t) { - if (complain) - mutt_message (_ - ("S/MIME messages with no hints on content are unsupported.")); - return 0; - } - - /* no .p7c, .p10 support yet. */ - - len = m_strlen(t) - 4; - if (len > 0 && *(t + len) == '.') { - len++; - if (!ascii_strcasecmp ((t + len), "p7m")) -#if 0 - return SMIMEENCRYPT; -#else - /* Not sure if this is the correct thing to do, but - it's required for compatibility with Outlook */ - return (SMIMESIGN | SMIMEOPAQUE); -#endif - else if (!ascii_strcasecmp ((t + len), "p7s")) - return (SMIMESIGN | SMIMEOPAQUE); - } - } - - return 0; -} - - - - - - int crypt_query (BODY * m) { int t = 0; @@ -442,44 +263,31 @@ int crypt_query (BODY * m) } - - -int crypt_write_signed (BODY * a, STATE * s, const char *tempfile) +static void crypt_write_signed(BODY * a, STATE * s, FILE *fp) { - FILE *fp; - int c; - short hadcr; - size_t bytes; - - if (!(fp = safe_fopen (tempfile, "w"))) { - mutt_perror (tempfile); - return -1; - } - - fseeko (s->fpin, a->hdr_offset, 0); - bytes = a->length + a->offset - a->hdr_offset; - hadcr = 0; - while (bytes > 0) { - if ((c = fgetc (s->fpin)) == EOF) - break; - - bytes--; - - if (c == '\r') - hadcr = 1; - else { - if (c == '\n' && !hadcr) - fputc ('\r', fp); - - hadcr = 0; + int c; + short hadcr; + size_t bytes; + + fseeko (s->fpin, a->hdr_offset, 0); + bytes = a->length + a->offset - a->hdr_offset; + hadcr = 0; + while (bytes > 0) { + if ((c = fgetc (s->fpin)) == EOF) + break; + + bytes--; + + if (c == '\r') + hadcr = 1; + else { + if (c == '\n' && !hadcr) + fputc ('\r', fp); + + hadcr = 0; + } + fputc (c, fp); } - - fputc (c, fp); - - } - fclose (fp); - - return 0; } @@ -491,9 +299,9 @@ void convert_to_7bit (BODY * a) if (a->encoding != ENC7BIT) { a->encoding = ENC7BIT; convert_to_7bit (a->parts); - } - else if (option (OPTPGPSTRICTENC)) + } else { convert_to_7bit (a->parts); + } } else if (a->type == TYPEMESSAGE && m_strcasecmp(a->subtype, "delivery-status")) { @@ -505,16 +313,13 @@ void convert_to_7bit (BODY * a) else if (a->encoding == ENCBINARY) a->encoding = ENCBASE64; else if (a->content && a->encoding != ENCBASE64 && - (a->content->from || (a->content->space && - option (OPTPGPSTRICTENC)))) + (a->content->from || a->content->space)) a->encoding = ENCQUOTEDPRINTABLE; a = a->next; } } - - void crypt_extract_keys_from_messages (HEADER * h) { int i; @@ -522,9 +327,9 @@ void crypt_extract_keys_from_messages (HEADER * h) address_t *tmp = NULL; FILE *fpout; - mutt_mktemp (tempfname); - if (!(fpout = safe_fopen (tempfname, "w"))) { - mutt_perror (tempfname); + fpout = m_tempfile(tempfname, sizeof(tempfname), NONULL(MCore.tmpdir), NULL); + if (!fpout) { + mutt_error(_("Could not create temporary file")); return; } @@ -537,7 +342,7 @@ void crypt_extract_keys_from_messages (HEADER * h) if (Context->hdrs[Context->v2r[i]]->security & ENCRYPT && !crypt_valid_passphrase (Context->hdrs[Context->v2r[i]]-> security)) { - fclose (fpout); + m_fclose(&fpout); break; } @@ -608,7 +413,7 @@ void crypt_extract_keys_from_messages (HEADER * h) } } - fclose (fpout); + m_fclose(&fpout); if (isendwin ()) mutt_any_key_to_continue (NULL); @@ -670,6 +475,7 @@ static void crypt_fetch_signatures (BODY ***signatures, BODY * a, int *n) int mutt_signed_handler (BODY * a, STATE * s) { char tempfile[_POSIX_PATH_MAX]; + FILE * tempfp; char *protocol; int protocol_major = TYPEOTHER; char *protocol_minor = NULL; @@ -681,7 +487,7 @@ int mutt_signed_handler (BODY * a, STATE * s) short goodsig = 1; int rc = 0; - protocol = mutt_get_parameter ("protocol", a->parameter); + protocol = parameter_getval(a->parameter, "protocol"); a = a->parts; /* extract the protocol information */ @@ -730,8 +536,12 @@ int mutt_signed_handler (BODY * a, STATE * s) crypt_fetch_signatures (&signatures, a->next, &sigcnt); if (sigcnt) { - mutt_mktemp (tempfile); - if (crypt_write_signed (a, s, tempfile) == 0) { + tempfp = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL); + if (!tempfp) { + mutt_error(_("Could not create temporary file")); + } else { + crypt_write_signed(a, s, tempfp); + m_fclose(&tempfp); for (i = 0; i < sigcnt; i++) { if (signatures[i]->type == TYPEAPPLICATION && !m_strcasecmp(signatures[i]->subtype, "pgp-signature")) {