decode-save. Closes: #1919.
char prefix[SHORT_STRING];
STATE s;
long new_offset = -1;
+ int rc = 0;
if (flags & M_CM_PREFIX)
{
if (WithCrypto && flags & M_CM_VERIFY)
s.flags |= M_VERIFY;
- mutt_body_handler (body, &s);
+ rc = mutt_body_handler (body, &s);
}
else if (WithCrypto
&& (flags & M_CM_DECODE_CRYPT) && (hdr->security & ENCRYPT))
mutt_free_body (&body->parts);
}
- return 0;
+ return rc;
}
int
/* Support for classic_application/pgp */
-void pgp_gpgme_application_handler (BODY *m, STATE *s)
+int pgp_gpgme_application_handler (BODY *m, STATE *s)
{
int needpass = -1, pgp_keyblock = 0;
int clearsign = 0;
char buf[HUGE_STRING];
FILE *pgpout = NULL;
- gpgme_error_t err;
+ gpgme_error_t err = 0;
gpgme_data_t armored_data = NULL;
short maybe_goodsig = 1;
{
state_attach_puts (_("[-- Error: could not find beginning"
" of PGP message! --]\n\n"), s);
- return;
+ return -1;
}
dprint (2, (debugfile, "Leaving pgp_application_pgp handler\n"));
+
+ return err;
}
/*
*/
/* MIME handler for pgp/mime encrypted messages. */
-void pgp_gpgme_encrypted_handler (BODY *a, STATE *s)
+int pgp_gpgme_encrypted_handler (BODY *a, STATE *s)
{
char tempfile[_POSIX_PATH_MAX];
FILE *fpout;
BODY *tattach;
BODY *orig_body = a;
int is_signed;
+ int rc = 0;
dprint (2, (debugfile, "Entering pgp_encrypted handler\n"));
a = a->parts;
if (s->flags & M_DISPLAY)
state_attach_puts (_("[-- Error: malformed PGP/MIME message! --]\n\n"),
s);
- return;
+ return -1;
}
/* Move forward to the application/pgp-encrypted body. */
if (s->flags & M_DISPLAY)
state_attach_puts (_("[-- Error: could not create temporary file! "
"--]\n"), s);
- return;
+ return -1;
}
tattach = decrypt_part (a, s, fpout, 0, &is_signed);
{
FILE *savefp = s->fpin;
s->fpin = fpout;
- mutt_body_handler (tattach, s);
+ rc = mutt_body_handler (tattach, s);
s->fpin = savefp;
}
fclose (fpout);
mutt_unlink(tempfile);
dprint (2, (debugfile, "Leaving pgp_encrypted handler\n"));
+
+ return rc;
}
/* Support for application/smime */
-void smime_gpgme_application_handler (BODY *a, STATE *s)
+int smime_gpgme_application_handler (BODY *a, STATE *s)
{
char tempfile[_POSIX_PATH_MAX];
FILE *fpout;
BODY *tattach;
int is_signed;
-
+ int rc = 0;
dprint (2, (debugfile, "Entering smime_encrypted handler\n"));
if (s->flags & M_DISPLAY)
state_attach_puts (_("[-- Error: could not create temporary file! "
"--]\n"), s);
- return;
+ return -1;
}
tattach = decrypt_part (a, s, fpout, 1, &is_signed);
{
FILE *savefp = s->fpin;
s->fpin = fpout;
- mutt_body_handler (tattach, s);
+ rc = mutt_body_handler (tattach, s);
s->fpin = savefp;
}
fclose (fpout);
mutt_unlink(tempfile);
dprint (2, (debugfile, "Leaving smime_encrypted handler\n"));
+
+ return rc;
}
int pgp_gpgme_check_traditional (FILE *fp, BODY *b, int tagged_only);
-void pgp_gpgme_application_handler (BODY *m, STATE *s);
-void smime_gpgme_application_handler (BODY *a, STATE *s);
-void pgp_gpgme_encrypted_handler (BODY *a, STATE *s);
+int pgp_gpgme_application_handler (BODY *m, STATE *s);
+int smime_gpgme_application_handler (BODY *a, STATE *s);
+int pgp_gpgme_encrypted_handler (BODY *a, STATE *s);
BODY *pgp_gpgme_make_key_attachment (char *tempf);
int pgp_gpgme_send_menu (HEADER *msg, int *redraw);
int smime_gpgme_send_menu (HEADER *msg, int *redraw);
+int smime_gpgme_verify_sender (HEADER *h);
#endif
{
return pgp_decrypt_mime (a, b, c, d);
}
-static void crypt_mod_pgp_application_handler (BODY *m, STATE *s)
+static int crypt_mod_pgp_application_handler (BODY *m, STATE *s)
{
- pgp_application_pgp_handler (m, s);
+ return pgp_application_pgp_handler (m, s);
}
static char *crypt_mod_pgp_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
return pgp_traditional_encryptsign (a, flags, keylist);
}
-static void crypt_mod_pgp_encrypted_handler (BODY *m, STATE *s)
+static int crypt_mod_pgp_encrypted_handler (BODY *m, STATE *s)
{
- pgp_encrypted_handler (m, s);
+ return pgp_encrypted_handler (m, s);
}
static void crypt_mod_pgp_invoke_getkeys (ADDRESS *addr)
return pgp_gpgme_decrypt_mime (a, b, c, d);
}
-static void crypt_mod_pgp_application_handler (BODY *m, STATE *s)
+static int crypt_mod_pgp_application_handler (BODY *m, STATE *s)
{
- pgp_gpgme_application_handler (m, s);
+ return pgp_gpgme_application_handler (m, s);
}
-static void crypt_mod_pgp_encrypted_handler (BODY *m, STATE *s)
+static int crypt_mod_pgp_encrypted_handler (BODY *m, STATE *s)
{
- pgp_gpgme_encrypted_handler (m, s);
+ return pgp_gpgme_encrypted_handler (m, s);
}
static int crypt_mod_pgp_check_traditional (FILE *fp, BODY *b, int tagged_only)
{
return smime_decrypt_mime (a, b, c, d);
}
-static void crypt_mod_smime_application_handler (BODY *m, STATE *s)
+static int crypt_mod_smime_application_handler (BODY *m, STATE *s)
{
- smime_application_smime_handler (m, s);
+ return smime_application_smime_handler (m, s);
}
static char *crypt_mod_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
return smime_gpgme_decrypt_mime (a, b, c, d);
}
-static void crypt_mod_smime_application_handler (BODY *m, STATE *s)
+static int crypt_mod_smime_application_handler (BODY *m, STATE *s)
{
- smime_gpgme_application_handler (m, s);
+ return smime_gpgme_application_handler (m, s);
}
static char *crypt_mod_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
typedef int (*crypt_func_decrypt_mime_t) (FILE *a, FILE **b,
BODY *c, BODY **d);
-typedef void (*crypt_func_application_handler_t) (BODY *m, STATE *s);
-typedef void (*crypt_func_encrypted_handler_t) (BODY *m, STATE *s);
+typedef int (*crypt_func_application_handler_t) (BODY *m, STATE *s);
+typedef int (*crypt_func_encrypted_handler_t) (BODY *m, STATE *s);
typedef void (*crypt_func_pgp_invoke_getkeys_t) (ADDRESS *addr);
typedef int (*crypt_func_pgp_check_traditional_t) (FILE *fp, BODY *b,
* This routine verifies a "multipart/signed" body.
*/
-void mutt_signed_handler (BODY *a, STATE *s)
+int mutt_signed_handler (BODY *a, STATE *s)
{
char tempfile[_POSIX_PATH_MAX];
char *protocol;
int sigcnt = 0;
int i;
short goodsig = 1;
+ int rc = 0;
if (!WithCrypto)
- return;
+ return -1;
protocol = mutt_get_parameter ("protocol", a->parameter);
a = a->parts;
state_attach_puts (_("[-- Error: "
"Inconsistent multipart/signed structure! --]\n\n"),
s);
- mutt_body_handler (a, s);
- return;
+ return mutt_body_handler (a, s);
}
state_printf (s, _("[-- Error: "
"Unknown multipart/signed protocol %s! --]\n\n"),
protocol);
- mutt_body_handler (a, s);
- return;
+ return mutt_body_handler (a, s);
}
if (s->flags & M_DISPLAY)
state_attach_puts (_("[-- Warning: Can't find any signatures. --]\n\n"), s);
}
- mutt_body_handler (a, s);
+ rc = mutt_body_handler (a, s);
if (s->flags & M_DISPLAY && sigcnt)
state_attach_puts (_("\n[-- End of signed data --]\n"), s);
+
+ return rc;
}
}
/* MIME handler for the application/pgp content-type. */
-void crypt_pgp_application_pgp_handler (BODY *m, STATE *s)
+int crypt_pgp_application_pgp_handler (BODY *m, STATE *s)
{
if (CRYPT_MOD_CALL_CHECK (PGP, application_handler))
- (CRYPT_MOD_CALL (PGP, application_handler)) (m, s);
+ return (CRYPT_MOD_CALL (PGP, application_handler)) (m, s);
+
+ return -1;
}
/* MIME handler for an PGP/MIME encrypted message. */
-void crypt_pgp_encrypted_handler (BODY *a, STATE *s)
+int crypt_pgp_encrypted_handler (BODY *a, STATE *s)
{
if (CRYPT_MOD_CALL_CHECK (PGP, encrypted_handler))
- (CRYPT_MOD_CALL (PGP, encrypted_handler)) (a, s);
+ return (CRYPT_MOD_CALL (PGP, encrypted_handler)) (a, s);
+
+ return -1;
}
/* fixme: needs documentation. */
}
/* MIME handler for the application/smime content-type. */
-void crypt_smime_application_smime_handler (BODY *m, STATE *s)
+int crypt_smime_application_smime_handler (BODY *m, STATE *s)
{
if (CRYPT_MOD_CALL_CHECK (SMIME, application_handler))
- (CRYPT_MOD_CALL (SMIME, application_handler)) (m, s);
+ return (CRYPT_MOD_CALL (SMIME, application_handler)) (m, s);
+
+ return -1;
}
/* MIME handler for an PGP/MIME encrypted message. */
#define BUFO_SIZE 2000
-typedef void handler_f (BODY *, STATE *);
-typedef handler_f *handler_t;
+typedef int (*handler_t) (BODY *, STATE *);
int Index_hex[128] = {
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
}
}
-void text_enriched_handler (BODY *a, STATE *s)
+int text_enriched_handler (BODY *a, STATE *s)
{
enum {
TEXT, LANGLE, TAG, BOGUS_TAG, NEWLINE, ST_EOF, DONE
FREE (&(stte.buffer));
FREE (&(stte.line));
FREE (&(stte.param));
+
+ return 0;
}
/*
return j;
}
-static void text_plain_flowed_handler (BODY *a, STATE *s)
+static int text_plain_flowed_handler (BODY *a, STATE *s)
{
char line[LONG_STRING];
char indent[LONG_STRING];
if (col)
state_putc ('\n', s);
-
+
+ return 0;
}
#define TXTPLAIN 2
#define TXTENRICHED 3
-static void alternative_handler (BODY *a, STATE *s)
+static int alternative_handler (BODY *a, STATE *s)
{
BODY *choice = NULL;
BODY *b;
char buf[STRING];
int type = 0;
int mustfree = 0;
+ int rc = 0;
if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
a->encoding == ENCUUENCODED)
/* didn't find anything that we could display! */
state_mark_attach (s);
state_puts(_("[-- Error: Could not display any parts of Multipart/Alternative! --]\n"), s);
+ rc = -1;
}
if (mustfree)
mutt_free_body(&a);
+
+ return rc;
}
/* handles message/rfc822 body parts */
-void message_handler (BODY *a, STATE *s)
+int message_handler (BODY *a, STATE *s)
{
struct stat st;
BODY *b;
long off_start;
+ int rc = 0;
off_start = ftell (s->fpin);
if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
state_puts (s->prefix, s);
state_putc ('\n', s);
- mutt_body_handler (b->parts, s);
+ rc = mutt_body_handler (b->parts, s);
}
if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
a->encoding == ENCUUENCODED)
mutt_free_body (&b);
+
+ return rc;
}
/* returns 1 if decoding the attachment will produce output */
return (0);
}
-void multipart_handler (BODY *a, STATE *s)
+int multipart_handler (BODY *a, STATE *s)
{
BODY *b, *p;
char length[5];
struct stat st;
int count;
+ int rc = 0;
if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
a->encoding == ENCUUENCODED)
state_printf(s, "%s: \n", p->form_name);
}
- mutt_body_handler (p, s);
+ rc = mutt_body_handler (p, s);
state_putc ('\n', s);
- if ((s->flags & M_REPLYING)
- && (option (OPTINCLUDEONLYFIRST)) && (s->flags & M_FIRSTDONE))
+ if (rc || ((s->flags & M_REPLYING)
+ && (option (OPTINCLUDEONLYFIRST)) && (s->flags & M_FIRSTDONE)))
break;
}
if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
a->encoding == ENCUUENCODED)
mutt_free_body (&b);
+
+ return rc;
}
-void autoview_handler (BODY *a, STATE *s)
+int autoview_handler (BODY *a, STATE *s)
{
rfc1524_entry *entry = rfc1524_new_entry ();
char buffer[LONG_STRING];
FILE *fperr = NULL;
int piped = FALSE;
pid_t thepid;
+ int rc = 0;
snprintf (type, sizeof (type), "%s/%s", TYPE (a), a->subtype);
rfc1524_mailcap_lookup (a, type, entry, M_AUTOVIEW);
{
mutt_perror ("fopen");
rfc1524_free_entry (&entry);
- return;
+ return -1;
}
mutt_copy_bytes (s->fpin, fpin, a->length);
state_mark_attach (s);
state_printf (s, _("[-- Can't run %s. --]\n"), command);
}
+ rc = -1;
goto bail;
}
mutt_clear_error ();
}
rfc1524_free_entry (&entry);
+
+ return rc;
}
-static void external_body_handler (BODY *b, STATE *s)
+static int external_body_handler (BODY *b, STATE *s)
{
const char *access_type;
const char *expiration;
state_mark_attach (s);
state_puts (_("[-- Error: message/external-body has no access-type parameter --]\n"), s);
}
- return;
+ return -1;
}
expiration = mutt_get_parameter ("expiration", b->parameter);
CH_DECODE , NULL);
}
}
+
+ return 0;
}
void mutt_decode_attachment (BODY *b, STATE *s)
iconv_close (cd);
}
-void mutt_body_handler (BODY *b, STATE *s)
+int mutt_body_handler (BODY *b, STATE *s)
{
int decode = 0;
int plaintext = 0;
long tmpoffset = 0;
size_t tmplength = 0;
char type[STRING];
+ int rc = 0;
int oflags = s->flags;
/* process the (decoded) body part */
if (handler)
{
- handler (b, s);
+ rc = handler (b, s);
if (decode)
{
}
fputs (" --]\n", s->fpout);
}
-
+
bail:
s->flags = oflags | (s->flags & M_FIRSTDONE);
+
+ return rc;
}
int mutt_is_application_smime (BODY *);
-void mutt_signed_handler (BODY *, STATE *);
+int mutt_signed_handler (BODY *, STATE *);
int mutt_parse_crypt_hdr (char *, int);
int crypt_pgp_decrypt_mime (FILE *a, FILE **b, BODY *c, BODY **d);
/* MIME handler for the application/pgp content-type. */
-void crypt_pgp_application_pgp_handler (BODY *m, STATE *s);
+int crypt_pgp_application_pgp_handler (BODY *m, STATE *s);
/* MIME handler for an PGP/MIME encrypted message. */
-void crypt_pgp_encrypted_handler (BODY *a, STATE *s);
+int crypt_pgp_encrypted_handler (BODY *a, STATE *s);
/* fixme: needs documentation. */
void crypt_pgp_invoke_getkeys (ADDRESS *addr);
int crypt_smime_decrypt_mime (FILE *a, FILE **b, BODY *c, BODY **d);
/* MIME handler for the application/smime content-type. */
-void crypt_smime_application_smime_handler (BODY *m, STATE *s);
+int crypt_smime_application_smime_handler (BODY *m, STATE *s);
/* fixme: Needs documentation. */
void crypt_smime_getkeys (ENVELOPE *env);
/* Support for the Application/PGP Content Type. */
-void pgp_application_pgp_handler (BODY *m, STATE *s)
+int pgp_application_pgp_handler (BODY *m, STATE *s)
{
int needpass = -1, pgp_keyblock = 0;
int clearsign = 0, rv, rc;
if ((tmpfp = safe_fopen (tmpfname, "w+")) == NULL)
{
mutt_perror (tmpfname);
- return;
+ return -1;
}
fputs (buf, tmpfp);
if ((pgpout = safe_fopen (outfile, "w+")) == NULL)
{
mutt_perror (tmpfname);
- return;
+ return -1;
}
if ((thepid = pgp_invoke_decode (&pgpin, NULL, &pgperr, -1,
{
mutt_error _("Could not decrypt PGP message");
pgp_void_passphrase ();
+ rc = -1;
goto out;
}
}
}
+ rc = 0;
+
out:
m->goodsig = (maybe_goodsig && have_any_sigs);
if (needpass == -1)
{
state_attach_puts (_("[-- Error: could not find beginning of PGP message! --]\n\n"), s);
- return;
+ return -1;
}
+
+ return rc;
}
static int pgp_check_traditional_one_body (FILE *fp, BODY *b, int tagged_only)
rewind (fpout);
if (fgetc (fpout) == EOF)
+ {
+ mutt_error _("Decryption failed");
+ pgp_void_passphrase ();
return NULL;
+ }
rewind (fpout);
return (0);
}
-void pgp_encrypted_handler (BODY *a, STATE *s)
+int pgp_encrypted_handler (BODY *a, STATE *s)
{
char tempfile[_POSIX_PATH_MAX];
FILE *fpout, *fpin;
BODY *tattach;
BODY *p = a;
+ int rc = 0;
a = a->parts;
if (!a || a->type != TYPEAPPLICATION || !a->subtype ||
{
if (s->flags & M_DISPLAY)
state_attach_puts (_("[-- Error: malformed PGP/MIME message! --]\n\n"), s);
- return;
+ return -1;
}
/*
{
if (s->flags & M_DISPLAY)
state_attach_puts (_("[-- Error: could not create temporary file! --]\n"), s);
- return;
+ return -1;
}
if (s->flags & M_DISPLAY) crypt_current_time (s, "PGP");
fpin = s->fpin;
s->fpin = fpout;
- mutt_body_handler (tattach, s);
+ rc = mutt_body_handler (tattach, s);
s->fpin = fpin;
/*
mutt_error _("Could not decrypt PGP message");
/* void the passphrase, even if it's not necessarily the problem */
pgp_void_passphrase ();
+ rc = -1;
}
fclose (fpout);
mutt_unlink(tempfile);
+
+ return rc;
}
/* ----------------------------------------------------------------------------
char *pgp_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc);
void pgp_forget_passphrase (void);
-void pgp_application_pgp_handler (BODY *, STATE *);
-void pgp_encrypted_handler (BODY *, STATE *);
+int pgp_application_pgp_handler (BODY *, STATE *);
+int pgp_encrypted_handler (BODY *, STATE *);
void pgp_extract_keys_from_attachment_list (FILE * fp, int tag, BODY * top);
void pgp_void_passphrase (void);
int pgp_valid_passphrase (void);
void mutt_attach_init (BODY *);
void mutt_block_signals (void);
void mutt_block_signals_system (void);
-void mutt_body_handler (BODY *, STATE *);
+int mutt_body_handler (BODY *, STATE *);
int mutt_bounce_message (FILE *fp, HEADER *, ADDRESS *);
void mutt_break_thread (HEADER *);
void mutt_buffy (char *, size_t);
}
-void smime_application_smime_handler (BODY *m, STATE *s)
+int smime_application_smime_handler (BODY *m, STATE *s)
{
-
- smime_handle_entity (m, s, NULL);
-
+ return smime_handle_entity (m, s, NULL) ? 0 : -1;
}
int smime_send_menu (HEADER *msg, int *redraw)
int smime_decrypt_mime (FILE *, FILE **, BODY *, BODY **);
-void smime_application_smime_handler (BODY *, STATE *);
+int smime_application_smime_handler (BODY *, STATE *);
BODY* smime_sign_message (BODY *);