From d3eed8cf812f3ffd5df543f839f6fd554a4dc703 Mon Sep 17 00:00:00 2001 From: Romain LE JEUNE Date: Tue, 21 Nov 2023 17:30:59 +0100 Subject: [PATCH] chore: add test for inline encrypted. --- message_encrypt_test.go | 92 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/message_encrypt_test.go b/message_encrypt_test.go index b057d96..196353e 100644 --- a/message_encrypt_test.go +++ b/message_encrypt_test.go @@ -233,3 +233,95 @@ SGVsbG8gQXR0YWNobWVudA== require.Equal(t, "Hello Attachment", dec.GetString()) } } + +func TestEncryptMessage_Inline(t *testing.T) { + const message = `From: Nathaniel Borenstein +To: Ned Freed +Subject: Sample message (import inline) +MIME-Version: 1.0 +Content-type: multipart/related; boundary="BOUNDARY" + +--BOUNDARY +Content-type: text/plain; charset=us-ascii + +Hello world +--BOUNDARY +Content-Type: image/gif; name="email-action-left.gif" +Content-Transfer-Encoding: base64 +Content-ID: +Content-Disposition: inline; filename="email-action-left.gif" + +SGVsbG8gQXR0YWNobWVudA== +--BOUNDARY-- +` + key, err := crypto.GenerateKey("foobar", "foo@bar.com", "x25519", 0) + require.NoError(t, err) + + kr, err := crypto.NewKeyRing(key) + require.NoError(t, err) + + encryptedMessage, err := proton.EncryptRFC822(kr, []byte(message)) + require.NoError(t, err) + + section := rfc822.Parse(encryptedMessage) + + { + // Check root header: + header, err := section.ParseHeader() + require.NoError(t, err) + + assert.Equal(t, header.Get("From"), "Nathaniel Borenstein ") + assert.Equal(t, header.Get("To"), "Ned Freed ") + assert.Equal(t, header.Get("Subject"), "Sample message (import inline)") + assert.Equal(t, header.Get("MIME-Version"), "1.0") + + mediaType, params, err := rfc822.ParseMediaType(header.Get("Content-Type")) + require.NoError(t, err) + assert.Equal(t, "multipart/related", mediaType) + assert.NotEmpty(t, params["boundary"]) + } + + children, err := section.Children() + require.NoError(t, err) + require.Equal(t, 2, len(children)) + + { + // check first child. + child := children[0] + header, err := child.ParseHeader() + require.NoError(t, err) + + header.Entries(func(key, value string) { + // Old header should be deleted. + assert.NotEqual(t, key, "Content-type") + assert.NotEqual(t, value, "text/plain; charset=us-ascii") + }) + + assert.Equal(t, header.Get("Content-Type"), "text/plain; charset=utf-8") + } + + { + // check second child. + child := children[1] + header, err := child.ParseHeader() + require.NoError(t, err) + + assert.Equal(t, header.Get("Content-Transfer-Encoding"), "base64") + assert.Equal(t, header.Get("Content-Disposition"), `inline; filename="email-action-left.gif"`) + assert.Equal(t, header.Get("Content-type"), `image/gif; name="email-action-left.gif"`) + + body := child.Body() + + // Read the body. + bodyDecoded, err := io.ReadAll(base64.NewDecoder(base64.StdEncoding, bytes.NewReader(body))) + require.NoError(t, err) + + // Unarmor the PGP message. + enc := crypto.NewPGPMessage(bodyDecoded) + + // Decrypt the PGP message. + dec, err := kr.Decrypt(enc, nil, crypto.GetUnixTime()) + require.NoError(t, err) + require.Equal(t, "Hello Attachment", dec.GetString()) + } +}