fix(BRIDGE-256): fix reversed order of headers with multiple values.

This commit is contained in:
Xavier Michelon
2024-11-26 16:02:43 +01:00
parent 612d1054db
commit 80d556343e
3 changed files with 21 additions and 9 deletions

View File

@ -531,11 +531,12 @@ func toMessageHeader(hdr proton.Headers) message.Header {
// go-message's message.Header are in reversed order (you should only add fields at the top, so storing in reverse order offer faster performances). // go-message's message.Header are in reversed order (you should only add fields at the top, so storing in reverse order offer faster performances).
for i := len(hdr.Order) - 1; i >= 0; i-- { for i := len(hdr.Order) - 1; i >= 0; i-- {
key := hdr.Order[i] key := hdr.Order[i]
for _, val := range hdr.Values[key] { values := hdr.Values[key]
for j := len(values) - 1; j >= 0; j-- {
// Using AddRaw instead of Add to save key-value pair as byte buffer within Header. // Using AddRaw instead of Add to save key-value pair as byte buffer within Header.
// This buffer is used latter on in message writer to construct message and avoid crash // This buffer is used latter on in message writer to construct message and avoid crash
// when key length is more than 76 characters long. // when key length is more than 76 characters long.
res.AddRaw([]byte(key + ": " + val + "\r\n")) res.AddRaw([]byte(key + ": " + values[j] + "\r\n"))
} }
} }

View File

@ -101,6 +101,11 @@ func newTestMessageFromRFC822(t *testing.T, literal []byte) proton.Message {
var parsedHeaders proton.Headers var parsedHeaders proton.Headers
parsedHeaders.Values = make(map[string][]string) parsedHeaders.Values = make(map[string][]string)
h.Entries(func(key, val string) { h.Entries(func(key, val string) {
currentVal, ok := parsedHeaders.Values[key]
if ok {
parsedHeaders.Values[key] = append(currentVal, val)
return
}
parsedHeaders.Values[key] = []string{val} parsedHeaders.Values[key] = []string{val}
parsedHeaders.Order = append(parsedHeaders.Order, key) parsedHeaders.Order = append(parsedHeaders.Order, key)
}) })

View File

@ -145,6 +145,9 @@ From: Dummy Recipient <dummy@proton.me>
Date: Tue, 15 Oct 2024 07:54:39 +0000 Date: Tue, 15 Oct 2024 07:54:39 +0000
Mime-Version: 1.0 Mime-Version: 1.0
Content-Type: multipart/mixed;boundary=---------------------a136fc3851075ca3f022f5c3ec6bf8f5 Content-Type: multipart/mixed;boundary=---------------------a136fc3851075ca3f022f5c3ec6bf8f5
X-Attached: image1.jpg
X-Attached: image2.jpg
X-Attached: image3.jpg
Message-Id: <1rYR51zNVZdyCXVvAZ8C9N8OaBg4wO_wg6VlSoLK_Mv-2AaiF5UL-vE_tIZ6FdYP8ylsuV3fpaKUpVwuUcnQ6ql_83aEgZvfC5QcZbind1k=@proton.me> Message-Id: <1rYR51zNVZdyCXVvAZ8C9N8OaBg4wO_wg6VlSoLK_Mv-2AaiF5UL-vE_tIZ6FdYP8ylsuV3fpaKUpVwuUcnQ6ql_83aEgZvfC5QcZbind1k=@proton.me>
X-Pm-Spamscore: 0 X-Pm-Spamscore: 0
Received: from mail.protonmail.ch by mail.protonmail.ch; Tue, 15 Oct 2024 07:54:43 +0000 Received: from mail.protonmail.ch by mail.protonmail.ch; Tue, 15 Oct 2024 07:54:43 +0000
@ -178,7 +181,7 @@ lorem`)
lines := strings.Split(str, "\r\n") lines := strings.Split(str, "\r\n")
// Check we have the expected order // Check we have the expected order
require.Equal(t, len(lines), 17) require.Equal(t, len(lines), 20)
// The fields added or modified are at the top // 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[0], "Content-Type: multipart/mixed;boundary=")) // we changed the boundary
@ -194,10 +197,13 @@ lorem`)
require.Equal(t, `Subject: header test`, lines[8]) 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, `Date: Tue, 15 Oct 2024 07:54:39 +0000`, lines[9])
require.Equal(t, `Mime-Version: 1.0`, lines[10]) 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-Attached: image1.jpg`, lines[11])
require.Equal(t, `X-Pm-Spamscore: 0`, lines[12]) require.Equal(t, `X-Attached: image2.jpg`, 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-Attached: image3.jpg`, lines[13])
require.Equal(t, `X-Original-To: test@proton.me`, lines[14]) require.Equal(t, `Message-Id: <1rYR51zNVZdyCXVvAZ8C9N8OaBg4wO_wg6VlSoLK_Mv-2AaiF5UL-vE_tIZ6FdYP8ylsuV3fpaKUpVwuUcnQ6ql_83aEgZvfC5QcZbind1k=@proton.me>`, lines[14])
require.Equal(t, `Return-Path: <dummy@proton.me>`, lines[15]) require.Equal(t, `X-Pm-Spamscore: 0`, lines[15])
require.Equal(t, `Delivered-To: test@proton.me`, lines[16]) require.Equal(t, `Received: from mail.protonmail.ch by mail.protonmail.ch; Tue, 15 Oct 2024 07:54:43 +0000`, lines[16])
require.Equal(t, `X-Original-To: test@proton.me`, lines[17])
require.Equal(t, `Return-Path: <dummy@proton.me>`, lines[18])
require.Equal(t, `Delivered-To: test@proton.me`, lines[19])
} }