From 6a10123f4a361ae5c2e712752ea4c95b6724e678 Mon Sep 17 00:00:00 2001 From: Tim Culverhouse Date: Sat, 25 Jun 2022 09:22:49 -0500 Subject: [PATCH] gpg: don't send messages that failed encryption Add error handling for messages that were unable to be encrypted. Previously, messages that failed encryption would be sent with no content. This patch adds error handling - when encryption fails, the user is returned to the Review screen and instructed to check the public keys for their recipients. Reported-by: Moritz Poldrack Signed-off-by: Tim Culverhouse Acked-by: Moritz Poldrack --- lib/crypto/gpg/gpgbin/encrypt.go | 6 +++++- lib/crypto/gpg/gpgbin/gpgbin.go | 2 ++ widgets/compose.go | 5 ++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/crypto/gpg/gpgbin/encrypt.go b/lib/crypto/gpg/gpgbin/encrypt.go index 4cbac37..e72ba14 100644 --- a/lib/crypto/gpg/gpgbin/encrypt.go +++ b/lib/crypto/gpg/gpgbin/encrypt.go @@ -2,6 +2,7 @@ package gpgbin import ( "bytes" + "fmt" "io" "git.sr.ht/~rjarry/aerc/models" @@ -27,7 +28,10 @@ func Encrypt(r io.Reader, to []string, from string) ([]byte, error) { g.cmd.Run() outRdr := bytes.NewReader(g.stdout.Bytes()) var md models.MessageDetails - parse(outRdr, &md) + err := parse(outRdr, &md) + if err != nil { + return nil, fmt.Errorf("gpg: failure to encrypt: %v. check public key(s)", err) + } var buf bytes.Buffer io.Copy(&buf, md.Body) diff --git a/lib/crypto/gpg/gpgbin/gpgbin.go b/lib/crypto/gpg/gpgbin/gpgbin.go index bce3097..9f79e97 100644 --- a/lib/crypto/gpg/gpgbin/gpgbin.go +++ b/lib/crypto/gpg/gpgbin/gpgbin.go @@ -228,6 +228,8 @@ func parse(r io.Reader, md *models.MessageDetails) error { md.Micalg = micalgs[micalg] case "NODATA": md.SignatureError = "gpg: no signature packet found" + case "FAILURE": + return fmt.Errorf(strings.TrimPrefix(line, "[GNUPG:] ")) } } md.Body = bytes.NewReader(msgContent) diff --git a/widgets/compose.go b/widgets/compose.go index 49a8eff..2016abb 100644 --- a/widgets/compose.go +++ b/widgets/compose.go @@ -598,7 +598,10 @@ func (c *Composer) WriteMessage(header *mail.Header, writer io.Writer) error { if err != nil { return err } - cleartext.Close() + err = cleartext.Close() + if err != nil { + return err + } io.Copy(writer, &buf) return nil