From 45e99caa23c4cbf4f5b2832c3eef4a9552132fb3 Mon Sep 17 00:00:00 2001 From: James Houlahan Date: Wed, 3 Jun 2020 07:39:16 +0200 Subject: [PATCH] fix: handle double charset everywhere by using our ParseMediaType --- Changelog.md | 1 + internal/users/mocks/mocks.go | 3 ++- pkg/mime/parser.go | 7 +++---- pkg/pmapi/attachments_test.go | 5 +++-- pkg/pmapi/import_test.go | 9 +++++---- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Changelog.md b/Changelog.md index fb3abed7..c589da22 100644 --- a/Changelog.md +++ b/Changelog.md @@ -24,6 +24,7 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) * GODT-341 Fixed flaky unittest for Store synchronization cooldown * Crash when failing to match necessary html element * Crash in message.combineParts when copying nil slice +* Handle double charset better by using local ParseMediaType instead of mime.ParseMediaType ## [v1.2.7] Donghai-hotfix - beta (2020-05-07) diff --git a/internal/users/mocks/mocks.go b/internal/users/mocks/mocks.go index 524d3273..dd087706 100644 --- a/internal/users/mocks/mocks.go +++ b/internal/users/mocks/mocks.go @@ -5,11 +5,12 @@ package mocks import ( + reflect "reflect" + store "github.com/ProtonMail/proton-bridge/internal/store" credentials "github.com/ProtonMail/proton-bridge/internal/users/credentials" pmapi "github.com/ProtonMail/proton-bridge/pkg/pmapi" gomock "github.com/golang/mock/gomock" - reflect "reflect" ) // MockConfiger is a mock of Configer interface diff --git a/pkg/mime/parser.go b/pkg/mime/parser.go index 46f3499c..eafa9de9 100644 --- a/pkg/mime/parser.go +++ b/pkg/mime/parser.go @@ -21,7 +21,6 @@ import ( "bytes" "io" "io/ioutil" - "mime" "mime/multipart" "net/http" "net/mail" @@ -323,7 +322,7 @@ func (ptc *PlainTextCollector) Accept(partReader io.Reader, header textproto.MIM if isFirst { if IsLeaf(header) { mediaType, _, _ := getContentType(header) - disp, _, _ := mime.ParseMediaType(header.Get("Content-Disposition")) + disp, _, _ := ParseMediaType(header.Get("Content-Disposition")) if mediaType == "text/plain" && disp != "attachment" { partData, _ := ioutil.ReadAll(partReader) decodedPart := decodePart(bytes.NewReader(partData), header) @@ -378,7 +377,7 @@ func (bc *BodyCollector) Accept(partReader io.Reader, header textproto.MIMEHeade if isFirst { if IsLeaf(header) { mediaType, _, _ := getContentType(header) - disp, _, _ := mime.ParseMediaType(header.Get("Content-Disposition")) + disp, _, _ := ParseMediaType(header.Get("Content-Disposition")) if disp != "attachment" { partData, _ := ioutil.ReadAll(partReader) decodedPart := decodePart(bytes.NewReader(partData), header) @@ -445,7 +444,7 @@ func (ac *AttachmentsCollector) Accept(partReader io.Reader, header textproto.MI if isFirst { if IsLeaf(header) { mediaType, _, _ := getContentType(header) - disp, _, _ := mime.ParseMediaType(header.Get("Content-Disposition")) + disp, _, _ := ParseMediaType(header.Get("Content-Disposition")) if (mediaType != "text/html" && mediaType != "text/plain") || disp == "attachment" { partData, _ := ioutil.ReadAll(partReader) decodedPart := decodePart(bytes.NewReader(partData), header) diff --git a/pkg/pmapi/attachments_test.go b/pkg/pmapi/attachments_test.go index 204b6bdb..0c1ee56c 100644 --- a/pkg/pmapi/attachments_test.go +++ b/pkg/pmapi/attachments_test.go @@ -24,7 +24,6 @@ import ( "fmt" "io" "io/ioutil" - "mime" "mime/multipart" "net/http" "net/textproto" @@ -32,6 +31,8 @@ import ( "strings" "testing" + pmmime "github.com/ProtonMail/proton-bridge/pkg/mime" + "github.com/stretchr/testify/assert" ) @@ -96,7 +97,7 @@ func TestClient_CreateAttachment(t *testing.T) { s, c := newTestServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { Ok(t, checkMethodAndPath(r, "POST", "/attachments")) - contentType, params, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + contentType, params, err := pmmime.ParseMediaType(r.Header.Get("Content-Type")) if err != nil { t.Error("Expected no error while parsing request content type, got:", err) } diff --git a/pkg/pmapi/import_test.go b/pkg/pmapi/import_test.go index 362625a7..c20e2688 100644 --- a/pkg/pmapi/import_test.go +++ b/pkg/pmapi/import_test.go @@ -22,11 +22,12 @@ import ( "fmt" "io" "io/ioutil" - "mime" "mime/multipart" "net/http" "reflect" "testing" + + pmmime "github.com/ProtonMail/proton-bridge/pkg/mime" ) var testImportReqs = []*ImportMsgReq{ @@ -56,7 +57,7 @@ func TestClient_Import(t *testing.T) { // nolint[funlen] s, c := newTestServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { Ok(t, checkMethodAndPath(r, "POST", "/import")) - contentType, params, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + contentType, params, err := pmmime.ParseMediaType(r.Header.Get("Content-Type")) if err != nil { t.Error("Expected no error while parsing request content type, got:", err) } @@ -72,7 +73,7 @@ func TestClient_Import(t *testing.T) { // nolint[funlen] t.Error("Expected no error while reading first part of request body, got:", err) } - contentDisp, params, err := mime.ParseMediaType(p.Header.Get("Content-Disposition")) + contentDisp, params, err := pmmime.ParseMediaType(p.Header.Get("Content-Disposition")) if err != nil { t.Error("Expected no error while parsing part content disposition, got:", err) } @@ -110,7 +111,7 @@ func TestClient_Import(t *testing.T) { // nolint[funlen] t.Error("Expected no error while reading second part of request body, got:", err) } - contentDisp, params, err = mime.ParseMediaType(p.Header.Get("Content-Disposition")) + contentDisp, params, err = pmmime.ParseMediaType(p.Header.Get("Content-Disposition")) if err != nil { t.Error("Expected no error while parsing part content disposition, got:", err) }