summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Culverhouse <tim@timculverhouse.com>2022-06-25 09:22:49 -0500
committerRobin Jarry <robin@jarry.cc>2022-06-26 12:07:44 +0200
commit6a10123f4a361ae5c2e712752ea4c95b6724e678 (patch)
tree6d77c73ab867b494b14dce52a084af258022bba4
parent96db50c4f06bab4ef052b584943d8c7113766a06 (diff)
downloadaerc-6a10123f4a361ae5c2e712752ea4c95b6724e678.zip
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 <moritz@poldrack.dev> Signed-off-by: Tim Culverhouse <tim@timculverhouse.com> Acked-by: Moritz Poldrack <moritz@poldrack.dev>
-rw-r--r--lib/crypto/gpg/gpgbin/encrypt.go6
-rw-r--r--lib/crypto/gpg/gpgbin/gpgbin.go2
-rw-r--r--widgets/compose.go5
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