diff --git a/pkg/message/build.go b/pkg/message/build.go index dbace192..57d7eb42 100644 --- a/pkg/message/build.go +++ b/pkg/message/build.go @@ -466,8 +466,10 @@ func getMessageHeader(msg proton.Message, opts JobOptions) message.Header { if date, err := rfc5322.ParseDateTime(hdr.Get("Date")); err != nil || date.Before(time.Unix(0, 0)) { msgDate := SanitizeMessageDate(msg.Time) hdr.Set("Date", msgDate.In(time.UTC).Format(time.RFC1123Z)) - // We clobbered the date so we save it under X-Original-Date. - hdr.Set("X-Original-Date", date.In(time.UTC).Format(time.RFC1123Z)) + // We clobbered the date so we save it under X-Original-Date only if no such value exists. + if !hdr.Has("X-Original-Date") { + hdr.Set("X-Original-Date", date.In(time.UTC).Format(time.RFC1123Z)) + } } } diff --git a/pkg/message/build_framework_test.go b/pkg/message/build_framework_test.go index 089d35d4..516e224e 100644 --- a/pkg/message/build_framework_test.go +++ b/pkg/message/build_framework_test.go @@ -38,6 +38,20 @@ func newTestMessage( kr *crypto.KeyRing, messageID, addressID, mimeType, body string, //nolint:unparam date time.Time, +) proton.Message { + return newTestMessageWithHeaders(t, kr, messageID, addressID, mimeType, body, date, nil) +} + +func newRawTestMessage(messageID, addressID, mimeType, body string, date time.Time) proton.Message { // nolint:unparam + return newRawTestMessageWithHeaders(messageID, addressID, mimeType, body, date, nil) +} + +func newTestMessageWithHeaders( + t *testing.T, + kr *crypto.KeyRing, + messageID, addressID, mimeType, body string, //nolint:unparam + date time.Time, + headers map[string][]string, ) proton.Message { enc, err := kr.Encrypt(crypto.NewPlainMessageFromString(body), kr) require.NoError(t, err) @@ -45,22 +59,28 @@ func newTestMessage( arm, err := enc.GetArmored() require.NoError(t, err) - return newRawTestMessage(messageID, addressID, mimeType, arm, date) + return newRawTestMessageWithHeaders(messageID, addressID, mimeType, arm, date, headers) } -func newRawTestMessage(messageID, addressID, mimeType, body string, date time.Time) proton.Message { +func newRawTestMessageWithHeaders(messageID, addressID, mimeType, body string, date time.Time, headers map[string][]string) proton.Message { + msgHeaders := proton.Headers{ + "Content-Type": {mimeType}, + "Date": {date.In(time.UTC).Format(time.RFC1123Z)}, + } + + for k, v := range headers { + msgHeaders[k] = v + } + return proton.Message{ MessageMetadata: proton.MessageMetadata{ ID: messageID, AddressID: addressID, Time: date.Unix(), }, - ParsedHeaders: proton.Headers{ - "Content-Type": {mimeType}, - "Date": {date.In(time.UTC).Format(time.RFC1123Z)}, - }, - MIMEType: rfc822.MIMEType(mimeType), - Body: body, + ParsedHeaders: msgHeaders, + MIMEType: rfc822.MIMEType(mimeType), + Body: body, } } diff --git a/pkg/message/build_test.go b/pkg/message/build_test.go index 26d72ced..41d52936 100644 --- a/pkg/message/build_test.go +++ b/pkg/message/build_test.go @@ -836,6 +836,41 @@ func TestBuildMessageWithInvalidDate(t *testing.T) { expectHeader(`X-Original-Date`, is(`Wed, 31 Dec 1969 23:59:59 +0000`)) } +func TestBuildMessageWithExistingOriginalDate(t *testing.T) { + m := gomock.NewController(t) + defer m.Finish() + + kr := utils.MakeKeyRing(t) + + // Create a new message with existing original date + msg := newTestMessageWithHeaders(t, kr, + "messageID", + "addressID", + "text/html", + "body", + time.Unix(-1, 0), + map[string][]string{ + "X-Original-Date": {"Sun, 15 Jan 2023 04:23:03 +0100 (W. Europe Standard Time)"}, + "Date": {"15-Jan-2023 04:23:13 +0100"}, + }) + + // Build the message as usual; the date will be before 1970. + res, err := BuildRFC822(kr, msg, nil, JobOptions{}) + require.NoError(t, err) + + section(t, res). + expectDate(is(`15-Jan-2023 04:23:13 +0100`)). + expectHeader(`X-Original-Date`, is("Sun, 15 Jan 2023 04:23:03 +0100 (W. Europe Standard Time)")) + + // Build the message with date sanitization enabled; the date will be RFC822's birthdate. + resFix, err := BuildRFC822(kr, msg, nil, JobOptions{SanitizeDate: true}) + require.NoError(t, err) + + section(t, resFix). + expectDate(is(`Fri, 13 Aug 1982 00:00:00 +0000`)). + expectHeader(`X-Original-Date`, is("Sun, 15 Jan 2023 04:23:03 +0100 (W. Europe Standard Time)")) +} + func TestBuildMessageInternalID(t *testing.T) { m := gomock.NewController(t) defer m.Finish()