aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Culverhouse <tim@timculverhouse.com>2022-08-30 19:25:31 -0500
committerRobin Jarry <robin@jarry.cc>2022-08-31 10:10:03 +0200
commitdcd397f776d938a772b9c904d55b7808ec7a80f9 (patch)
treefa43e11dfc4120b40b99c37adcb4d75fb4c588b7
parentcd002567e886d1692799747bfe529d72e024c16d (diff)
downloadaerc-dcd397f776d938a772b9c904d55b7808ec7a80f9.tar.gz
pgp: enable quoted replies of encrypted messages
When quoting an encrypted message for reply, the quoted text is shown as "Version: 1.0". This is due to this being the first non-multipart text portion of the message, which is what the quoted reply logic looks for. Properly quote replies to encrypted messages by decrypting the message, and quoting the content. The message must be open in a message view in order to quote it (it must be decrypted, which is handled by the message viewer). Suggested-by: Moritz Poldrack <moritz@poldrack.dev> Signed-off-by: Tim Culverhouse <tim@timculverhouse.com> Tested-by: Jens Grassel <jens@wegtam.com>
-rw-r--r--commands/msg/reply.go26
-rw-r--r--lib/crypto/crypto.go15
2 files changed, 41 insertions, 0 deletions
diff --git a/commands/msg/reply.go b/commands/msg/reply.go
index 8365172e..e5f8d478 100644
--- a/commands/msg/reply.go
+++ b/commands/msg/reply.go
@@ -11,6 +11,7 @@ import (
"git.sr.ht/~sircmpwn/getopt"
"git.sr.ht/~rjarry/aerc/lib"
+ "git.sr.ht/~rjarry/aerc/lib/crypto"
"git.sr.ht/~rjarry/aerc/lib/format"
"git.sr.ht/~rjarry/aerc/logging"
"git.sr.ht/~rjarry/aerc/models"
@@ -210,6 +211,31 @@ func (reply) Execute(aerc *widgets.Aerc, args []string) error {
template = aerc.Config().Templates.QuotedReply
}
+ if crypto.IsEncrypted(msg.BodyStructure) {
+ provider := aerc.SelectedTabContent().(widgets.ProvidesMessage)
+ mv, ok := provider.(*widgets.MessageViewer)
+ if !ok {
+ return fmt.Errorf("message is encrypted. can only quote reply while message is open")
+ }
+ p := provider.SelectedMessagePart()
+ if p == nil {
+ return fmt.Errorf("could not fetch message part")
+ }
+ mv.MessageView().FetchBodyPart(p.Index, func(reader io.Reader) {
+ buf := new(bytes.Buffer)
+ _, err := buf.ReadFrom(reader)
+ if err != nil {
+ logging.Warnf("failed to fetch bodypart: %v", err)
+ }
+ original.Text = buf.String()
+ err = addTab()
+ if err != nil {
+ logging.Warnf("failed to add tab: %v", err)
+ }
+ })
+ return nil
+ }
+
part := lib.FindPlaintext(msg.BodyStructure, nil)
if part == nil {
// mkey... let's get the first thing that isn't a container
diff --git a/lib/crypto/crypto.go b/lib/crypto/crypto.go
index 8f895b42..b7afe638 100644
--- a/lib/crypto/crypto.go
+++ b/lib/crypto/crypto.go
@@ -31,3 +31,18 @@ func New(s string) Provider {
return &pgp.Mail{}
}
}
+
+func IsEncrypted(bs *models.BodyStructure) bool {
+ if bs == nil {
+ return false
+ }
+ if bs.MIMEType == "application" && bs.MIMESubType == "pgp-encrypted" {
+ return true
+ }
+ for _, part := range bs.Parts {
+ if IsEncrypted(part) {
+ return true
+ }
+ }
+ return false
+}