fix(BRIDGE-231): fix reversed header order in messages.

This commit is contained in:
Xavier Michelon
2024-10-18 10:34:16 +02:00
parent 84f0a6722a
commit cb8d1a2389
3 changed files with 164 additions and 11 deletions

View File

@ -18,9 +18,14 @@
package message
import (
"bytes"
"regexp"
"strings"
"testing"
gomessage "github.com/emersion/go-message"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestHeaderLines(t *testing.T) {
@ -130,3 +135,69 @@ func FuzzReadHeaderBody(f *testing.F) {
_, _, _ = readHeaderBody(b)
})
}
func TestHeaderOrder(t *testing.T) {
literal := []byte(`X-Pm-Content-Encryption: end-to-end
X-Pm-Origin: internal
Subject: header test
To: Test Proton <test@proton.me>
From: Dummy Recipient <dummy@proton.me>
Date: Tue, 15 Oct 2024 07:54:39 +0000
Mime-Version: 1.0
Content-Type: multipart/mixed;boundary=---------------------a136fc3851075ca3f022f5c3ec6bf8f5
Message-Id: <1rYR51zNVZdyCXVvAZ8C9N8OaBg4wO_wg6VlSoLK_Mv-2AaiF5UL-vE_tIZ6FdYP8ylsuV3fpaKUpVwuUcnQ6ql_83aEgZvfC5QcZbind1k=@proton.me>
X-Pm-Spamscore: 0
Received: from mail.protonmail.ch by mail.protonmail.ch; Tue, 15 Oct 2024 07:54:43 +0000
X-Original-To: test@proton.me
Return-Path: <dummy@proton.me>
Delivered-To: test@proton.me
lorem`)
// build a proton message
message := newTestMessageFromRFC822(t, literal)
options := JobOptions{
IgnoreDecryptionErrors: true,
SanitizeDate: true,
AddInternalID: true,
AddExternalID: true,
AddMessageDate: true,
AddMessageIDReference: true,
SanitizeMBOXHeaderLine: true,
}
// Rebuild the headers using bridge's algorithm, sanitizing fields.
hdr := getTextPartHeader(getMessageHeader(message, options), []byte(message.Body), message.MIMEType)
var b bytes.Buffer
w, err := gomessage.CreateWriter(&b, hdr)
require.NoError(t, err)
_ = w.Close()
// split the header
str := string(regexp.MustCompile(`\r\n(\s+)`).ReplaceAll(b.Bytes(), nil)) // join multi
lines := strings.Split(str, "\r\n")
// Check we have the expected order
require.Equal(t, len(lines), 17)
// The fields added or modified are at the top
require.True(t, strings.HasPrefix(lines[0], "Content-Type: multipart/mixed;boundary=")) // we changed the boundary
require.True(t, strings.HasPrefix(lines[1], "References: ")) // Reference was added
require.True(t, strings.HasPrefix(lines[2], "X-Pm-Date: ")) // X-Pm-Date was added
require.True(t, strings.HasPrefix(lines[3], "X-Pm-Internal-Id: ")) // X-Pm-Internal-Id was added
require.Equal(t, `To: "Test Proton" <test@proton.me>`, lines[4]) // Name was double quoted
require.Equal(t, `From: "Dummy Recipient" <dummy@proton.me>`, lines[5]) // Name was double quoted
// all other fields appear in their original order
require.Equal(t, `X-Pm-Content-Encryption: end-to-end`, lines[6])
require.Equal(t, `X-Pm-Origin: internal`, lines[7])
require.Equal(t, `Subject: header test`, lines[8])
require.Equal(t, `Date: Tue, 15 Oct 2024 07:54:39 +0000`, lines[9])
require.Equal(t, `Mime-Version: 1.0`, lines[10])
require.Equal(t, `Message-Id: <1rYR51zNVZdyCXVvAZ8C9N8OaBg4wO_wg6VlSoLK_Mv-2AaiF5UL-vE_tIZ6FdYP8ylsuV3fpaKUpVwuUcnQ6ql_83aEgZvfC5QcZbind1k=@proton.me>`, lines[11])
require.Equal(t, `X-Pm-Spamscore: 0`, lines[12])
require.Equal(t, `Received: from mail.protonmail.ch by mail.protonmail.ch; Tue, 15 Oct 2024 07:54:43 +0000`, lines[13])
require.Equal(t, `X-Original-To: test@proton.me`, lines[14])
require.Equal(t, `Return-Path: <dummy@proton.me>`, lines[15])
require.Equal(t, `Delivered-To: test@proton.me`, lines[16])
}