From ff91fef2746edebc8ea96f7b4f716254f8e28f7c Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Tue, 24 May 2022 10:12:14 +0200 Subject: [PATCH] peroxide: Sanitize the quoted printable input before parsing for encryption Some clients add a single = at the end of the message part causing the parser to fail. --- pkg/message/encrypt.go | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/pkg/message/encrypt.go b/pkg/message/encrypt.go index 8f93ac2..35451b3 100644 --- a/pkg/message/encrypt.go +++ b/pkg/message/encrypt.go @@ -247,6 +247,40 @@ func (c *Base64Cleaner) Read(b []byte) (int, error) { return c.r.Read(b) } +type QuotedPrintableCleaner struct { + r io.Reader +} + +func NewQuotedPrintableCleaner(r io.Reader) (*QuotedPrintableCleaner, error) { + reader := bufio.NewReader(r) + var data []byte + + for { + line, err := reader.ReadBytes('\n') + + if len(line) != 0 { + if len(line) == 1 && line[0] == '=' { + continue + } + + data = append(data, line...) + } + + if err != nil { + if errors.Is(err, io.EOF) { + break + } + return nil, err + } + } + + return &QuotedPrintableCleaner{bytes.NewReader(data)}, nil +} + +func (c *QuotedPrintableCleaner) Read(b []byte) (int, error) { + return c.r.Read(b) +} + func getTransferDecoder(r io.Reader, encoding string) (io.Reader, error) { switch strings.ToLower(encoding) { case "base64": @@ -257,7 +291,11 @@ func getTransferDecoder(r io.Reader, encoding string) (io.Reader, error) { return base64.NewDecoder(base64.StdEncoding, cleaner), nil case "quoted-printable": - return quotedprintable.NewReader(r), nil + cleaner, err := NewQuotedPrintableCleaner(r) + if err != nil { + return nil, err + } + return quotedprintable.NewReader(cleaner), nil default: return r, nil