~bigbes/core-go

177d60f9cba15911dcce2e196a4fc02f2968ece2 — Drew DeVault 5 years ago 606ff2e
Encrypt outgoing emails
1 files changed, 39 insertions(+), 18 deletions(-)

M email/worker.go
M email/worker.go => email/worker.go +39 -18
@@ 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
}