#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)
continue;
}
- if (safe_strcmp (buf, "-----BEGIN PGP SIGNATURE-----\n") == 0)
+ if (mutt_strcmp (buf, "-----BEGIN PGP SIGNATURE-----\n") == 0)
break;
if (armor_header) {
- char *p = mutt_skip_whitespace (buf);
+ char *p = str_skip_initws (buf);
if (*p == '\0')
armor_header = 0;
break;
offset = ftell (s->fpin);
- bytes -= (offset - last_pos); /* don't rely on safe_strlen(buf) */
+ bytes -= (offset - last_pos); /* don't rely on mutt_strlen(buf) */
last_pos = offset;
if (safe_strncmp ("-----BEGIN PGP ", buf, 15) == 0) {
clearsign = 0;
start_pos = last_pos;
- if (safe_strcmp ("MESSAGE-----\n", buf + 15) == 0)
+ if (mutt_strcmp ("MESSAGE-----\n", buf + 15) == 0)
needpass = 1;
- else if (safe_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0) {
+ else if (mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0) {
clearsign = 1;
needpass = 0;
}
else if (!option (OPTDONTHANDLEPGPKEYS) &&
- safe_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) == 0) {
+ mutt_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) == 0) {
needpass = 0;
pgp_keyblock = 1;
}
fputs (buf, tmpfp);
while (bytes > 0 && fgets (buf, sizeof (buf) - 1, s->fpin) != NULL) {
offset = ftell (s->fpin);
- bytes -= (offset - last_pos); /* don't rely on safe_strlen(buf) */
+ bytes -= (offset - last_pos); /* don't rely on mutt_strlen(buf) */
last_pos = offset;
fputs (buf, tmpfp);
if ((needpass
- && safe_strcmp ("-----END PGP MESSAGE-----\n", buf) == 0)
+ && mutt_strcmp ("-----END PGP MESSAGE-----\n", buf) == 0)
|| (!needpass
- && (safe_strcmp ("-----END PGP SIGNATURE-----\n", buf) == 0
- || safe_strcmp ("-----END PGP PUBLIC KEY BLOCK-----\n",
+ && (mutt_strcmp ("-----END PGP SIGNATURE-----\n", buf) == 0
+ || mutt_strcmp ("-----END PGP PUBLIC KEY BLOCK-----\n",
buf) == 0)))
break;
}
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 (safe_strncmp ("-----BEGIN PGP ", buf, 15) == 0) {
- if (safe_strcmp ("MESSAGE-----\n", buf + 15) == 0)
+ if (mutt_strcmp ("MESSAGE-----\n", buf + 15) == 0)
enc = 1;
- else if (safe_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0)
+ else if (mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0)
sgn = 1;
- else if (safe_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) == 0)
+ else if (mutt_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) == 0)
key = 1;
}
}
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) {
* read_mime_header has a hard time parsing the message.
*/
while (fgets (buf, sizeof (buf) - 1, pgpout) != NULL) {
- len = safe_strlen (buf);
+ len = mutt_strlen (buf);
if (len > 1 && buf[len - 2] == '\r')
strcpy (buf + len - 2, "\n"); /* __STRCPY_CHECKED__ */
fputs (buf, fpout);
}
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);
* recommended for future releases of PGP.
*/
while (fgets (buffer, sizeof (buffer) - 1, pgpout) != NULL) {
- if (safe_strcmp ("-----BEGIN PGP MESSAGE-----\n", buffer) == 0)
+ if (mutt_strcmp ("-----BEGIN PGP MESSAGE-----\n", buffer) == 0)
fputs ("-----BEGIN PGP SIGNATURE-----\n", fp);
- else if (safe_strcmp ("-----END PGP MESSAGE-----\n", buffer) == 0)
+ else if (mutt_strcmp ("-----END PGP MESSAGE-----\n", buffer) == 0)
fputs ("-----END PGP SIGNATURE-----\n", fp);
else
fputs (buffer, fp);
/* or should we require the "0x"? */
if (strncmp (s, "0x", 2) == 0)
s += 2;
- if (safe_strlen (s) % 8)
+ if (mutt_strlen (s) % 8)
return 0;
while (*s)
if (strchr ("0123456789ABCDEFabcdef", *s++) == NULL)
keyID = pgp_keyid (key);
bypass_selection:
- keylist_size += safe_strlen (keyID) + 4;
+ keylist_size += mutt_strlen (keyID) + 4;
safe_realloc (&keylist, keylist_size);
sprintf (keylist + keylist_used, "%s0x%s", keylist_used ? " " : "", /* __SPRINTF_CHECKED__ */
keyID);
- keylist_used = safe_strlen (keylist);
+ keylist_used = mutt_strlen (keylist);
pgp_free_key (&key);
rfc822_free_address (&addr);
if (empty) {
/* fatal error while trying to encrypt message */
+ if (sign)
+ pgp_void_passphrase (); /* just in case */
unlink (tempfile);
return (NULL);
}
mutt_any_key_to_continue (NULL);
if (empty) {
+ if (flags & SIGN)
+ pgp_void_passphrase (); /* just in case */
unlink (pgpoutfile);
return NULL;
}