X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=commands.c;h=3eea9046b8094bf44ad612799604b1a9323fd1c4;hp=da3bc5007e47c94c2e9d7030944aa2f837bdae9a;hb=ca1036a5694287e6ccf6d95af9e33a7e1d5a75fd;hpb=e272a1bd50cf1dba38067899500593aa148c88a5 diff --git a/commands.c b/commands.c index da3bc50..3eea904 100644 --- a/commands.c +++ b/commands.c @@ -13,6 +13,9 @@ #endif #include "mutt.h" +#include "enter.h" +#include "recvattach.h" +#include "ascii.h" #include "mutt_curses.h" #include "mutt_menu.h" #include "mime.h" @@ -61,8 +64,9 @@ int mutt_display_message (HEADER * cur) int cmflags = M_CM_DECODE | M_CM_DISPLAY | M_CM_CHARCONV; FILE *fpout = NULL; FILE *fpfilterout = NULL; + MESSAGE *msg = NULL; pid_t filterpid = -1; - int res; + int res = 0; snprintf (buf, sizeof (buf), "%s/%s", TYPE (cur->content), cur->content->subtype); @@ -70,38 +74,6 @@ int mutt_display_message (HEADER * cur) mutt_parse_mime_message (Context, cur); mutt_message_hook (Context, cur, M_MESSAGEHOOK); - /* see if crytpo is needed for this message. if so, we should exit curses */ - if (WithCrypto && cur->security) { - if (cur->security & ENCRYPT) { - if (cur->security & APPLICATION_SMIME) - crypt_smime_getkeys (cur->env); - if (!crypt_valid_passphrase (cur->security)) - return 0; - - cmflags |= M_CM_VERIFY; - } - else if (cur->security & SIGN) { - /* find out whether or not the verify signature */ - if (query_quadoption (OPT_VERIFYSIG, _("Verify PGP signature?")) == - M_YES) { - cmflags |= M_CM_VERIFY; - } - } - } - - if (cmflags & M_CM_VERIFY || cur->security & ENCRYPT) { - if (cur->security & APPLICATION_PGP) { - if (cur->env->from) - crypt_pgp_invoke_getkeys (cur->env->from); - - crypt_invoke_message (APPLICATION_PGP); - } - - if (cur->security & APPLICATION_SMIME) - crypt_invoke_message (APPLICATION_SMIME); - } - - mutt_mktemp (tempfile); if ((fpout = safe_fopen (tempfile, "w")) == NULL) { mutt_error _("Could not create temporary file!"); @@ -123,7 +95,7 @@ int mutt_display_message (HEADER * cur) } } - if (!Pager || safe_strcmp (Pager, "builtin") == 0) + if (!Pager || str_cmp (Pager, "builtin") == 0) builtin = 1; else { mutt_make_string (buf, sizeof (buf), NONULL (PagerFmt), Context, cur); @@ -131,9 +103,52 @@ int mutt_display_message (HEADER * cur) fputs ("\n\n", fpout); } - res = mutt_copy_message (fpout, Context, cur, cmflags, - (option (OPTWEED) ? (CH_WEED | CH_REORDER) : 0) | - CH_DECODE | CH_FROM); + msg = mx_open_message (Context, cur->msgno); + if (msg == NULL) res = -1; + + if (res != -1) { + /* see if crytpo is needed for this message. if so, we should exit curses */ + if (WithCrypto && cur->security) { + if (cur->security & ENCRYPT) { + if (cur->security & APPLICATION_SMIME) + crypt_smime_getkeys (cur->env); + if (!crypt_valid_passphrase (cur->security)) + return 0; + + cmflags |= M_CM_VERIFY; + } + else if (cur->security & SIGN) { + /* find out whether or not the verify signature */ + if (query_quadoption (OPT_VERIFYSIG, _("Verify PGP signature?")) == + M_YES) { + cmflags |= M_CM_VERIFY; + } + } + } + + if (cmflags & M_CM_VERIFY || cur->security & ENCRYPT) { + if (cur->security & APPLICATION_PGP) { + if (cur->env->from) + crypt_pgp_invoke_getkeys (cur->env->from); + + crypt_invoke_message (APPLICATION_PGP); + } + + if (cur->security & APPLICATION_SMIME) + crypt_invoke_message (APPLICATION_SMIME); + } + + res = _mutt_copy_message (fpout, msg->fp, cur, cur->content, cmflags, + (option (OPTWEED) ? (CH_WEED | CH_REORDER) : 0) | + CH_DECODE | CH_FROM); + if (res == 0 && (ferror(fpout) || feof(fpout))) { + debug_print (1, ("_mutt_copy_message failed to detect EOF!\n")); + res = -1; + } + + mx_close_message (&msg); + } + if ((safe_fclose (&fpout) != 0 && errno != EPIPE) || res == -1) { mutt_error (_("Could not copy message")); if (fpfilterout != NULL) { @@ -152,6 +167,7 @@ int mutt_display_message (HEADER * cur) if (WithCrypto) { /* update crypto information for this message */ + cur->security &= ~(GOODSIGN|BADSIGN); cur->security |= crypt_query (cur->content); /* Remove color cache for this message, in case there @@ -184,7 +200,7 @@ int mutt_display_message (HEADER * cur) else if (cur->security & PARTSIGN) mutt_message (_ ("Warning: Part of this message has not been signed.")); - else + else if (cur->security & SIGN) mutt_message (_("PGP signature could NOT be verified.")); } @@ -249,7 +265,7 @@ void ci_bounce_message (HEADER * h, int *redraw) if (mutt_addrlist_to_idna (adr, &err) < 0) { mutt_error (_("Bad IDN: '%s'"), err); - FREE (&err); + mem_free (&err); rfc822_free_address (&adr); return; } @@ -266,10 +282,10 @@ void ci_bounce_message (HEADER * h, int *redraw) mutt_format_string (prompt, sizeof (prompt), 0, COLS - extra_space, 0, 0, prompt, sizeof (prompt), 0); - safe_strcat (prompt, sizeof (prompt), "...?"); + str_cat (prompt, sizeof (prompt), "...?"); } else - safe_strcat (prompt, sizeof (prompt), "?"); + str_cat (prompt, sizeof (prompt), "?"); if (query_quadoption (OPT_BOUNCE, prompt) != M_YES) { rfc822_free_address (&adr); @@ -557,7 +573,7 @@ void mutt_enter_command (void) err.dsize = sizeof (errbuf); memset (&token, 0, sizeof (token)); r = mutt_parse_rc_line (buffer, &token, &err); - FREE (&token.data); + mem_free (&token.data); if (errbuf[0]) { /* since errbuf could potentially contain printf() sequences in it, we must call mutt_error() in this fashion so that vsprintf() @@ -629,30 +645,31 @@ static void set_copy_flags (HEADER * hdr, int decode, int decrypt, } } -void _mutt_save_message (HEADER * h, CONTEXT * ctx, int delete, int decode, - int decrypt) -{ +int _mutt_save_message (HEADER * h, CONTEXT * ctx, int delete, int decode, + int decrypt) { int cmflags, chflags; + int rc; set_copy_flags (h, decode, decrypt, &cmflags, &chflags); if (decode || decrypt) mutt_parse_mime_message (Context, h); - if (mutt_append_message (ctx, Context, h, cmflags, chflags) == 0) { - if (delete) { - mutt_set_flag (Context, h, M_DELETE, 1); - if (option (OPTDELETEUNTAG)) - mutt_set_flag (Context, h, M_TAG, 0); - } + if ((rc = mutt_append_message (ctx, Context, h, cmflags, chflags)) != 0) + return rc; + + if (delete) { + mutt_set_flag (Context, h, M_DELETE, 1); + if (option (OPTDELETEUNTAG)) + mutt_set_flag (Context, h, M_TAG, 0); mutt_set_flag (Context, h, M_APPENDED, 1); } + return (0); } /* returns 0 if the copy/save was successful, or -1 on error/abort */ int mutt_save_message (HEADER * h, int delete, - int decode, int decrypt, int *redraw) -{ + int decode, int decrypt, int *redraw) { int i, need_buffy_cleanup; int need_passphrase = 0, app = 0; char prompt[SHORT_STRING], buf[_POSIX_PATH_MAX]; @@ -724,7 +741,7 @@ int mutt_save_message (HEADER * h, int delete, /* This is an undocumented feature of ELM pointed out to me by Felix von * Leitner */ - if (safe_strcmp (buf, ".") == 0) + if (str_cmp (buf, ".") == 0) strfcpy (buf, LastSaveFolder, sizeof (buf)); else strfcpy (LastSaveFolder, buf, sizeof (LastSaveFolder)); @@ -759,15 +776,21 @@ int mutt_save_message (HEADER * h, int delete, #endif if (mx_open_mailbox (buf, M_APPEND, &ctx) != NULL) { - if (h) - _mutt_save_message (h, &ctx, delete, decode, decrypt); - else { + if (h) { + if (_mutt_save_message (h, &ctx, delete, decode, decrypt) != 0) { + mx_close_mailbox (&ctx, NULL); + return (-1); + } + } else { for (i = 0; i < Context->vcount; i++) { if (Context->hdrs[Context->v2r[i]]->tagged) { mutt_message_hook (Context, Context->hdrs[Context->v2r[i]], M_MESSAGEHOOK); - _mutt_save_message (Context->hdrs[Context->v2r[i]], &ctx, delete, - decode, decrypt); + if (_mutt_save_message (Context->hdrs[Context->v2r[i]], &ctx, delete, + decode, decrypt) != 0) { + mx_close_mailbox (&ctx, NULL); + return (-1); + } } } } @@ -800,129 +823,9 @@ int mutt_save_message (HEADER * h, int delete, return -1; } -int mutt_update_list_file (char *filename, char *section, char *key, - char *line) -{ - FILE *ifp; - FILE *ofp; - char buf[HUGE_STRING]; - char oldfile[_POSIX_PATH_MAX]; - char *c; - int ext = 0, done = 0, r = 0; - - snprintf (oldfile, sizeof (oldfile), "%s.bak", filename); - debug_print (1, ("Renaming %s to %s\n", filename, oldfile)); - - /* if file not exist, create it */ - if ((ifp = safe_fopen (filename, "a"))) - fclose (ifp); - if (_mutt_rename_file (filename, oldfile, 1)) { - mutt_perror (_("Unable to create backup file")); - - return (-1); - } - debug_print (1, ("Opening %s\n", oldfile)); - if (!(ifp = safe_fopen (oldfile, "r"))) { - mutt_perror (_("Unable to open backup file for reading")); - - return (-1); - } - debug_print (1, ("Opening %s\n", filename)); - if (!(ofp = safe_fopen (filename, "w"))) { - fclose (ifp); - mutt_perror (_("Unable to open new file for writing")); - - return (-1); - } - if (mx_lock_file (filename, fileno (ofp), 1, 0, 1)) { - fclose (ofp); - fclose (ifp); - mutt_error (_("Unable to lock %s, old file saved as %s"), filename, - oldfile); - return (-1); - } - - if (section) { - while (r != EOF && !done && fgets (buf, sizeof (buf), ifp)) { - r = fputs (buf, ofp); - c = buf; - while (*c && *c != '\n') - c++; - c[0] = 0; /* strip EOL */ - if (!strncmp (buf, "#: ", 3) && !safe_strcasecmp (buf + 3, section)) - done++; - } - if (r != EOF && !done) { - snprintf (buf, sizeof (buf), "#: %s\n", section); - r = fputs (buf, ofp); - } - done = 0; - } - - while (r != EOF && fgets (buf, sizeof (buf), ifp)) { - if (ext) { - c = buf; - while (*c && (*c != '\r') && (*c != '\n')) - c++; - c--; - if (*c != '\\') - ext = 0; - } - else if ((section && !strncmp (buf, "#: ", 3))) { - if (!done && line) { - fputs (line, ofp); - fputc ('\n', ofp); - } - r = fputs (buf, ofp); - done++; - break; - } - else if (key && !strncmp (buf, key, safe_strlen (key)) && - (!*key || buf[safe_strlen (key)] == ' ')) { - c = buf; - ext = 0; - while (*c && (*c != '\r') && (*c != '\n')) - c++; - c--; - if (*c == '\\') - ext = 1; - if (!done && line) { - r = fputs (line, ofp); - if (*key) - r = fputc ('\n', ofp); - done++; - } - } - else { - r = fputs (buf, ofp); - } - } - - while (r != EOF && fgets (buf, sizeof (buf), ifp)) - r = fputs (buf, ofp); - - /* If there wasn't a line to replace, put it on the end of the file */ - if (r != EOF && !done && line) { - fputs (line, ofp); - r = fputc ('\n', ofp); - } - mx_unlock_file (filename, fileno (ofp), 0); - fclose (ofp); - fclose (ifp); - if (r != EOF) { - unlink (oldfile); - return 0; - } - unlink (filename); - mutt_error (_("Cannot write new %s, old file saved as %s"), filename, - oldfile); - return (-1); -} - - void mutt_version (void) { - mutt_message ("Mutt-ng %s (%s)", MUTT_VERSION, ReleaseDate); + mutt_message (mutt_make_version ()); } void mutt_edit_content_type (HEADER * h, BODY * b, FILE * fp) @@ -947,7 +850,7 @@ void mutt_edit_content_type (HEADER * h, BODY * b, FILE * fp) size_t l; for (p = b->parameter; p; p = p->next) { - l = safe_strlen (buf); + l = str_len (buf); rfc822_cat (tmp, sizeof (tmp), p->value, MimeSpecials); snprintf (buf + l, sizeof (buf) - l, "; %s=%s", p->attribute, tmp); @@ -960,7 +863,7 @@ void mutt_edit_content_type (HEADER * h, BODY * b, FILE * fp) /* clean up previous junk */ mutt_free_parameter (&b->parameter); - FREE (&b->subtype); + mem_free (&b->subtype); mutt_parse_content_type (buf, b);