forked from Silverfish/proton-bridge
fix(BRIDGE-231): fix reversed header order in messages.
This commit is contained in:
@ -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])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user