From 177d60f9cba15911dcce2e196a4fc02f2968ece2 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sat, 14 Nov 2020 12:52:33 -0500 Subject: [PATCH] Encrypt outgoing emails --- email/worker.go | 57 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/email/worker.go b/email/worker.go index e91602f0000dc1ca10ae8b9a42cf24ba1383b6d8..41cb120637396f8e6582fe78dc601e0229ad9318 100644 --- a/email/worker.go +++ b/email/worker.go @@ -95,6 +95,14 @@ func EnqueueStd(ctx context.Context, header mail.Header, panic(err) } + var rcpts []string + for _, addr := range to { + rcpts = append(rcpts, addr.Address) + } + for _, addr := range cc { + rcpts = append(rcpts, addr.Address) + } + header.GenerateMessageID() header.SetDate(time.Now().UTC()) header.SetAddressList("From", from) @@ -123,36 +131,49 @@ func EnqueueStd(ctx context.Context, header mail.Header, panic(errors.New("Failed to load private key for email signature")) } - var signedHeader mail.Header - signedHeader.SetContentType("text/plain", nil) + var ( + buf bytes.Buffer + cleartext io.WriteCloser + ) - var buf bytes.Buffer - cleartext, err := pgpmail.Sign(&buf, header.Header.Header, entity, nil) - if err != nil { - log.Fatal(err) + if rcptKey != nil { + keyring, err = openpgp.ReadArmoredKeyRing(strings.NewReader(*rcptKey)) + if err != nil { + log.Fatal(err) + } + if len(keyring) != 1 { + return errors.New("Expected user PGP key to contain one key") + } + rcptEntity := keyring[0] + + cleartext, err = pgpmail.Encrypt(&buf, header.Header.Header, + []*openpgp.Entity{rcptEntity}, entity, nil) + if err != nil { + log.Fatal(err) + } + defer cleartext.Close() + } else { + cleartext, err = pgpmail.Sign(&buf, header.Header.Header, + entity, nil) + if err != nil { + log.Fatal(err) + } + defer cleartext.Close() } - body, err := mail.CreateSingleInlineWriter(cleartext, signedHeader) + var inlineHeader mail.Header + inlineHeader.SetContentType("text/plain", nil) + body, err := mail.CreateSingleInlineWriter(cleartext, inlineHeader) if err != nil { panic(err) } + defer body.Close() _, err = io.Copy(body, bodyReader) if err != nil { log.Fatal(err) } - cleartext.Close() - body.Close() - - var rcpts []string - for _, addr := range to { - rcpts = append(rcpts, addr.Address) - } - for _, addr := range cc { - rcpts = append(rcpts, addr.Address) - } - Enqueue(ctx, &buf, rcpts) return nil }