chore(GODT-2916): Split Decryption from Message Building

This helps the export tool to deal with problems arising from message
assembly after everything has been successfully encrypted.

The original behavior is still available under `DecryptAndBuildRFC822`.
This commit is contained in:
Leander Beernaert
2023-09-18 14:38:51 +02:00
parent fa794a982b
commit 03c3404044
8 changed files with 240 additions and 167 deletions

View File

@ -39,7 +39,7 @@ func TestBuildPlainMessage(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "text/plain", "body", time.Now())
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -56,7 +56,7 @@ func TestBuildPlainMessageWithLongKey(t *testing.T) {
msg := newTestMessage(t, kr, "messageID", "addressID", "text/plain", "body", time.Now())
msg.ParsedHeaders["ReallyVeryVeryVeryVeryVeryLongLongLongLongLongLongLongKeyThatWillHaveNotSoLongValue"] = []string{"value"}
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -73,7 +73,7 @@ func TestBuildHTMLMessage(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "text/html", "<html><body>body</body></html>", time.Now())
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -91,7 +91,7 @@ func TestBuildPlainEncryptedMessage(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "multipart/mixed", body, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -116,7 +116,7 @@ func TestBuildPlainEncryptedMessageMissingHeader(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "multipart/mixed", body, time.Now())
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -133,7 +133,7 @@ func TestBuildPlainEncryptedMessageInvalidHeader(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "multipart/mixed", body, time.Now())
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -158,7 +158,7 @@ func TestBuildPlainSignedEncryptedMessageMissingHeader(t *testing.T) {
msg := newRawTestMessage("messageID", "addressID", "multipart/mixed", arm, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -195,7 +195,7 @@ func TestBuildPlainSignedEncryptedMessageInvalidHeader(t *testing.T) {
msg := newRawTestMessage("messageID", "addressID", "multipart/mixed", arm, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -224,7 +224,7 @@ func TestBuildPlainEncryptedLatin2Message(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "multipart/mixed", body, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -246,7 +246,7 @@ func TestBuildHTMLEncryptedMessage(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "multipart/mixed", body, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -280,7 +280,7 @@ func TestBuildPlainSignedMessage(t *testing.T) {
msg := newRawTestMessage("messageID", "addressID", "multipart/mixed", arm, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -318,7 +318,7 @@ func TestBuildPlainSignedBase64Message(t *testing.T) {
msg := newRawTestMessage("messageID", "addressID", "multipart/mixed", arm, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -349,7 +349,7 @@ func TestBuildSignedPlainEncryptedMessage(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "multipart/mixed", body, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -386,7 +386,7 @@ func TestBuildSignedHTMLEncryptedMessage(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "multipart/mixed", body, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -425,7 +425,7 @@ func TestBuildSignedPlainEncryptedMessageWithPubKey(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "multipart/mixed", body, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -471,7 +471,7 @@ func TestBuildSignedHTMLEncryptedMessageWithPubKey(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "multipart/mixed", body, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -518,7 +518,7 @@ func TestBuildSignedMultipartAlternativeEncryptedMessageWithPubKey(t *testing.T)
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "multipart/mixed", body, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -575,7 +575,7 @@ func TestBuildSignedEmbeddedMessageRFC822EncryptedMessageWithPubKey(t *testing.T
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "multipart/mixed", body, time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -625,7 +625,7 @@ func TestBuildHTMLMessageWithAttachment(t *testing.T) {
msg := newTestMessage(t, kr, "messageID", "addressID", "text/html", "<html><body>body</body></html>", time.Now())
att := addTestAttachment(t, kr, &msg, "attachID", "file.png", "image/png", "attachment", "attachment")
res, err := BuildRFC822(kr, msg, [][]byte{att}, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, [][]byte{att}, JobOptions{})
require.NoError(t, err)
section(t, res, 1).
@ -649,7 +649,7 @@ func TestBuildHTMLMessageWithRFC822Attachment(t *testing.T) {
msg := newTestMessage(t, kr, "messageID", "addressID", "text/html", "<html><body>body</body></html>", time.Now())
att := addTestAttachment(t, kr, &msg, "attachID", "file.eml", "message/rfc822", "attachment", "... message/rfc822 ...")
res, err := BuildRFC822(kr, msg, [][]byte{att}, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, [][]byte{att}, JobOptions{})
require.NoError(t, err)
section(t, res, 1).
@ -673,7 +673,7 @@ func TestBuildHTMLMessageWithInlineAttachment(t *testing.T) {
msg := newTestMessage(t, kr, "messageID", "addressID", "text/html", "<html><body>body</body></html>", time.Now())
inl := addTestAttachment(t, kr, &msg, "inlineID", "file.png", "image/png", "inline", "inline")
res, err := BuildRFC822(kr, msg, [][]byte{inl}, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, [][]byte{inl}, JobOptions{})
require.NoError(t, err)
section(t, res, 1).
@ -703,7 +703,7 @@ func TestBuildHTMLMessageWithComplexAttachments(t *testing.T) {
att0 := addTestAttachment(t, kr, &msg, "attachID0", "attach0.png", "image/png", "attachment", "attach0")
att1 := addTestAttachment(t, kr, &msg, "attachID1", "attach1.png", "image/png", "attachment", "attach1")
res, err := BuildRFC822(kr, msg, [][]byte{
res, err := DecryptAndBuildRFC822(kr, msg, [][]byte{
inl0,
inl1,
att0,
@ -756,7 +756,7 @@ func TestBuildAttachmentWithExoticFilename(t *testing.T) {
msg := newTestMessage(t, kr, "messageID", "addressID", "text/html", "<html><body>body</body></html>", time.Now())
att := addTestAttachment(t, kr, &msg, "attachID", `I řeally šhould leařn czech.png`, "image/png", "attachment", "attachment")
res, err := BuildRFC822(kr, msg, [][]byte{att}, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, [][]byte{att}, JobOptions{})
require.NoError(t, err)
// The "name" and "filename" params should actually be RFC2047-encoded because they aren't 7-bit clean.
@ -778,7 +778,7 @@ func TestBuildAttachmentWithLongFilename(t *testing.T) {
msg := newTestMessage(t, kr, "messageID", "addressID", "text/html", "<html><body>body</body></html>", time.Now())
att := addTestAttachment(t, kr, &msg, "attachID", veryLongName, "image/png", "attachment", "attachment")
res, err := BuildRFC822(kr, msg, [][]byte{att}, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, [][]byte{att}, JobOptions{})
require.NoError(t, err)
// NOTE: hasMaxLineLength is too high! Long filenames should be linewrapped using multipart filenames.
@ -798,7 +798,7 @@ func TestBuildMessageDate(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "text/plain", "body", time.Date(2020, time.January, 1, 0, 0, 0, 0, time.UTC))
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).expectDate(is(`Wed, 01 Jan 2020 00:00:00 +0000`))
@ -814,7 +814,7 @@ func TestBuildMessageWithInvalidDate(t *testing.T) {
msg := newTestMessage(t, kr, "messageID", "addressID", "text/html", "<html><body>body</body></html>", time.Unix(-1, 0))
// Build the message as usual; the date will be before 1970.
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -822,7 +822,7 @@ func TestBuildMessageWithInvalidDate(t *testing.T) {
expectHeader(`X-Original-Date`, isMissing())
// Build the message with date sanitization enabled; the date will be RFC822's birthdate.
resFix, err := BuildRFC822(kr, msg, nil, JobOptions{SanitizeDate: true})
resFix, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{SanitizeDate: true})
require.NoError(t, err)
section(t, resFix).
@ -849,7 +849,7 @@ func TestBuildMessageWithExistingOriginalDate(t *testing.T) {
})
// Build the message as usual; the date will be before 1970.
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -857,7 +857,7 @@ func TestBuildMessageWithExistingOriginalDate(t *testing.T) {
expectHeader(`X-Original-Date`, is("Sun, 15 Jan 2023 04:23:03 +0100 (W. Europe Standard Time)"))
// Build the message with date sanitization enabled; the date will be RFC822's birthdate.
resFix, err := BuildRFC822(kr, msg, nil, JobOptions{SanitizeDate: true})
resFix, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{SanitizeDate: true})
require.NoError(t, err)
section(t, resFix).
@ -872,7 +872,7 @@ func TestBuildMessageInternalID(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "text/plain", "body", time.Now())
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).expectHeader(`Message-Id`, is(`<messageID@protonmail.internalid>`))
@ -888,7 +888,7 @@ func TestBuildMessageExternalID(t *testing.T) {
// Set the message's external ID; this should be used preferentially to set the Message-Id header field.
msg.ExternalID = "externalID"
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).expectHeader(`Message-Id`, is(`<externalID>`))
@ -903,7 +903,7 @@ func TestBuild8BitBody(t *testing.T) {
// Set an 8-bit body; the charset should be set to UTF-8.
msg := newTestMessage(t, kr, "messageID", "addressID", "text/plain", "I řeally šhould leařn czech", time.Now())
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).expectContentTypeParam(`charset`, is(`utf-8`))
@ -919,7 +919,7 @@ func TestBuild8BitSubject(t *testing.T) {
// Set an 8-bit subject; it should be RFC2047-encoded.
msg.Subject = `I řeally šhould leařn czech`
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -940,7 +940,7 @@ func TestBuild8BitSender(t *testing.T) {
Address: `mail@example.com`,
}
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -961,7 +961,7 @@ func TestBuild8BitRecipients(t *testing.T) {
{Name: `leařn czech`, Address: `mail2@example.com`},
}
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).
@ -979,12 +979,12 @@ func TestBuildIncludeMessageIDReference(t *testing.T) {
// Add references.
msg.ParsedHeaders["References"] = []string{"<myreference@domain.com>"}
res, err := BuildRFC822(kr, msg, nil, JobOptions{})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
section(t, res).expectHeader(`References`, is(`<myreference@domain.com>`))
resRef, err := BuildRFC822(kr, msg, nil, JobOptions{AddMessageIDReference: true})
resRef, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{AddMessageIDReference: true})
require.NoError(t, err)
section(t, resRef).expectHeader(`References`, is(`<myreference@domain.com> <messageID@protonmail.internalid>`))
@ -999,10 +999,10 @@ func TestBuildMessageIsDeterministic(t *testing.T) {
inl := addTestAttachment(t, kr, &msg, "inlineID", "file.png", "image/png", "inline", "inline")
att := addTestAttachment(t, kr, &msg, "attachID", "attach.png", "image/png", "attachment", "attachment")
res1, err := BuildRFC822(kr, msg, [][]byte{inl, att}, JobOptions{})
res1, err := DecryptAndBuildRFC822(kr, msg, [][]byte{inl, att}, JobOptions{})
require.NoError(t, err)
res2, err := BuildRFC822(kr, msg, [][]byte{inl, att}, JobOptions{})
res2, err := DecryptAndBuildRFC822(kr, msg, [][]byte{inl, att}, JobOptions{})
require.NoError(t, err)
assert.Equal(t, res1, res2)
@ -1017,7 +1017,7 @@ func TestBuildUndecryptableMessage(t *testing.T) {
// Use a different keyring for encrypting the message; it won't be decryptable.
msg := newTestMessage(t, utils.MakeKeyRing(t), "messageID", "addressID", "text/plain", "body", time.Now())
_, err := BuildRFC822(kr, msg, nil, JobOptions{})
_, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.ErrorIs(t, err, ErrDecryptionFailed)
}
@ -1031,7 +1031,7 @@ func TestBuildUndecryptableAttachment(t *testing.T) {
// Use a different keyring for encrypting the attachment; it won't be decryptable.
att := addTestAttachment(t, utils.MakeKeyRing(t), &msg, "attachID", "file.png", "image/png", "attachment", "attachment")
_, err := BuildRFC822(kr, msg, [][]byte{att}, JobOptions{})
_, err := DecryptAndBuildRFC822(kr, msg, [][]byte{att}, JobOptions{})
require.ErrorIs(t, err, ErrDecryptionFailed)
}
@ -1046,7 +1046,7 @@ func TestBuildCustomMessagePlain(t *testing.T) {
msg := newTestMessage(t, foreignKR, "messageID", "addressID", "text/plain", "body", time.Now())
// Tell the job to ignore decryption errors; a custom message will be returned instead of an error.
res, err := BuildRFC822(kr, msg, nil, JobOptions{IgnoreDecryptionErrors: true})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{IgnoreDecryptionErrors: true})
require.NoError(t, err)
section(t, res).
@ -1070,7 +1070,7 @@ func TestBuildCustomMessageHTML(t *testing.T) {
msg := newTestMessage(t, foreignKR, "messageID", "addressID", "text/html", "<html><body>body</body></html>", time.Now())
// Tell the job to ignore decryption errors; a custom message will be returned instead of an error.
res, err := BuildRFC822(kr, msg, nil, JobOptions{IgnoreDecryptionErrors: true})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{IgnoreDecryptionErrors: true})
require.NoError(t, err)
section(t, res).
@ -1098,7 +1098,7 @@ func TestBuildCustomMessageEncrypted(t *testing.T) {
msg.Subject = "this is a subject to make sure we preserve subject"
// Tell the job to ignore decryption errors; a custom message will be returned instead of an error.
res, err := BuildRFC822(kr, msg, nil, JobOptions{IgnoreDecryptionErrors: true})
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{IgnoreDecryptionErrors: true})
require.NoError(t, err)
section(t, res).
@ -1132,7 +1132,7 @@ func TestBuildCustomMessagePlainWithAttachment(t *testing.T) {
att := addTestAttachment(t, foreignKR, &msg, "attachID", "file.png", "image/png", "attachment", "attachment")
// Tell the job to ignore decryption errors; a custom message will be returned instead of an error.
res, err := BuildRFC822(kr, msg, [][]byte{att}, JobOptions{IgnoreDecryptionErrors: true})
res, err := DecryptAndBuildRFC822(kr, msg, [][]byte{att}, JobOptions{IgnoreDecryptionErrors: true})
require.NoError(t, err)
section(t, res).
@ -1165,7 +1165,7 @@ func TestBuildCustomMessageHTMLWithAttachment(t *testing.T) {
att := addTestAttachment(t, foreignKR, &msg, "attachID", "file.png", "image/png", "attachment", "attachment")
// Tell the job to ignore decryption errors; a custom message will be returned instead of an error.
res, err := BuildRFC822(kr, msg, [][]byte{att}, JobOptions{IgnoreDecryptionErrors: true})
res, err := DecryptAndBuildRFC822(kr, msg, [][]byte{att}, JobOptions{IgnoreDecryptionErrors: true})
require.NoError(t, err)
section(t, res).
@ -1200,7 +1200,7 @@ func TestBuildCustomMessageOnlyBodyIsUndecryptable(t *testing.T) {
att := addTestAttachment(t, kr, &msg, "attachID", "file.png", "image/png", "attachment", "attachment")
// Tell the job to ignore decryption errors; a custom message will be returned instead of an error.
res, err := BuildRFC822(kr, msg, [][]byte{att}, JobOptions{IgnoreDecryptionErrors: true})
res, err := DecryptAndBuildRFC822(kr, msg, [][]byte{att}, JobOptions{IgnoreDecryptionErrors: true})
require.NoError(t, err)
section(t, res).
@ -1233,7 +1233,7 @@ func TestBuildCustomMessageOnlyAttachmentIsUndecryptable(t *testing.T) {
att := addTestAttachment(t, foreignKR, &msg, "attachID", "file.png", "image/png", "attachment", "attachment")
// Tell the job to ignore decryption errors; a custom message will be returned instead of an error.
res, err := BuildRFC822(kr, msg, [][]byte{att}, JobOptions{IgnoreDecryptionErrors: true})
res, err := DecryptAndBuildRFC822(kr, msg, [][]byte{att}, JobOptions{IgnoreDecryptionErrors: true})
require.NoError(t, err)
section(t, res).
@ -1271,7 +1271,7 @@ func TestBuildComplexMIMEType(t *testing.T) {
att0 := addTestAttachment(t, kr, &msg, "attachID0", "attach0.png", "image/png", "attachment", "attach0")
att1 := addTestAttachment(t, kr, &msg, "attachID1", "Cat_August_2010-4.jpeg", "image/jpeg; name=Cat_August_2010-4.jpeg; x-unix-mode=0644", "attachment", "attach1")
res, err := BuildRFC822(kr, msg, [][]byte{
res, err := DecryptAndBuildRFC822(kr, msg, [][]byte{
att0,
att1,
}, JobOptions{})