* please see the file GPL in the top level source directory.
*/
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include <lib-lib/lib-lib.h>
-#include <lib-lib/mem.h>
+#include <lib-mime/mime.h>
+
+#include <lib-ui/lib-ui.h>
+#include <lib-ui/menu.h>
+#include <lib-mx/mx.h>
+
+#include <lib-sys/unix.h>
#include "mutt.h"
-#include "ascii.h"
-#include "enter.h"
#include "handler.h"
-#include "mutt_menu.h"
-#include "rfc1524.h"
-#include "mime.h"
-#include "mapping.h"
#include "sort.h"
#include "thread.h"
-#include "mx.h"
-#ifdef USE_IMAP
-#include "imap.h"
-#include "imap/mx_imap.h"
-#endif
-#include "mutt_crypt.h"
-
-#include "lib/mem.h"
-#include "lib/intl.h"
-#include "lib/str.h"
-#include "lib/debug.h"
-
-#include <ctype.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/stat.h>
-
-static struct mapping_t PostponeHelp[] = {
- {N_("Exit"), OP_EXIT},
- {N_("Del"), OP_DELETE},
- {N_("Undel"), OP_UNDELETE},
- {N_("Help"), OP_HELP},
- {NULL, OP_NULL}
-};
-
+#include "crypt.h"
+#include <imap/imap.h>
static short PostCount = 0;
static CONTEXT *PostContext = NULL;
if (!Postponed)
return 0;
-#ifdef USE_IMAP
/* LastModify is useless for IMAP */
if (imap_is_magic (Postponed, NULL) == M_IMAP) {
if (force) {
newpc = imap_mailbox_check (Postponed, 0);
if (newpc >= 0) {
PostCount = newpc;
- debug_print (2, ("%d postponed IMAP messages found.\n", PostCount));
}
- else
- debug_print (2, ("using old IMAP postponed count.\n"));
}
return PostCount;
}
-#endif
if (stat (Postponed, &st) == -1) {
PostCount = 0;
LastModify = 0;
- return (0);
+ return 0;
}
if (S_ISDIR (st.st_mode)) {
}
if (LastModify < st.st_mtime) {
-#ifdef USE_NNTP
- int optnews = option (OPTNEWS);
-#endif
LastModify = st.st_mtime;
if (access (Postponed, R_OK | F_OK) != 0)
- return (PostCount = 0);
-#ifdef USE_NNTP
- if (optnews)
- unset_option (OPTNEWS);
-#endif
+ return PostCount = 0;
if (mx_open_mailbox (Postponed, M_NOSORT | M_QUIET, &ctx) == NULL)
PostCount = 0;
else
PostCount = ctx.msgcount;
mx_fastclose_mailbox (&ctx);
-#ifdef USE_NNTP
- if (optnews)
- set_option (OPTNEWS);
-#endif
}
- return (PostCount);
+ return PostCount;
}
void mutt_update_num_postponed (void)
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);
+ CONTEXT *ctx = (CONTEXT *)menu->data;
+ _mutt_make_string(s, slen, NONULL (HdrFmt), ctx, ctx->hdrs[entry], 0);
}
static HEADER *select_msg (void)
{
MUTTMENU *menu;
int i, done = 0, r = -1;
- char helpstr[SHORT_STRING];
short orig_sort;
menu = mutt_new_menu ();
menu->max = PostContext->msgcount;
menu->title = _("Postponed Messages");
menu->data = PostContext;
- 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
Sort = orig_sort;
mutt_menuDestroy (&menu);
- return (r > -1 ? PostContext->hdrs[r] : NULL);
+ return r > -1 ? PostContext->hdrs[r] : NULL;
}
/* args:
* SENDREPLY recalled message is a reply
*/
int mutt_get_postponed (CONTEXT * ctx, HEADER * hdr, HEADER ** cur, char *fcc,
- size_t fcclen)
+ 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);
+ return -1;
if ((PostContext = mx_open_mailbox (Postponed, M_NOSORT, NULL)) == NULL) {
PostCount = 0;
mutt_error _("No postponed messages.");
- return (-1);
+ return -1;
}
if (!PostContext->msgcount) {
p_delete(&PostContext);
mutt_error _("No postponed messages.");
- return (-1);
+ return -1;
}
if (PostContext->msgcount == 1) {
else if ((h = select_msg ()) == NULL) {
mx_close_mailbox (PostContext, NULL);
p_delete(&PostContext);
- return (-1);
+ return -1;
}
if (mutt_prepare_template (NULL, PostContext, hdr, h, 0) < 0) {
mx_fastclose_mailbox (PostContext);
p_delete(&PostContext);
- return (-1);
+ return -1;
}
/* finished with this message, so delete it. */
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);
+ p = vskipspaces(tmp->data + 18);
if (!ctx->id_hash)
ctx->id_hash = mutt_make_id_hash (ctx);
*cur = hash_find (ctx->id_hash, p);
else
hdr->env->userhdrs = tmp->next;
tmp->next = NULL;
- mutt_free_list (&tmp);
+ string_list_wipe(&tmp);
tmp = next;
if (*cur)
code |= SENDREPLY;
}
else if (ascii_strncasecmp ("X-Mutt-Fcc:", tmp->data, 11) == 0) {
- p = tmp->data + 11;
- SKIPWS (p);
- strfcpy (fcc, p, fcclen);
+ p = vskipspaces(tmp->data + 11);
+ m_strcpy(fcc, fcclen, p);
mutt_pretty_mailbox (fcc);
/* remove the X-Mutt-Fcc: header field */
else
hdr->env->userhdrs = tmp->next;
tmp->next = NULL;
- mutt_free_list (&tmp);
+ string_list_wipe(&tmp);
tmp = next;
}
- else if ((WithCrypto & APPLICATION_PGP)
- && (str_ncmp ("Pgp:", tmp->data, 4) == 0 /* this is generated
- * by old mutt versions
- */
- || str_ncmp ("X-Mutt-PGP:", tmp->data, 11) == 0)) {
+ else if (m_strncmp("X-Mutt-PGP:", tmp->data, 11) == 0) {
hdr->security = mutt_parse_crypt_hdr (strchr (tmp->data, ':') + 1, 1);
hdr->security |= APPLICATION_PGP;
else
hdr->env->userhdrs = tmp->next;
tmp->next = NULL;
- mutt_free_list (&tmp);
+ string_list_wipe(&tmp);
tmp = next;
}
- else if ((WithCrypto & APPLICATION_SMIME)
- && str_ncmp ("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;
else
hdr->env->userhdrs = tmp->next;
tmp->next = NULL;
- mutt_free_list (&tmp);
+ string_list_wipe(&tmp);
tmp = next;
}
-
-#ifdef MIXMASTER
- else if (str_ncmp ("X-Mutt-Mix:", tmp->data, 11) == 0) {
- char *t;
-
- mutt_free_list (&hdr->chain);
-
- t = strtok (tmp->data + 11, " \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;
- else
- hdr->env->userhdrs = tmp->next;
- tmp->next = NULL;
- mutt_free_list (&tmp);
- tmp = next;
- }
-#endif
-
else {
last = tmp;
tmp = tmp->next;
}
}
- return (code);
+ return code;
}
-
-
int mutt_parse_crypt_hdr (char *p, int set_signas)
{
int pgp = 0;
char pgp_sign_as[LONG_STRING] = "\0", *q;
char smime_cryptalg[LONG_STRING] = "\0";
- if (!WithCrypto)
- return 0;
-
- SKIPWS (p);
- for (; *p; p++) {
-
+ for (p = vskipspaces(p); *p; p++) {
switch (*p) {
case 'e':
case 'E':
}
/* the cryptalg field must not be empty */
- if ((WithCrypto & APPLICATION_SMIME) && *smime_cryptalg)
- str_replace (&SmimeCryptAlg, smime_cryptalg);
+ if (*smime_cryptalg)
+ m_strreplace(&SmimeCryptAlg, smime_cryptalg);
- if ((WithCrypto & APPLICATION_PGP) && (set_signas || *pgp_sign_as))
- str_replace (&PgpSignAs, pgp_sign_as);
+ if (set_signas || *pgp_sign_as)
+ m_strreplace(&PgpSignAs, pgp_sign_as);
return pgp;
}
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);
+ return -1;
if (!fp)
fp = msg->fp;
/* decrypt pgp/mime encoded messages */
- if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME) & hdr->security)
- && mutt_is_multipart_encrypted (newhdr->content)) {
- int ccap =
- WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME) & hdr->security;
+ if ((APPLICATION_PGP | APPLICATION_SMIME) & hdr->security
+ && mutt_is_multipart_encrypted (newhdr->content))
+ {
+ int ccap = (APPLICATION_PGP | APPLICATION_SMIME) & hdr->security;
newhdr->security |= ENCRYPT | ccap;
- if (!crypt_valid_passphrase (ccap))
- goto 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:
+ || b == NULL)
+ {
mx_close_message (&msg);
- mutt_free_envelope (&newhdr->env);
- mutt_free_body (&newhdr->content);
+ envelope_delete(&newhdr->env);
+ body_list_wipe(&newhdr->content);
mutt_error _("Decryption failed.");
return -1;
}
- mutt_free_body (&newhdr->content);
+ body_list_wipe(&newhdr->content);
newhdr->content = b;
mutt_clear_error ();
* 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(parameter_getval(newhdr->content->parameter, "protocol"),
+ "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);
+ body_list_wipe(&newhdr->content->parts->next);
newhdr->content = mutt_remove_multipart (newhdr->content);
}
file[0] = '\0';
if (b->filename) {
- strfcpy (file, b->filename, sizeof (file));
- b->d_filename = str_dup (b->filename);
+ m_strcpy(file, sizeof(file), b->filename);
+ b->d_filename = m_strdup(b->filename);
}
else {
/* avoid Content-Disposition: header with temporary filename */
s.flags = 0;
if (b->type == TYPETEXT) {
- if (!ascii_strcasecmp
- ("yes", mutt_get_parameter ("x-mutt-noconv", b->parameter)))
- b->noconv = 1;
- else {
+ b->noconv = !ascii_strcasecmp("yes", parameter_getval(b->parameter,
+ "x-mutt-noconv"));
+ if (b->noconv)
s.flags |= M_CHARCONV;
- b->noconv = 0;
- }
- mutt_delete_parameter ("x-mutt-noconv", &b->parameter);
+ parameter_delval(&b->parameter, "x-mutt-noconv");
}
- mutt_adv_mktemp (NULL, file, sizeof (file));
- if ((s.fpout = safe_fopen (file, "w")) == NULL)
+ s.fpout = m_tempfile(file, sizeof(file), NONULL(mod_core.tmpdir), file);
+ if (!s.fpout)
goto bail;
-
- if ((WithCrypto & APPLICATION_PGP)
- && (mutt_is_application_pgp (b) & (ENCRYPT | SIGN))) {
+ if (mutt_is_application_pgp (b) & (ENCRYPT | SIGN)) {
mutt_body_handler (b, &s);
newhdr->security |= mutt_is_application_pgp (newhdr->content);
b->type = TYPETEXT;
- str_replace (&b->subtype, "plain");
- mutt_delete_parameter ("x-action", &b->parameter);
+ m_strreplace(&b->subtype, "plain");
+ parameter_delval(&b->parameter, "x-action");
}
else
mutt_decode_attachment (b, &s);
- if (safe_fclose (&s.fpout) != 0)
+ if (m_fclose(&s.fpout) != 0)
goto bail;
- str_replace (&b->filename, file);
+ m_strreplace(&b->filename, file);
b->unlink = 1;
mutt_stamp_attachment (b);
- mutt_free_body (&b->parts);
+ body_list_wipe(&b->parts);
if (b->hdr)
b->hdr->content = NULL; /* avoid dangling pointer */
}
/* Fix encryption flags. */
/* No inline if multipart. */
- if (WithCrypto && (newhdr->security & INLINE) && newhdr->content->next)
+ if ((newhdr->security & INLINE) && newhdr->content->next)
newhdr->security &= ~INLINE;
- /* Do we even support multiple mechanisms? */
- newhdr->security &= WithCrypto | ~(APPLICATION_PGP | APPLICATION_SMIME);
-
/* 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))
+ if (mod_crypt.smime_is_default)
newhdr->security &= ~APPLICATION_PGP;
else
newhdr->security &= ~APPLICATION_SMIME;
/* that's it. */
if (bfp != fp)
- fclose (bfp);
+ m_fclose(&bfp);
if (msg)
mx_close_message (&msg);
if (rv == -1) {
- mutt_free_envelope (&newhdr->env);
- mutt_free_body (&newhdr->content);
+ envelope_delete(&newhdr->env);
+ body_list_wipe(&newhdr->content);
}
return rv;