/*
+ * Copyright notice from original mutt:
* Copyright (C) 1996,1997 Michael R. Elkins <me@mutt.org>
* Copyright (C) 1998,1999 Thomas Roessler <roessler@does-not-exist.org>
* Copyright (C) 2004 g10 Code GmbH
*
- * 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 "mime.h"
#include "copy.h"
+#include "lib/mem.h"
+#include "lib/intl.h"
+#include "lib/str.h"
+#include "lib/debug.h"
+
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>
#include "mutt_menu.h"
-char PgpPass[STRING];
+char PgpPass[LONG_STRING];
time_t PgpExptime = 0; /* when does the cached passphrase expire? */
void pgp_void_passphrase (void)
while ((line = mutt_read_line (line, &linelen, fpin, &lineno)) != NULL) {
if (regexec (PgpGoodSign.rx, line, 0, NULL, 0) == 0) {
- dprint (2, (debugfile, "pgp_copy_checksig: \"%s\" matches regexp.\n",
- line));
+ debug_print (2, ("\"%s\" matches regexp.\n", line));
rv = 0;
}
else
- dprint (2,
- (debugfile,
- "pgp_copy_checksig: \"%s\" doesn't match regexp.\n", line));
+ debug_print (2, ("\"%s\" doesn't match regexp.\n", line));
if (strncmp (line, "[GNUPG:] ", 9) == 0)
continue;
FREE (&line);
}
else {
- dprint (2, (debugfile, "pgp_copy_checksig: No pattern.\n"));
+ debug_print (2, ("No pattern.\n"));
mutt_copy_stream (fpin, fpout);
rv = 1;
}
break;
if (armor_header) {
- char *p = mutt_skip_whitespace (buf);
+ char *p = str_skip_initws (buf);
if (*p == '\0')
armor_header = 0;
bytes -= (offset - last_pos); /* don't rely on mutt_strlen(buf) */
last_pos = offset;
- if (mutt_strncmp ("-----BEGIN PGP ", buf, 15) == 0) {
+ if (safe_strncmp ("-----BEGIN PGP ", buf, 15) == 0) {
clearsign = 0;
start_pos = last_pos;
if (rc == -1 || rv)
maybe_goodsig = 0;
- state_putc ('\n', s);
state_attach_puts (_("[-- End of PGP output --]\n\n"), s);
}
}
}
+ /* treat empty result as sign of failure */
+ if (! ftell(pgpout)) {
+ mutt_error _("Could not decrypt PGP message");
+ goto out;
+ }
/*
* Now, copy cleartext to the screen. NOTE - we expect that PGP
if (s->flags & M_DISPLAY) {
state_putc ('\n', s);
- if (needpass)
+ if (needpass) {
state_attach_puts (_("[-- END PGP MESSAGE --]\n"), s);
+ mutt_message _("PGP message successfully decrypted.");
+ }
else if (pgp_keyblock)
state_attach_puts (_("[-- END PGP PUBLIC KEY BLOCK --]\n"), s);
else
state_attach_puts (_("[-- END PGP SIGNED MESSAGE --]\n"), s);
}
- if (tmpfp) {
- safe_fclose (&tmpfp);
- mutt_unlink (tmpfname);
- }
- if (pgpout) {
- safe_fclose (&pgpout);
- mutt_unlink (outfile);
- }
}
else {
/* XXX - we may wish to recode here */
}
}
+out:
m->goodsig = (maybe_goodsig && have_any_sigs);
+ if (tmpfp) {
+ safe_fclose (&tmpfp);
+ mutt_unlink (tmpfname);
+ }
+ if (pgpout) {
+ safe_fclose (&pgpout);
+ mutt_unlink (outfile);
+ }
+
if (needpass == -1) {
state_attach_puts (_
("[-- Error: could not find beginning of PGP message! --]\n\n"),
}
while (fgets (buf, sizeof (buf), tfp)) {
- if (mutt_strncmp ("-----BEGIN PGP ", buf, 15) == 0) {
+ if (safe_strncmp ("-----BEGIN PGP ", buf, 15) == 0) {
if (mutt_strcmp ("MESSAGE-----\n", buf + 15) == 0)
enc = 1;
else if (mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0)
if ((rv = mutt_wait_filter (thepid)))
badsig = -1;
- dprint (1,
- (debugfile, "pgp_verify_one: mutt_wait_filter returned %d.\n",
- rv));
+ debug_print (1, ("mutt_wait_filter returned %d.\n", rv));
}
safe_fclose (&pgperr);
mutt_unlink (sigfile);
mutt_unlink (pgperrfile);
- dprint (1, (debugfile, "pgp_verify_one: returning %d.\n", badsig));
+ debug_print (1, ("returning %d.\n", badsig));
return badsig;
}
char pgperrfile[_POSIX_PATH_MAX];
char pgptmpfile[_POSIX_PATH_MAX];
pid_t thepid;
+ int rv;
mutt_mktemp (pgperrfile);
if ((pgperr = safe_fopen (pgperrfile, "w+")) == NULL) {
}
fclose (pgpout);
- mutt_wait_filter (thepid);
+ rv = mutt_wait_filter (thepid);
mutt_unlink (pgptmpfile);
if (s->flags & M_DISPLAY) {
fflush (pgperr);
rewind (pgperr);
- if (pgp_copy_checksig (pgperr, s->fpout) == 0 && p)
+ if (pgp_copy_checksig (pgperr, s->fpout) == 0 && !rv && p)
p->goodsig = 1;
+ else
+ p->goodsig = 0;
state_attach_puts (_("[-- End of PGP output --]\n\n"), s);
}
fclose (pgperr);
}
mutt_free_body (&tattach);
- }
+ /* clear 'Invoking...' message, since there's no error */
+ mutt_message _("PGP message successfully decrypted.");
+ } else
+ mutt_error _("Could not decrypt PGP message");
fclose (fpout);
mutt_unlink (tempfile);
if ((thepid = pgp_invoke_sign (&pgpin, &pgpout, &pgperr,
-1, -1, -1, signedfile)) == -1) {
- mutt_perror _("Can't open PGP subprocess!");
+ mutt_perror (_("Can't open PGP subprocess!"));
fclose (fp);
unlink (sigfile);
/* or should we require the "0x"? */
if (strncmp (s, "0x", 2) == 0)
s += 2;
- if (strlen (s) % 8)
+ if (mutt_strlen (s) % 8)
return 0;
while (*s)
if (strchr ("0123456789ABCDEFabcdef", *s++) == NULL)
if (empty) {
/* fatal error while trying to encrypt message */
+ if (sign)
+ pgp_void_passphrase (); /* just in case */
unlink (tempfile);
return (NULL);
}
if ((thepid = pgp_invoke_traditional (&pgpin, NULL, NULL,
-1, fileno (pgpout), fileno (pgperr),
pgpinfile, keylist, flags)) == -1) {
- mutt_perror _("Can't invoke PGP");
+ mutt_perror (_("Can't invoke PGP"));
fclose (pgpout);
fclose (pgperr);
mutt_any_key_to_continue (NULL);
if (empty) {
+ if (flags & SIGN)
+ pgp_void_passphrase (); /* just in case */
unlink (pgpoutfile);
return NULL;
}
pgp_ask_for_key (_("Sign as: "), NULL, KEYFLAG_CANSIGN,
PGP_PUBRING))) {
snprintf (input_signas, sizeof (input_signas), "0x%s", pgp_keyid (p));
- mutt_str_replace (&PgpSignAs, input_signas);
+ str_replace (&PgpSignAs, input_signas);
pgp_free_key (&p);
msg->security |= SIGN;