X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=pgp.c;h=da199cef7352805802d333fb36d7935dc045ba8e;hp=779b2f4f460c120e8d0288f4ab5d2061facbf8d5;hb=700dbab719f75421b81f8c603d239bbf38cfa6f9;hpb=3db1eed8cb47ae930ec78a1dc6576f608363da85 diff --git a/pgp.c b/pgp.c index 779b2f4..da199ce 100644 --- a/pgp.c +++ b/pgp.c @@ -103,10 +103,16 @@ void pgp_forget_passphrase (void) mutt_message _("PGP passphrase forgotten."); } -int pgp_use_gpg_agent (void) -{ - return option (OPTUSEGPGAGENT) && getenv ("GPG_TTY") - && getenv ("GPG_AGENT_INFO"); +int pgp_use_gpg_agent (void) { + char *tty; + + if (!option (OPTUSEGPGAGENT) || !getenv ("GPG_AGENT_INFO")) + return 0; + + if ((tty = ttyname(0))) + setenv ("GPG_TTY", tty, 0); + + return 1; } char *pgp_keyid (pgp_key_t k) @@ -227,11 +233,13 @@ static void pgp_copy_clearsigned (FILE * fpin, STATE * s, char *charset) int pgp_application_pgp_handler (BODY * m, STATE * s) { + int could_not_decrypt = 0; int needpass = -1, pgp_keyblock = 0; - int c; + int c = 1; int clearsign = 0, rv, rc; long start_pos = 0; - long bytes, last_pos, offset; + long bytes; + off_t last_pos, offset; char buf[HUGE_STRING]; char outfile[_POSIX_PATH_MAX]; char tmpfname[_POSIX_PATH_MAX]; @@ -248,14 +256,14 @@ int pgp_application_pgp_handler (BODY * m, STATE * s) rc = 0; /* silence false compiler warning if (s->flags & M_DISPLAY) */ - fseek (s->fpin, m->offset, 0); + fseeko (s->fpin, m->offset, 0); last_pos = m->offset; for (bytes = m->length; bytes > 0;) { if (fgets (buf, sizeof (buf), s->fpin) == NULL) break; - offset = ftell (s->fpin); + offset = ftello (s->fpin); bytes -= (offset - last_pos); /* don't rely on str_len(buf) */ last_pos = offset; @@ -293,7 +301,7 @@ int pgp_application_pgp_handler (BODY * m, STATE * s) fputs (buf, tmpfp); while (bytes > 0 && fgets (buf, sizeof (buf) - 1, s->fpin) != NULL) { - offset = ftell (s->fpin); + offset = ftello (s->fpin); bytes -= (offset - last_pos); /* don't rely on str_len(buf) */ last_pos = offset; @@ -369,16 +377,22 @@ int pgp_application_pgp_handler (BODY * m, STATE * s) } /* treat empty result as sign of failure */ + /* TODO: maybe on failure mutt should include the original undecoded text. */ if (pgpout) { rewind (pgpout); c = fgetc (pgpout); ungetc (c, pgpout); } - if (!pgpout || c == EOF) { - mutt_error _("Could not decrypt PGP message"); - pgp_void_passphrase (); - rc = -1; - goto out; + if (!clearsign && (!pgpout || c == EOF)) { + could_not_decrypt = 1; + pgp_void_passphrase (); + } + + if (could_not_decrypt && !(s->flags & M_DISPLAY)) { + mutt_error _("Could not decrypt PGP message"); + mutt_sleep (1); + rc = -1; + goto out; } } @@ -418,7 +432,10 @@ int pgp_application_pgp_handler (BODY * m, STATE * s) state_putc ('\n', s); if (needpass) { state_attach_puts (_("[-- END PGP MESSAGE --]\n"), s); - mutt_message _("PGP message successfully decrypted."); + if (could_not_decrypt) + mutt_error _("Could not decrypt PGP message."); + else + mutt_message _("PGP message successfully decrypted."); } else if (pgp_keyblock) state_attach_puts (_("[-- END PGP PUBLIC KEY BLOCK --]\n"), s); @@ -554,7 +571,7 @@ int pgp_verify_one (BODY * sigbdy, STATE * s, const char *tempfile) return -1; } - fseek (s->fpin, sigbdy->offset, 0); + fseeko (s->fpin, sigbdy->offset, 0); mutt_copy_bytes (s->fpin, fp, sigbdy->length); fclose (fp); @@ -736,7 +753,7 @@ BODY *pgp_decrypt_part (BODY * a, STATE * s, FILE * fpout, BODY * p) * the temporary file. */ - fseek (s->fpin, a->offset, 0); + fseeko (s->fpin, a->offset, 0); mutt_copy_bytes (s->fpin, pgptmp, a->length); fclose (pgptmp);