X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=pgp.c;h=4b586e94991aadc738684d942c865ea03989a493;hp=a19c490758a7af50d1c785e8003ed623c31e0afb;hb=242f20d1fc0d2e74059acfed6582af3683d7363f;hpb=bbc4fd52516a8afefbd14c77e34f8389d6f0a6ed diff --git a/pgp.c b/pgp.c index a19c490..4b586e9 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) @@ -225,17 +231,19 @@ static void pgp_copy_clearsigned (FILE * fpin, STATE * s, char *charset) /* 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 c = 1; int clearsign = 0, rv, rc; long start_pos = 0; - long bytes, last_pos, offset; + long bytes; + LOFF_T last_pos, offset; char buf[HUGE_STRING]; char outfile[_POSIX_PATH_MAX]; char tmpfname[_POSIX_PATH_MAX]; FILE *pgpout = NULL, *pgpin = NULL, *pgperr = NULL; - FILE *tmpfp; + FILE *tmpfp = NULL; pid_t thepid; short maybe_goodsig = 1; @@ -247,14 +255,14 @@ void 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; @@ -287,12 +295,12 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) mutt_mktemp (tmpfname); if ((tmpfp = safe_fopen (tmpfname, "w+")) == NULL) { mutt_perror (tmpfname); - return; + return (-1); } 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; @@ -316,7 +324,7 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) mutt_mktemp (outfile); if ((pgpout = safe_fopen (outfile, "w+")) == NULL) { mutt_perror (tmpfname); - return; + return (-1); } if ((thepid = pgp_invoke_decode (&pgpin, NULL, &pgperr, -1, @@ -353,12 +361,13 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) if (s->flags & M_DISPLAY) { if (rc == 0) have_any_sigs = 1; -/* - * Sig is bad if - * gpg_good_sign-pattern did not match || pgp_decode_command returned not 0 - * Sig _is_ correct if - * gpg_good_sign="" && pgp_decode_command returned 0 - */ + + /* + * Sig is bad if + * gpg_good_sign-pattern did not match || pgp_decode_command returned not 0 + * Sig _is_ correct if + * gpg_good_sign="" && pgp_decode_command returned 0 + */ if (rc == -1 || rv) maybe_goodsig = 0; @@ -367,9 +376,20 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) } /* treat empty result as sign of failure */ - if (!(pgpout && ftell (pgpout))) { + /* TODO: maybe on failure mutt should include the original undecoded text. */ + if (pgpout) { + rewind (pgpout); + c = fgetc (pgpout); + ungetc (c, pgpout); + } + if (!clearsign && (!pgpout || c == EOF)) { mutt_error _("Could not decrypt PGP message"); - goto out; + mutt_sleep (1); + pgp_void_passphrase (); + if (!(s->flags & M_DISPLAY)) { + rc = -1; + goto out; + } } } @@ -426,6 +446,8 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) } } + rc = 0; + out: m->goodsig = (maybe_goodsig && have_any_sigs); @@ -442,8 +464,10 @@ out: 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, @@ -541,7 +565,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); @@ -723,7 +747,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); @@ -774,8 +798,11 @@ BODY *pgp_decrypt_part (BODY * a, STATE * s, FILE * fpout, BODY * p) fflush (fpout); rewind (fpout); - if (fgetc (fpout) == EOF) + if (fgetc (fpout) == EOF) { + mutt_error (_("Decryption failed.")); + pgp_void_passphrase (); return NULL; + } rewind (fpout); @@ -827,12 +854,13 @@ int pgp_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b, BODY ** cur) 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 || @@ -842,7 +870,7 @@ void pgp_encrypted_handler (BODY * a, STATE * s) if (s->flags & M_DISPLAY) state_attach_puts (_("[-- Error: malformed PGP/MIME message! --]\n\n"), s); - return; + return (-1); } /* @@ -856,7 +884,7 @@ void pgp_encrypted_handler (BODY * a, STATE * s) state_attach_puts (_ ("[-- Error: could not create temporary file! --]\n"), s); - return; + return (-1); } if (s->flags & M_DISPLAY) @@ -870,7 +898,7 @@ void pgp_encrypted_handler (BODY * a, STATE * s) fpin = s->fpin; s->fpin = fpout; - mutt_body_handler (tattach, s); + rc = mutt_body_handler (tattach, s); s->fpin = fpin; /* @@ -891,11 +919,16 @@ void pgp_encrypted_handler (BODY * a, STATE * s) mutt_free_body (&tattach); /* clear 'Invoking...' message, since there's no error */ mutt_message _("PGP message successfully decrypted."); - } else + } else { mutt_error _("Could not decrypt PGP message"); + pgp_void_passphrase (); + rc = -1; + } fclose (fpout); mutt_unlink (tempfile); + + return (rc); } /* ----------------------------------------------------------------------------