From 80d556343e5083530d3fa5d2497909ca2d4543b5 Mon Sep 17 00:00:00 2001 From: Xavier Michelon Date: Tue, 26 Nov 2024 16:02:43 +0100 Subject: [PATCH] fix(BRIDGE-256): fix reversed order of headers with multiple values. --- pkg/message/build.go | 5 +++-- pkg/message/build_framework_test.go | 5 +++++ pkg/message/header_test.go | 20 +++++++++++++------- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/pkg/message/build.go b/pkg/message/build.go index c9c82ced..8f81f812 100644 --- a/pkg/message/build.go +++ b/pkg/message/build.go @@ -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). for i := len(hdr.Order) - 1; i >= 0; 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. // This buffer is used latter on in message writer to construct message and avoid crash // when key length is more than 76 characters long. - res.AddRaw([]byte(key + ": " + val + "\r\n")) + res.AddRaw([]byte(key + ": " + values[j] + "\r\n")) } } diff --git a/pkg/message/build_framework_test.go b/pkg/message/build_framework_test.go index 18cb77f8..ba065a13 100644 --- a/pkg/message/build_framework_test.go +++ b/pkg/message/build_framework_test.go @@ -101,6 +101,11 @@ func newTestMessageFromRFC822(t *testing.T, literal []byte) proton.Message { var parsedHeaders proton.Headers parsedHeaders.Values = make(map[string][]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.Order = append(parsedHeaders.Order, key) }) diff --git a/pkg/message/header_test.go b/pkg/message/header_test.go index 3d916557..db068a62 100644 --- a/pkg/message/header_test.go +++ b/pkg/message/header_test.go @@ -145,6 +145,9 @@ From: Dummy Recipient Date: Tue, 15 Oct 2024 07:54:39 +0000 Mime-Version: 1.0 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> X-Pm-Spamscore: 0 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") // 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 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, `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: `, lines[15]) - require.Equal(t, `Delivered-To: test@proton.me`, lines[16]) + require.Equal(t, `X-Attached: image1.jpg`, lines[11]) + require.Equal(t, `X-Attached: image2.jpg`, lines[12]) + require.Equal(t, `X-Attached: image3.jpg`, lines[13]) + require.Equal(t, `Message-Id: <1rYR51zNVZdyCXVvAZ8C9N8OaBg4wO_wg6VlSoLK_Mv-2AaiF5UL-vE_tIZ6FdYP8ylsuV3fpaKUpVwuUcnQ6ql_83aEgZvfC5QcZbind1k=@proton.me>`, lines[14]) + require.Equal(t, `X-Pm-Spamscore: 0`, lines[15]) + 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: `, lines[18]) + require.Equal(t, `Delivered-To: test@proton.me`, lines[19]) }