fix(GODT-2212): Preserver Header order in message building

https://github.com/ProtonMail/go-proton-api/pull/100
This commit is contained in:
Leander Beernaert
2023-09-25 14:32:46 +02:00
parent a1a5ffba5d
commit e422b28bc3
7 changed files with 37 additions and 22 deletions

View File

@ -503,8 +503,8 @@ func getAttachmentPartHeader(att proton.Attachment) message.Header {
func toMessageHeader(hdr proton.Headers) message.Header {
var res message.Header
for key, val := range hdr {
for _, val := range val {
for _, key := range hdr.Order {
for _, val := range hdr.Values[key] {
// 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.

View File

@ -64,12 +64,20 @@ func newTestMessageWithHeaders(
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)},
Values: map[string][]string{
"Content-Type": {mimeType},
"Date": {date.In(time.UTC).Format(time.RFC1123Z)},
},
Order: []string{"Content-Type", "Date"},
}
for k, v := range headers {
msgHeaders[k] = v
_, ok := msgHeaders.Values[k]
if !ok {
msgHeaders.Order = append(msgHeaders.Order, k)
}
msgHeaders.Values[k] = v
}
return proton.Message{
@ -98,9 +106,12 @@ func addTestAttachment(
Name: name,
MIMEType: rfc822.MIMEType(mimeType),
Headers: proton.Headers{
"Content-Type": {mimeType},
"Content-Disposition": {disposition},
"Content-Transfer-Encoding": {"base64"},
Values: map[string][]string{
"Content-Type": {mimeType},
"Content-Disposition": {disposition},
"Content-Transfer-Encoding": {"base64"},
},
Order: []string{"Content-Type", "Content-Disposition", "Content-Transfer-Encoding"},
},
Disposition: proton.Disposition(disposition),
KeyPackets: base64.StdEncoding.EncodeToString(enc.GetBinaryKeyPacket()),

View File

@ -54,7 +54,8 @@ func TestBuildPlainMessageWithLongKey(t *testing.T) {
kr := utils.MakeKeyRing(t)
msg := newTestMessage(t, kr, "messageID", "addressID", "text/plain", "body", time.Now())
msg.ParsedHeaders["ReallyVeryVeryVeryVeryVeryLongLongLongLongLongLongLongKeyThatWillHaveNotSoLongValue"] = []string{"value"}
msg.ParsedHeaders.Values["ReallyVeryVeryVeryVeryVeryLongLongLongLongLongLongLongKeyThatWillHaveNotSoLongValue"] = []string{"value"}
msg.ParsedHeaders.Order = append(msg.ParsedHeaders.Order, "ReallyVeryVeryVeryVeryVeryLongLongLongLongLongLongLongKeyThatWillHaveNotSoLongValue")
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)
@ -977,7 +978,8 @@ func TestBuildIncludeMessageIDReference(t *testing.T) {
msg := newTestMessage(t, kr, "messageID", "addressID", "text/plain", "body", time.Now())
// Add references.
msg.ParsedHeaders["References"] = []string{"<myreference@domain.com>"}
msg.ParsedHeaders.Values["References"] = []string{"<myreference@domain.com>"}
msg.ParsedHeaders.Order = append(msg.ParsedHeaders.Order, "References")
res, err := DecryptAndBuildRFC822(kr, msg, nil, JobOptions{})
require.NoError(t, err)