aboutsummaryrefslogtreecommitdiffstats
path: root/lib/attachment.go
diff options
context:
space:
mode:
authorKoni Marti <koni.marti@gmail.com>2024-10-24 21:00:15 +0200
committerRobin Jarry <robin@jarry.cc>2024-10-24 22:13:51 +0200
commitfc31a5c20032b45d314ecef4c9ebde7fd7f90bc8 (patch)
treefa5a750a105dfb78181f5d430ee8f3d6725c7c98 /lib/attachment.go
parent5b57d24afd4e3dec029bc32528d2d6e4dc8a3e64 (diff)
downloadaerc-fc31a5c20032b45d314ecef4c9ebde7fd7f90bc8.tar.gz
attach: fix content-transfer-encoding for rfc822 attachments
Fix the content-transfer-encoding for attachments with message/rfc822 mime types. It's not allowed by RFC2046 to set any other content-transfer-encoding than 7bit, 8bit, or binary for message/rfc822 mime types (see RFC2046, section 5.2.1). We can enforce this by setting a content-transfer-encoding header for attachments to 'binary' explicitly. 'binary' is more lenient than '8bit' with respect to line length and CRLF semantics and thus seems more suitable. Link: https://datatracker.ietf.org/doc/html/rfc2046#section-5.2.1 Link: https://lists.sr.ht/~rjarry/aerc-devel/%3CD48A6YOQOXRG.3KKB6UTGMT8LY@maslowski.xyz%3E Reported-by: Piotr Masłowski <piotr@maslowski.xyz> Reported-by: inwit <inwit@sindominio.net> Signed-off-by: Koni Marti <koni.marti@gmail.com> Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'lib/attachment.go')
-rw-r--r--lib/attachment.go16
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/attachment.go b/lib/attachment.go
index 4dd3f41d..63b8f161 100644
--- a/lib/attachment.go
+++ b/lib/attachment.go
@@ -90,6 +90,8 @@ func (fa *FileAttachment) WriteTo(w *mail.Writer) error {
// setting the filename auto sets the content disposition
ah.SetFilename(filename)
+ fixContentTransferEncoding(mimeType, &ah)
+
aw, err := w.CreateAttachment(ah)
if err != nil {
return errors.Wrap(err, "CreateAttachment")
@@ -127,6 +129,8 @@ func (pa *PartAttachment) WriteTo(w *mail.Writer) error {
// setting the filename auto sets the content disposition
ah.SetFilename(pa.Name())
+ fixContentTransferEncoding(pa.part.MimeType, &ah)
+
aw, err := w.CreateAttachment(ah)
if err != nil {
return errors.Wrap(err, "CreateAttachment")
@@ -174,3 +178,15 @@ func FindMimeType(filename string, reader *bufio.Reader) (string, map[string]str
// so we need to break them apart before passing them to the headers
return mime.ParseMediaType(mimeString)
}
+
+// fixContentTransferEncoding checks the mime type of the attachment and
+// corrects the content-transfer-encoding if necessary.
+//
+// It's expressly forbidden by RFC2046 to set any other
+// content-transfer-encoding than 7bit, 8bit, or binary for
+// message/rfc822 mime types (see RFC2046, section 5.2.1)
+func fixContentTransferEncoding(mimeType string, header *mail.AttachmentHeader) {
+ if strings.ToLower(mimeType) == "message/rfc822" {
+ header.Add("Content-Transfer-Encoding", "binary")
+ }
+}