From 4a2a9e5cd8825d468112c8bc757aaa79dcaf4b79 Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Tue, 24 May 2022 10:43:37 +0200 Subject: [PATCH] peroxide: Move sanitizers to a separate file --- pkg/message/encrypt.go | 71 +----------------------------- pkg/message/sanitizers.go | 92 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 69 deletions(-) create mode 100644 pkg/message/sanitizers.go diff --git a/pkg/message/encrypt.go b/pkg/message/encrypt.go index 35451b3..71da009 100644 --- a/pkg/message/encrypt.go +++ b/pkg/message/encrypt.go @@ -18,7 +18,6 @@ package message import ( - "bufio" "bytes" "encoding/base64" "io" @@ -215,83 +214,17 @@ func writeEncryptedMultiPart(kr *crypto.KeyRing, w io.Writer, header *textproto. return writer.done() } -type Base64Cleaner struct { - r io.Reader -} - -func NewBase64Cleaner(r io.Reader) (*Base64Cleaner, error) { - reader := bufio.NewReader(r) - var data []byte - - for { - line, err := reader.ReadBytes('\n') - - if len(line) != 0 { - line = bytes.TrimSpace(line) - line = bytes.TrimSuffix(line, []byte("!")) - data = append(data, line...) - } - - if err != nil { - if errors.Is(err, io.EOF) { - break - } - return nil, err - } - } - - return &Base64Cleaner{bytes.NewReader(data)}, nil -} - -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": - cleaner, err := NewBase64Cleaner(r) + cleaner, err := NewBase64Sanitizer(r) if err != nil { return nil, err } return base64.NewDecoder(base64.StdEncoding, cleaner), nil case "quoted-printable": - cleaner, err := NewQuotedPrintableCleaner(r) + cleaner, err := NewQuotedPrintableSanitizer(r) if err != nil { return nil, err } diff --git a/pkg/message/sanitizers.go b/pkg/message/sanitizers.go new file mode 100644 index 0000000..efa48ed --- /dev/null +++ b/pkg/message/sanitizers.go @@ -0,0 +1,92 @@ +// Copyright (c) 2022 Lukasz Janyst +// +// This file is part of Peroxide. +// +// Peroxide is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Peroxide is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Peroxide. If not, see . + +package message + +import ( + "bufio" + "bytes" + "io" + + "github.com/pkg/errors" +) + +type Base64Sanitizer struct { + r io.Reader +} + +func NewBase64Sanitizer(r io.Reader) (*Base64Sanitizer, error) { + reader := bufio.NewReader(r) + var data []byte + + for { + line, err := reader.ReadBytes('\n') + + if len(line) != 0 { + line = bytes.TrimSpace(line) + line = bytes.TrimSuffix(line, []byte("!")) + data = append(data, line...) + } + + if err != nil { + if errors.Is(err, io.EOF) { + break + } + return nil, err + } + } + + return &Base64Sanitizer{bytes.NewReader(data)}, nil +} + +func (c *Base64Sanitizer) Read(b []byte) (int, error) { + return c.r.Read(b) +} + +type QuotedPrintableSanitizer struct { + r io.Reader +} + +func NewQuotedPrintableSanitizer(r io.Reader) (*QuotedPrintableSanitizer, 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 &QuotedPrintableSanitizer{bytes.NewReader(data)}, nil +} + +func (c *QuotedPrintableSanitizer) Read(b []byte) (int, error) { + return c.r.Read(b) +}