/*
+ * Copyright notice from original mutt:
* Copyright (C) 1996-2002 Michael R. Elkins <me@mutt.org>
* Copyright (C) 1999-2000 Thomas Roessler <roessler@does-not-exist.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
- */
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
+ */
-#include "mutt.h"
-#include "mutt_menu.h"
-#include "rfc1524.h"
-#include "mime.h"
-#include "mailbox.h"
-#include "mapping.h"
-#include "sort.h"
-#ifdef USE_IMAP
-#include "mx.h"
-#include "imap.h"
+#if HAVE_CONFIG_H
+# include "config.h"
#endif
-#include "mutt_crypt.h"
#include <ctype.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
+#include <lib-lib/mem.h>
+#include <lib-lib/str.h>
+#include <lib-lib/ascii.h>
+#include <lib-lib/macros.h>
+#include <lib-lib/file.h>
+#include <lib-lib/mapping.h>
+
+#include <lib-mime/mime.h>
+
+#include <lib-ui/enter.h>
+#include <lib-ui/menu.h>
+
+#include "mutt.h"
+#include "handler.h"
+#include "rfc1524.h"
+#include "sort.h"
+#include "thread.h"
+#include "mx.h"
+#include <lib-crypt/crypt.h>
+
+#include <imap/imap.h>
+#include <imap/mx_imap.h>
+
static struct mapping_t PostponeHelp[] = {
- { N_("Exit"), OP_EXIT },
- { N_("Del"), OP_DELETE },
- { N_("Undel"), OP_UNDELETE },
- { N_("Help"), OP_HELP },
- { NULL }
+ {N_("Exit"), OP_EXIT},
+ {N_("Del"), OP_DELETE},
+ {N_("Undel"), OP_UNDELETE},
+ {N_("Help"), OP_HELP},
+ {NULL, OP_NULL}
};
static time_t LastModify = 0;
static char *OldPostponed = NULL;
- if (UpdateNumPostponed)
- {
+ if (UpdateNumPostponed) {
UpdateNumPostponed = 0;
force = 1;
}
- if (Postponed != OldPostponed)
- {
+ if (Postponed != OldPostponed) {
OldPostponed = Postponed;
LastModify = 0;
force = 1;
if (!Postponed)
return 0;
-#ifdef USE_IMAP
/* LastModify is useless for IMAP */
- if (mx_is_imap (Postponed))
- {
- if (force)
- {
+ if (imap_is_magic (Postponed, NULL) == M_IMAP) {
+ if (force) {
short newpc;
newpc = imap_mailbox_check (Postponed, 0);
- if (newpc >= 0)
- {
- PostCount = newpc;
- dprint (2, (debugfile, "mutt_num_postponed: %d postponed IMAP messages found.\n", PostCount));
+ if (newpc >= 0) {
+ PostCount = newpc;
}
- else
- dprint (2, (debugfile, "mutt_num_postponed: using old IMAP postponed count.\n"));
}
return PostCount;
}
-#endif
- if (stat (Postponed, &st) == -1)
- {
- PostCount = 0;
- LastModify = 0;
- return (0);
+ if (stat (Postponed, &st) == -1) {
+ PostCount = 0;
+ LastModify = 0;
+ return (0);
}
- if (S_ISDIR (st.st_mode))
- {
+ if (S_ISDIR (st.st_mode)) {
/* if we have a maildir mailbox, we need to stat the "new" dir */
char buf[_POSIX_PATH_MAX];
snprintf (buf, sizeof (buf), "%s/new", Postponed);
- if (access (buf, F_OK) == 0 && stat (buf, &st) == -1)
- {
+ if (access (buf, F_OK) == 0 && stat (buf, &st) == -1) {
PostCount = 0;
LastModify = 0;
return 0;
}
}
- if (LastModify < st.st_mtime)
- {
+ if (LastModify < st.st_mtime) {
#ifdef USE_NNTP
int optnews = option (OPTNEWS);
#endif
return (PostCount = 0);
#ifdef USE_NNTP
if (optnews)
- unset_option (OPTNEWS);
+ unset_option (OPTNEWS);
#endif
if (mx_open_mailbox (Postponed, M_NOSORT | M_QUIET, &ctx) == NULL)
PostCount = 0;
mx_fastclose_mailbox (&ctx);
#ifdef USE_NNTP
if (optnews)
- set_option (OPTNEWS);
+ set_option (OPTNEWS);
#endif
}
UpdateNumPostponed = 1;
}
-static void post_entry (char *s, size_t slen, MUTTMENU *menu, int entry)
+static void post_entry (char *s, ssize_t slen, MUTTMENU * menu, int entry)
{
CONTEXT *ctx = (CONTEXT *) menu->data;
_mutt_make_string (s, slen, NONULL (HdrFmt), ctx, ctx->hdrs[entry],
- M_FORMAT_ARROWCURSOR);
+ M_FORMAT_ARROWCURSOR);
}
static HEADER *select_msg (void)
{
MUTTMENU *menu;
- int i, done=0, r=-1;
+ int i, done = 0, r = -1;
char helpstr[SHORT_STRING];
short orig_sort;
menu->max = PostContext->msgcount;
menu->title = _("Postponed Messages");
menu->data = PostContext;
- menu->help = mutt_compile_help (helpstr, sizeof (helpstr), MENU_POST, PostponeHelp);
+ menu->help =
+ mutt_compile_help (helpstr, sizeof (helpstr), MENU_POST, PostponeHelp);
/* The postponed mailbox is setup to have sorting disabled, but the global
* Sort variable may indicate something different. Sorting has to be
* disabled while the postpone menu is being displayed. */
orig_sort = Sort;
Sort = SORT_ORDER;
-
- while (!done)
- {
- switch (i = mutt_menuLoop (menu))
- {
- case OP_DELETE:
- case OP_UNDELETE:
- mutt_set_flag (PostContext, PostContext->hdrs[menu->current], M_DELETE, (i == OP_DELETE) ? 1 : 0);
- PostCount = PostContext->msgcount - PostContext->deleted;
- if (option (OPTRESOLVE) && menu->current < menu->max - 1)
- {
- menu->oldcurrent = menu->current;
- menu->current++;
- if (menu->current >= menu->top + menu->pagelen)
- {
- menu->top = menu->current;
- menu->redraw = REDRAW_INDEX | REDRAW_STATUS;
- }
- else
- menu->redraw |= REDRAW_MOTION_RESYNCH;
- }
- else
- menu->redraw = REDRAW_CURRENT;
- break;
-
- case OP_GENERIC_SELECT_ENTRY:
- r = menu->current;
- done = 1;
- break;
-
- case OP_EXIT:
- done = 1;
- break;
+
+ while (!done) {
+ switch (i = mutt_menuLoop (menu)) {
+ case OP_DELETE:
+ case OP_UNDELETE:
+ mutt_set_flag (PostContext, PostContext->hdrs[menu->current], M_DELETE,
+ (i == OP_DELETE) ? 1 : 0);
+ PostCount = PostContext->msgcount - PostContext->deleted;
+ if (option (OPTRESOLVE) && menu->current < menu->max - 1) {
+ menu->oldcurrent = menu->current;
+ menu->current++;
+ if (menu->current >= menu->top + menu->pagelen) {
+ menu->top = menu->current;
+ menu->redraw = REDRAW_INDEX | REDRAW_STATUS;
+ }
+ else
+ menu->redraw |= REDRAW_MOTION_RESYNCH;
+ }
+ else
+ menu->redraw = REDRAW_CURRENT;
+ break;
+
+ case OP_GENERIC_SELECT_ENTRY:
+ r = menu->current;
+ done = 1;
+ break;
+
+ case OP_EXIT:
+ done = 1;
+ break;
}
}
* 0 normal exit
* SENDREPLY recalled message is a reply
*/
-int mutt_get_postponed (CONTEXT *ctx, HEADER *hdr, HEADER **cur, char *fcc, size_t fcclen)
+int mutt_get_postponed (CONTEXT * ctx, HEADER * hdr, HEADER ** cur, char *fcc,
+ ssize_t fcclen)
{
HEADER *h;
int code = SENDPOSTPONED;
- LIST *tmp;
- LIST *last = NULL;
- LIST *next;
+ string_list_t *tmp;
+ string_list_t *last = NULL;
+ string_list_t *next;
char *p;
int opt_delete;
if (!Postponed)
return (-1);
- if ((PostContext = mx_open_mailbox (Postponed, M_NOSORT, NULL)) == NULL)
- {
+ if ((PostContext = mx_open_mailbox (Postponed, M_NOSORT, NULL)) == NULL) {
PostCount = 0;
mutt_error _("No postponed messages.");
+
return (-1);
}
-
- if (! PostContext->msgcount)
- {
+
+ if (!PostContext->msgcount) {
PostCount = 0;
mx_close_mailbox (PostContext, NULL);
- FREE (&PostContext);
+ p_delete(&PostContext);
mutt_error _("No postponed messages.");
+
return (-1);
}
- if (PostContext->msgcount == 1)
- {
+ if (PostContext->msgcount == 1) {
/* only one message, so just use that one. */
h = PostContext->hdrs[0];
}
- else if ((h = select_msg ()) == NULL)
- {
+ else if ((h = select_msg ()) == NULL) {
mx_close_mailbox (PostContext, NULL);
- FREE (&PostContext);
+ p_delete(&PostContext);
return (-1);
}
- if (mutt_prepare_template (NULL, PostContext, hdr, h, 0) < 0)
- {
+ if (mutt_prepare_template (NULL, PostContext, hdr, h, 0) < 0) {
mx_fastclose_mailbox (PostContext);
- FREE (&PostContext);
+ p_delete(&PostContext);
return (-1);
}
mx_close_mailbox (PostContext, NULL);
set_quadoption (OPT_DELETE, opt_delete);
- FREE (&PostContext);
-
- for (tmp = hdr->env->userhdrs; tmp; )
- {
- if (ascii_strncasecmp ("X-Mutt-References:", tmp->data, 18) == 0)
- {
- if (ctx)
- {
- /* if a mailbox is currently open, look to see if the orignal message
- the user attempted to reply to is in this mailbox */
- p = tmp->data + 18;
- SKIPWS (p);
- if (!ctx->id_hash)
- ctx->id_hash = mutt_make_id_hash (ctx);
- *cur = hash_find (ctx->id_hash, p);
+ p_delete(&PostContext);
+
+ for (tmp = hdr->env->userhdrs; tmp;) {
+ if (ascii_strncasecmp ("X-Mutt-References:", tmp->data, 18) == 0) {
+ if (ctx) {
+ /* if a mailbox is currently open, look to see if the orignal message
+ the user attempted to reply to is in this mailbox */
+ p = vskipspaces(tmp->data + 18);
+ if (!ctx->id_hash)
+ ctx->id_hash = mutt_make_id_hash (ctx);
+ *cur = hash_find (ctx->id_hash, p);
}
/* Remove the X-Mutt-References: header field. */
next = tmp->next;
if (last)
- last->next = tmp->next;
+ last->next = tmp->next;
else
- hdr->env->userhdrs = tmp->next;
+ hdr->env->userhdrs = tmp->next;
tmp->next = NULL;
- mutt_free_list (&tmp);
+ string_list_wipe(&tmp);
tmp = next;
if (*cur)
- code |= SENDREPLY;
+ code |= SENDREPLY;
}
- else if (ascii_strncasecmp ("X-Mutt-Fcc:", tmp->data, 11) == 0)
- {
- p = tmp->data + 11;
- SKIPWS (p);
- strfcpy (fcc, p, fcclen);
+ else if (ascii_strncasecmp ("X-Mutt-Fcc:", tmp->data, 11) == 0) {
+ p = vskipspaces(tmp->data + 11);
+ m_strcpy(fcc, fcclen, p);
mutt_pretty_mailbox (fcc);
/* remove the X-Mutt-Fcc: header field */
next = tmp->next;
if (last)
- last->next = tmp->next;
+ last->next = tmp->next;
else
- hdr->env->userhdrs = tmp->next;
+ hdr->env->userhdrs = tmp->next;
tmp->next = NULL;
- mutt_free_list (&tmp);
+ string_list_wipe(&tmp);
tmp = next;
}
- else if ((WithCrypto & APPLICATION_PGP)
- && (mutt_strncmp ("Pgp:", tmp->data, 4) == 0 /* this is generated
- * by old mutt versions
- */
- || mutt_strncmp ("X-Mutt-PGP:", tmp->data, 11) == 0))
- {
+ else if ((m_strncmp("Pgp:", tmp->data, 4) == 0 /* this is generated
+ * by old mutt versions
+ */
+ || m_strncmp("X-Mutt-PGP:", tmp->data, 11) == 0)) {
hdr->security = mutt_parse_crypt_hdr (strchr (tmp->data, ':') + 1, 1);
hdr->security |= APPLICATION_PGP;
-
+
/* remove the pgp field */
next = tmp->next;
if (last)
- last->next = tmp->next;
+ last->next = tmp->next;
else
- hdr->env->userhdrs = tmp->next;
+ hdr->env->userhdrs = tmp->next;
tmp->next = NULL;
- mutt_free_list (&tmp);
+ string_list_wipe(&tmp);
tmp = next;
}
- else if ((WithCrypto & APPLICATION_SMIME)
- && mutt_strncmp ("X-Mutt-SMIME:", tmp->data, 13) == 0)
- {
+ else if (m_strncmp("X-Mutt-SMIME:", tmp->data, 13) == 0) {
hdr->security = mutt_parse_crypt_hdr (strchr (tmp->data, ':') + 1, 1);
hdr->security |= APPLICATION_SMIME;
-
+
/* remove the smime field */
next = tmp->next;
if (last)
- last->next = tmp->next;
+ last->next = tmp->next;
else
- hdr->env->userhdrs = tmp->next;
+ hdr->env->userhdrs = tmp->next;
tmp->next = NULL;
- mutt_free_list (&tmp);
+ string_list_wipe(&tmp);
tmp = next;
}
#ifdef MIXMASTER
- else if (mutt_strncmp ("X-Mutt-Mix:", tmp->data, 11) == 0)
- {
+ else if (m_strncmp("X-Mutt-Mix:", tmp->data, 11) == 0) {
char *t;
- mutt_free_list (&hdr->chain);
-
+
+ string_list_wipe(&hdr->chain);
+
t = strtok (tmp->data + 11, " \t\n");
- while (t)
- {
- hdr->chain = mutt_add_list (hdr->chain, t);
- t = strtok (NULL, " \t\n");
+ while (t) {
+ hdr->chain = mutt_add_list (hdr->chain, t);
+ t = strtok (NULL, " \t\n");
}
-
+
next = tmp->next;
- if (last)
- last->next = tmp->next;
+ if (last)
+ last->next = tmp->next;
else
- hdr->env->userhdrs = tmp->next;
+ hdr->env->userhdrs = tmp->next;
tmp->next = NULL;
- mutt_free_list (&tmp);
+ string_list_wipe(&tmp);
tmp = next;
}
#endif
- else
- {
+ else {
last = tmp;
tmp = tmp->next;
}
char pgp_sign_as[LONG_STRING] = "\0", *q;
char smime_cryptalg[LONG_STRING] = "\0";
- if (!WithCrypto)
- return 0;
-
- SKIPWS (p);
- for (; *p; p++)
- {
-
- switch (*p)
- {
- case 'e':
- case 'E':
- pgp |= ENCRYPT;
- break;
-
- case 's':
- case 'S':
- pgp |= SIGN;
- q = pgp_sign_as;
-
- if (*(p+1) == '<')
- {
- for (p += 2;
- *p && *p != '>' && q < pgp_sign_as + sizeof (pgp_sign_as) - 1;
- *q++ = *p++)
- ;
-
- if (*p!='>')
- {
- mutt_error _("Illegal PGP header");
- return 0;
- }
+ for (p = vskipspaces(p); *p; p++) {
+ switch (*p) {
+ case 'e':
+ case 'E':
+ pgp |= ENCRYPT;
+ break;
+
+ case 's':
+ case 'S':
+ pgp |= SIGN;
+ q = pgp_sign_as;
+
+ if (*(p + 1) == '<') {
+ for (p += 2;
+ *p && *p != '>' && q < pgp_sign_as + sizeof (pgp_sign_as) - 1;
+ *q++ = *p++);
+
+ if (*p != '>') {
+ mutt_error _("Illegal PGP header");
+
+ return 0;
}
-
- *q = '\0';
- break;
+ }
+
+ *q = '\0';
+ break;
/* This used to be the micalg parameter.
*
* It's no longer needed, so we just skip the parameter in order
* to be able to recall old messages.
*/
- case 'm':
- case 'M':
- if(*(p+1) == '<')
- {
- for (p += 2; *p && *p != '>'; p++)
- ;
- if(*p != '>')
- {
- mutt_error _("Illegal PGP header");
- return 0;
- }
- }
-
- break;
-
-
- case 'c':
- case 'C':
- q = smime_cryptalg;
-
- if(*(p+1) == '<')
- {
- for(p += 2; *p && *p != '>' && q < smime_cryptalg + sizeof(smime_cryptalg) - 1;
- *q++ = *p++)
- ;
-
- if(*p != '>')
- {
- mutt_error _("Illegal S/MIME header");
- return 0;
- }
- }
-
- *q = '\0';
- break;
-
- default:
- mutt_error _("Illegal PGP header");
- return 0;
+ case 'm':
+ case 'M':
+ if (*(p + 1) == '<') {
+ for (p += 2; *p && *p != '>'; p++);
+ if (*p != '>') {
+ mutt_error _("Illegal PGP header");
+
+ return 0;
+ }
+ }
+
+ break;
+
+
+ case 'c':
+ case 'C':
+ q = smime_cryptalg;
+
+ if (*(p + 1) == '<') {
+ for (p += 2;
+ *p && *p != '>'
+ && q < smime_cryptalg + sizeof (smime_cryptalg) - 1;
+ *q++ = *p++);
+
+ if (*p != '>') {
+ mutt_error _("Illegal S/MIME header");
+
+ return 0;
+ }
+ }
+
+ *q = '\0';
+ break;
+
+ case 'i':
+ case 'I':
+ pgp |= INLINE;
+ break;
+
+ default:
+ mutt_error _("Illegal PGP header");
+ return 0;
}
-
+
}
-
+
/* the cryptalg field must not be empty */
- if ((WithCrypto & APPLICATION_SMIME) && *smime_cryptalg)
- mutt_str_replace (&SmimeCryptAlg, smime_cryptalg);
+ if (*smime_cryptalg)
+ m_strreplace(&SmimeCryptAlg, smime_cryptalg);
- if ((WithCrypto & APPLICATION_PGP) && (set_signas || *pgp_sign_as))
- mutt_str_replace (&PgpSignAs, pgp_sign_as);
+ if (set_signas || *pgp_sign_as)
+ m_strreplace(&PgpSignAs, pgp_sign_as);
return pgp;
}
-int mutt_prepare_template (FILE *fp, CONTEXT *ctx, HEADER *newhdr, HEADER *hdr,
- short weed)
+int mutt_prepare_template (FILE * fp, CONTEXT * ctx, HEADER * newhdr,
+ HEADER * hdr, short weed)
{
MESSAGE *msg = NULL;
char file[_POSIX_PATH_MAX];
BODY *b;
FILE *bfp;
-
+
int rv = -1;
STATE s;
-
- memset (&s, 0, sizeof (s));
-
+
+ p_clear(&s, 1);
+
if (!fp && (msg = mx_open_message (ctx, hdr->msgno)) == NULL)
return (-1);
- if (!fp) fp = msg->fp;
+ if (!fp)
+ fp = msg->fp;
bfp = fp;
/* parse the message header and MIME structure */
- fseek (fp, hdr->offset, 0);
+ fseeko (fp, hdr->offset, 0);
newhdr->offset = hdr->offset;
newhdr->env = mutt_read_rfc822_header (fp, newhdr, 1, weed);
newhdr->content->length = hdr->content->length;
mutt_parse_part (fp, newhdr->content);
- FREE (&newhdr->env->message_id);
- FREE (&newhdr->env->mail_followup_to); /* really? */
+ p_delete(&newhdr->env->message_id);
+ p_delete(&newhdr->env->mail_followup_to); /* really? */
/* decrypt pgp/mime encoded messages */
- /* XXX - what happens with S/MIME encrypted messages?!?!? - tlr, 020909*/
- if ((WithCrypto & APPLICATION_PGP)
- && (hdr->security & APPLICATION_PGP)
+
+ if ((APPLICATION_PGP | APPLICATION_SMIME) & hdr->security
&& mutt_is_multipart_encrypted (newhdr->content))
{
- newhdr->security |= PGPENCRYPT;
- if (!crypt_valid_passphrase(APPLICATION_PGP))
+ int ccap = (APPLICATION_PGP | APPLICATION_SMIME) & hdr->security;
+ newhdr->security |= ENCRYPT | ccap;
+ if (!crypt_valid_passphrase (ccap))
goto err;
- mutt_message _("Invoking PGP...");
- if (crypt_pgp_decrypt_mime (fp, &bfp, newhdr->content, &b) == -1 || b == NULL)
- {
- err:
+ mutt_message _("Decrypting message...");
+
+ if (((ccap & APPLICATION_PGP)
+ && crypt_pgp_decrypt_mime (fp, &bfp, newhdr->content, &b) == -1)
+ || ((ccap & APPLICATION_SMIME)
+ && crypt_smime_decrypt_mime (fp, &bfp, newhdr->content, &b) == -1)
+ || b == NULL) {
+ err:
mx_close_message (&msg);
- mutt_free_envelope (&newhdr->env);
+ envelope_delete(&newhdr->env);
mutt_free_body (&newhdr->content);
mutt_error _("Decryption failed.");
+
return -1;
}
* remove a potential multipart/signed layer - useful when
* resending messages
*/
-
- if (WithCrypto && mutt_is_multipart_signed (newhdr->content))
- {
+
+ if (mutt_is_multipart_signed (newhdr->content)) {
newhdr->security |= SIGN;
- if ((WithCrypto & APPLICATION_PGP)
- && ascii_strcasecmp (mutt_get_parameter ("protocol", newhdr->content->parameter), "application/pgp-signature") == 0)
+ if (ascii_strcasecmp (mutt_get_parameter
+ ("protocol", newhdr->content->parameter),
+ "application/pgp-signature") == 0)
newhdr->security |= APPLICATION_PGP;
- else if ((WithCrypto & APPLICATION_SMIME))
+ else
newhdr->security |= APPLICATION_SMIME;
-
+
/* destroy the signature */
mutt_free_body (&newhdr->content->parts->next);
newhdr->content = mutt_remove_multipart (newhdr->content);
}
+
/*
* We don't need no primary multipart.
* Note: We _do_ preserve messages!
newhdr->content = mutt_remove_multipart (newhdr->content);
s.fpin = bfp;
-
+
/* create temporary files for all attachments */
- for (b = newhdr->content; b; b = b->next)
- {
-
+ for (b = newhdr->content; b; b = b->next) {
+
/* what follows is roughly a receive-mode variant of
* mutt_get_tmp_attachment () from muttlib.c
*/
file[0] = '\0';
- if (b->filename)
- {
- strfcpy (file, b->filename, sizeof (file));
- b->d_filename = safe_strdup (b->filename);
+ if (b->filename) {
+ m_strcpy(file, sizeof(file), b->filename);
+ b->d_filename = m_strdup(b->filename);
}
- else
- {
+ else {
/* avoid Content-Disposition: header with temporary filename */
b->use_disp = 0;
}
s.flags = 0;
- if (b->type == TYPETEXT)
- {
- if (!ascii_strcasecmp ("yes", mutt_get_parameter ("x-mutt-noconv", b->parameter)))
- b->noconv = 1;
- else
- {
- s.flags |= M_CHARCONV;
- b->noconv = 0;
+ if (b->type == TYPETEXT) {
+ if (!ascii_strcasecmp
+ ("yes", mutt_get_parameter ("x-mutt-noconv", b->parameter)))
+ b->noconv = 1;
+ else {
+ s.flags |= M_CHARCONV;
+ b->noconv = 0;
}
mutt_delete_parameter ("x-mutt-noconv", &b->parameter);
}
- mutt_adv_mktemp (file, sizeof(file));
+ mutt_adv_mktemp (NULL, file, sizeof (file));
if ((s.fpout = safe_fopen (file, "w")) == NULL)
goto bail;
-
- mutt_decode_attachment (b, &s);
+
+ if (mutt_is_application_pgp (b) & (ENCRYPT | SIGN)) {
+
+ mutt_body_handler (b, &s);
+
+ newhdr->security |= mutt_is_application_pgp (newhdr->content);
+
+ b->type = TYPETEXT;
+ m_strreplace(&b->subtype, "plain");
+ mutt_delete_parameter ("x-action", &b->parameter);
+ }
+ else
+ mutt_decode_attachment (b, &s);
if (safe_fclose (&s.fpout) != 0)
goto bail;
- mutt_str_replace (&b->filename, file);
+ m_strreplace(&b->filename, file);
b->unlink = 1;
mutt_stamp_attachment (b);
mutt_free_body (&b->parts);
- if (b->hdr) b->hdr->content = NULL; /* avoid dangling pointer */
+ if (b->hdr)
+ b->hdr->content = NULL; /* avoid dangling pointer */
+ }
+
+ /* Fix encryption flags. */
+
+ /* No inline if multipart. */
+ if ((newhdr->security & INLINE) && newhdr->content->next)
+ newhdr->security &= ~INLINE;
+
+ /* Theoretically, both could be set. Take the one the user wants to set by default. */
+ if ((newhdr->security & APPLICATION_PGP)
+ && (newhdr->security & APPLICATION_SMIME)) {
+ if (option (OPTSMIMEISDEFAULT))
+ newhdr->security &= ~APPLICATION_PGP;
+ else
+ newhdr->security &= ~APPLICATION_SMIME;
}
rv = 0;
-
- bail:
-
+
+bail:
+
/* that's it. */
- if (bfp != fp) fclose (bfp);
- if (msg) mx_close_message (&msg);
-
- if (rv == -1)
- {
- mutt_free_envelope (&newhdr->env);
+ if (bfp != fp)
+ fclose (bfp);
+ if (msg)
+ mx_close_message (&msg);
+
+ if (rv == -1) {
+ envelope_delete(&newhdr->env);
mutt_free_body (&newhdr->content);
}
-
+
return rv;
}