From 2879b1062578d5915c44e7783eeda5969dfeb9cc Mon Sep 17 00:00:00 2001 From: Aine Date: Wed, 1 Mar 2023 22:50:02 +0200 Subject: [PATCH] add noinlines option --- README.md | 1 + bot/command.go | 11 +++++- bot/config/room.go | 5 +++ bot/email.go | 6 +++- email/email.go | 83 +++++++++++++++++++++++++--------------------- 5 files changed, 67 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index a17d29b..d26da0c 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,7 @@ If you want to change them - check available options in the help message (`!pm h * **!pm nohtml** - Get or set `nohtml` of the room (`true` - ignore HTML in email; `false` - parse HTML in emails) * **!pm nothreads** - Get or set `nothreads` of the room (`true` - ignore email threads; `false` - convert email threads into matrix threads) * **!pm nofiles** - Get or set `nofiles` of the room (`true` - ignore email attachments; `false` - upload email attachments) +* **!pm noinlines** - Get or set `noinlines` of the room (`true` - ignore inline attachments; `false` - upload inline attachments) --- diff --git a/bot/command.go b/bot/command.go index 8104b68..7a88840 100644 --- a/bot/command.go +++ b/bot/command.go @@ -167,6 +167,15 @@ func (b *Bot) initCommands() commandList { sanitizer: utils.SanitizeBoolString, allowed: b.allowOwner, }, + { + key: config.RoomNoInlines, + description: fmt.Sprintf( + "Get or set `%s` of the room (`true` - ignore inline attachments; `false` - upload inline attachments)", + config.RoomNoFiles, + ), + sanitizer: utils.SanitizeBoolString, + allowed: b.allowOwner, + }, {allowed: b.allowOwner, description: "mailbox antispam"}, // delimiter { key: config.RoomSpamcheckMX, @@ -491,7 +500,7 @@ func (b *Bot) runSend(ctx context.Context) { ID := email.MessageID(evt.ID, domain) for _, to := range tos { recipients := []string{to} - eml := email.New(ID, "", " "+ID, subject, from, to, to, "", body, htmlBody, nil) + eml := email.New(ID, "", " "+ID, subject, from, to, to, "", body, htmlBody, nil, nil) data := eml.Compose(b.cfg.GetBot().DKIMPrivateKey()) if data == "" { b.SendError(ctx, evt.RoomID, "email body is empty") diff --git a/bot/config/room.go b/bot/config/room.go index cbf1ee6..92e60b3 100644 --- a/bot/config/room.go +++ b/bot/config/room.go @@ -26,6 +26,7 @@ const ( RoomNoHTML = "nohtml" RoomNoThreads = "nothreads" RoomNoFiles = "nofiles" + RoomNoInlines = "noinlines" RoomPassword = "password" RoomSpamcheckDKIM = "spamcheck:dkim" RoomSpamcheckSMTP = "spamcheck:smtp" @@ -96,6 +97,10 @@ func (s Room) NoFiles() bool { return utils.Bool(s.Get(RoomNoFiles)) } +func (s Room) NoInlines() bool { + return utils.Bool(s.Get(RoomNoInlines)) +} + func (s Room) SpamcheckDKIM() bool { return utils.Bool(s.Get(RoomSpamcheckDKIM)) } diff --git a/bot/email.go b/bot/email.go index f582e02..40f09b7 100644 --- a/bot/email.go +++ b/bot/email.go @@ -129,6 +129,10 @@ func (b *Bot) IncomingEmail(ctx context.Context, email *email.Email) error { b.setThreadID(roomID, email.MessageID, threadID) b.setLastEventID(roomID, threadID, eventID) + if !cfg.NoInlines() { + b.sendFiles(ctx, roomID, email.InlineFiles, cfg.NoThreads(), threadID) + } + if !cfg.NoFiles() { b.sendFiles(ctx, roomID, email.Files, cfg.NoThreads(), threadID) } @@ -179,7 +183,7 @@ func (b *Bot) SendEmailReply(ctx context.Context) { meta.MessageID = email.MessageID(evt.ID, meta.FromDomain) meta.References = meta.References + " " + meta.MessageID b.log.Info("sending email reply: %+v", meta) - eml := email.New(meta.MessageID, meta.InReplyTo, meta.References, meta.Subject, meta.From, meta.To, meta.RcptTo, meta.CC, body, htmlBody, nil) + eml := email.New(meta.MessageID, meta.InReplyTo, meta.References, meta.Subject, meta.From, meta.To, meta.RcptTo, meta.CC, body, htmlBody, nil, nil) data := eml.Compose(b.cfg.GetBot().DKIMPrivateKey()) if data == "" { b.SendError(ctx, evt.RoomID, "email body is empty") diff --git a/email/email.go b/email/email.go index f55329a..cbe792e 100644 --- a/email/email.go +++ b/email/email.go @@ -17,35 +17,37 @@ import ( // Email object type Email struct { - Date string - MessageID string - InReplyTo string - References string - From string - To string - RcptTo string - CC []string - Subject string - Text string - HTML string - Files []*utils.File + Date string + MessageID string + InReplyTo string + References string + From string + To string + RcptTo string + CC []string + Subject string + Text string + HTML string + Files []*utils.File + InlineFiles []*utils.File } // New constructs Email object -func New(messageID, inReplyTo, references, subject, from, to, rcptto, cc, text, html string, files []*utils.File) *Email { +func New(messageID, inReplyTo, references, subject, from, to, rcptto, cc, text, html string, files, inline []*utils.File) *Email { email := &Email{ - Date: dateNow(), - MessageID: messageID, - InReplyTo: inReplyTo, - References: references, - From: Address(from), - To: Address(to), - CC: AddressList(cc), - RcptTo: Address(rcptto), - Subject: subject, - Text: text, - HTML: html, - Files: files, + Date: dateNow(), + MessageID: messageID, + InReplyTo: inReplyTo, + References: references, + From: Address(from), + To: Address(to), + CC: AddressList(cc), + RcptTo: Address(rcptto), + Subject: subject, + Text: text, + HTML: html, + Files: files, + InlineFiles: inline, } if html != "" { @@ -72,19 +74,26 @@ func FromEnvelope(rcptto string, envelope *enmime.Envelope) *Email { files = append(files, file) } + inlines := make([]*utils.File, 0, len(envelope.Inlines)) + for _, inline := range envelope.Inlines { + file := utils.NewFile(inline.FileName, inline.Content) + inlines = append(inlines, file) + } + email := &Email{ - Date: date, - MessageID: envelope.GetHeader("Message-Id"), - InReplyTo: envelope.GetHeader("In-Reply-To"), - References: envelope.GetHeader("References"), - From: Address(envelope.GetHeader("From")), - To: Address(envelope.GetHeader("To")), - RcptTo: Address(rcptto), - CC: AddressList(envelope.GetHeader("Cc")), - Subject: envelope.GetHeader("Subject"), - Text: envelope.Text, - HTML: html, - Files: files, + Date: date, + MessageID: envelope.GetHeader("Message-Id"), + InReplyTo: envelope.GetHeader("In-Reply-To"), + References: envelope.GetHeader("References"), + From: Address(envelope.GetHeader("From")), + To: Address(envelope.GetHeader("To")), + RcptTo: Address(rcptto), + CC: AddressList(envelope.GetHeader("Cc")), + Subject: envelope.GetHeader("Subject"), + Text: envelope.Text, + HTML: html, + Files: files, + InlineFiles: inlines, } return email