forked from Silverfish/proton-bridge
fix(GODT-2480): Do not override X-Original-Date with invalid Date
This commit is contained in:
@ -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)) {
|
if date, err := rfc5322.ParseDateTime(hdr.Get("Date")); err != nil || date.Before(time.Unix(0, 0)) {
|
||||||
msgDate := SanitizeMessageDate(msg.Time)
|
msgDate := SanitizeMessageDate(msg.Time)
|
||||||
hdr.Set("Date", msgDate.In(time.UTC).Format(time.RFC1123Z))
|
hdr.Set("Date", msgDate.In(time.UTC).Format(time.RFC1123Z))
|
||||||
// We clobbered the date so we save it under X-Original-Date.
|
// We clobbered the date so we save it under X-Original-Date only if no such value exists.
|
||||||
hdr.Set("X-Original-Date", date.In(time.UTC).Format(time.RFC1123Z))
|
if !hdr.Has("X-Original-Date") {
|
||||||
|
hdr.Set("X-Original-Date", date.In(time.UTC).Format(time.RFC1123Z))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -38,6 +38,20 @@ func newTestMessage(
|
|||||||
kr *crypto.KeyRing,
|
kr *crypto.KeyRing,
|
||||||
messageID, addressID, mimeType, body string, //nolint:unparam
|
messageID, addressID, mimeType, body string, //nolint:unparam
|
||||||
date time.Time,
|
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 {
|
) proton.Message {
|
||||||
enc, err := kr.Encrypt(crypto.NewPlainMessageFromString(body), kr)
|
enc, err := kr.Encrypt(crypto.NewPlainMessageFromString(body), kr)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@ -45,22 +59,28 @@ func newTestMessage(
|
|||||||
arm, err := enc.GetArmored()
|
arm, err := enc.GetArmored()
|
||||||
require.NoError(t, err)
|
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{
|
return proton.Message{
|
||||||
MessageMetadata: proton.MessageMetadata{
|
MessageMetadata: proton.MessageMetadata{
|
||||||
ID: messageID,
|
ID: messageID,
|
||||||
AddressID: addressID,
|
AddressID: addressID,
|
||||||
Time: date.Unix(),
|
Time: date.Unix(),
|
||||||
},
|
},
|
||||||
ParsedHeaders: proton.Headers{
|
ParsedHeaders: msgHeaders,
|
||||||
"Content-Type": {mimeType},
|
MIMEType: rfc822.MIMEType(mimeType),
|
||||||
"Date": {date.In(time.UTC).Format(time.RFC1123Z)},
|
Body: body,
|
||||||
},
|
|
||||||
MIMEType: rfc822.MIMEType(mimeType),
|
|
||||||
Body: body,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -836,6 +836,41 @@ func TestBuildMessageWithInvalidDate(t *testing.T) {
|
|||||||
expectHeader(`X-Original-Date`, is(`Wed, 31 Dec 1969 23:59:59 +0000`))
|
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",
|
||||||
|
"<html><body>body</body></html>",
|
||||||
|
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) {
|
func TestBuildMessageInternalID(t *testing.T) {
|
||||||
m := gomock.NewController(t)
|
m := gomock.NewController(t)
|
||||||
defer m.Finish()
|
defer m.Finish()
|
||||||
|
|||||||
Reference in New Issue
Block a user