fix encrypted thread reply, fix From header in thread reply
This commit is contained in:
58
bot/email.go
58
bot/email.go
@@ -5,6 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"maunium.net/go/mautrix/crypto"
|
||||||
"maunium.net/go/mautrix/event"
|
"maunium.net/go/mautrix/event"
|
||||||
"maunium.net/go/mautrix/id"
|
"maunium.net/go/mautrix/id"
|
||||||
|
|
||||||
@@ -125,28 +126,57 @@ type parentEmail struct {
|
|||||||
Subject string
|
Subject string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Bot) getParentEmail(evt *event.Event) parentEmail {
|
func (b *Bot) getParentEvent(evt *event.Event) *event.Event {
|
||||||
var parent parentEmail
|
|
||||||
content := evt.Content.AsMessage()
|
content := evt.Content.AsMessage()
|
||||||
parentID := utils.EventParent(evt.ID, content)
|
parentID := utils.EventParent(evt.ID, content)
|
||||||
if parentID == evt.ID {
|
if parentID == evt.ID {
|
||||||
return parent
|
return evt
|
||||||
}
|
}
|
||||||
parentID = b.getLastEventID(evt.RoomID, parentID)
|
parentID = b.getLastEventID(evt.RoomID, parentID)
|
||||||
parentEvt, err := b.lp.GetClient().GetEvent(evt.RoomID, parentID)
|
parentEvt, err := b.lp.GetClient().GetEvent(evt.RoomID, parentID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.log.Error("cannot get parent event: %v", err)
|
b.log.Error("cannot get parent event: %v", err)
|
||||||
return parent
|
return nil
|
||||||
}
|
|
||||||
if parentEvt.Content.Parsed == nil {
|
|
||||||
perr := parentEvt.Content.ParseRaw(event.EventMessage)
|
|
||||||
if perr != nil {
|
|
||||||
b.log.Error("cannot parse event content: %v", perr)
|
|
||||||
return parent
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
parent.MessageID = utils.MessageID(parentID, b.domains[0])
|
if !b.lp.GetStore().IsEncrypted(evt.RoomID) {
|
||||||
|
if parentEvt.Content.Parsed == nil {
|
||||||
|
perr := parentEvt.Content.ParseRaw(event.EventMessage)
|
||||||
|
if perr != nil {
|
||||||
|
b.log.Error("cannot parse event content: %v", perr)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return parentEvt
|
||||||
|
}
|
||||||
|
|
||||||
|
utils.ParseContent(parentEvt, event.EventEncrypted)
|
||||||
|
decrypted, err := b.lp.GetMachine().DecryptMegolmEvent(evt)
|
||||||
|
if err != nil {
|
||||||
|
if err != crypto.IncorrectEncryptedContentType || err != crypto.UnsupportedAlgorithm {
|
||||||
|
b.log.Error("cannot decrypt parent event: %v", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if decrypted != nil {
|
||||||
|
parentEvt.Content = decrypted.Content
|
||||||
|
}
|
||||||
|
|
||||||
|
utils.ParseContent(parentEvt, event.EventMessage)
|
||||||
|
return parentEvt
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bot) getParentEmail(evt *event.Event) parentEmail {
|
||||||
|
var parent parentEmail
|
||||||
|
parentEvt := b.getParentEvent(evt)
|
||||||
|
if parentEvt == nil {
|
||||||
|
return parent
|
||||||
|
}
|
||||||
|
if parentEvt.ID == evt.ID {
|
||||||
|
return parent
|
||||||
|
}
|
||||||
|
|
||||||
|
parent.MessageID = utils.MessageID(parentEvt.ID, b.domains[0])
|
||||||
parent.From = utils.EventField[string](&parentEvt.Content, eventFromKey)
|
parent.From = utils.EventField[string](&parentEvt.Content, eventFromKey)
|
||||||
parent.To = utils.EventField[string](&parentEvt.Content, eventToKey)
|
parent.To = utils.EventField[string](&parentEvt.Content, eventToKey)
|
||||||
parent.InReplyTo = utils.EventField[string](&parentEvt.Content, eventMessageIDkey)
|
parent.InReplyTo = utils.EventField[string](&parentEvt.Content, eventMessageIDkey)
|
||||||
@@ -162,7 +192,7 @@ func (b *Bot) getParentEmail(evt *event.Event) parentEmail {
|
|||||||
if parent.Subject != "" {
|
if parent.Subject != "" {
|
||||||
parent.Subject = "Re: " + parent.Subject
|
parent.Subject = "Re: " + parent.Subject
|
||||||
} else {
|
} else {
|
||||||
parent.Subject = strings.SplitN(content.Body, "\n", 1)[0]
|
parent.Subject = strings.SplitN(evt.Content.AsMessage().Body, "\n", 1)[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent
|
return parent
|
||||||
@@ -206,7 +236,7 @@ func (b *Bot) SendEmailReply(ctx context.Context) {
|
|||||||
ID := utils.MessageID(evt.ID, b.domains[0])
|
ID := utils.MessageID(evt.ID, b.domains[0])
|
||||||
meta.References = meta.References + " " + ID
|
meta.References = meta.References + " " + ID
|
||||||
b.log.Debug("send email reply ID=%s meta=%+v", ID, meta)
|
b.log.Debug("send email reply ID=%s meta=%+v", ID, meta)
|
||||||
email := utils.NewEmail(ID, meta.InReplyTo, meta.References, meta.Subject, meta.From, meta.To, body, "", nil)
|
email := utils.NewEmail(ID, meta.InReplyTo, meta.References, meta.Subject, fromMailbox, meta.To, body, "", nil)
|
||||||
data := email.Compose(b.getBotSettings().DKIMPrivateKey())
|
data := email.Compose(b.getBotSettings().DKIMPrivateKey())
|
||||||
|
|
||||||
err = b.sendmail(meta.From, meta.To, data)
|
err = b.sendmail(meta.From, meta.To, data)
|
||||||
|
|||||||
@@ -69,6 +69,10 @@ func (b *Bot) onEncryptedMessage(evt *event.Event) {
|
|||||||
if evt.Sender == b.lp.GetClient().UserID {
|
if evt.Sender == b.lp.GetClient().UserID {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// ignore encrypted events in noecryption mode
|
||||||
|
if b.lp.GetMachine() == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
ctx := newContext(evt)
|
ctx := newContext(evt)
|
||||||
|
|
||||||
decrypted, err := b.lp.GetMachine().DecryptMegolmEvent(evt)
|
decrypted, err := b.lp.GetMachine().DecryptMegolmEvent(evt)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import (
|
|||||||
"gitlab.com/etke.cc/postmoogle/bot"
|
"gitlab.com/etke.cc/postmoogle/bot"
|
||||||
"gitlab.com/etke.cc/postmoogle/config"
|
"gitlab.com/etke.cc/postmoogle/config"
|
||||||
"gitlab.com/etke.cc/postmoogle/smtp"
|
"gitlab.com/etke.cc/postmoogle/smtp"
|
||||||
|
"gitlab.com/etke.cc/postmoogle/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -30,6 +31,7 @@ func main() {
|
|||||||
|
|
||||||
cfg := config.New()
|
cfg := config.New()
|
||||||
log = logger.New("postmoogle.", cfg.LogLevel)
|
log = logger.New("postmoogle.", cfg.LogLevel)
|
||||||
|
utils.SetLogger(log)
|
||||||
|
|
||||||
log.Info("#############################")
|
log.Info("#############################")
|
||||||
log.Info("Postmoogle")
|
log.Info("Postmoogle")
|
||||||
|
|||||||
@@ -65,6 +65,16 @@ func EventField[T comparable](content *event.Content, field string) T {
|
|||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseContent(evt *event.Event, eventType event.Type) {
|
||||||
|
if evt.Content.Parsed != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
perr := evt.Content.ParseRaw(eventType)
|
||||||
|
if perr != nil {
|
||||||
|
log.Error("cannot parse event content: %v", perr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// UnwrapError tries to unwrap a error into something meaningful, like mautrix.HTTPError or mautrix.RespError
|
// UnwrapError tries to unwrap a error into something meaningful, like mautrix.HTTPError or mautrix.RespError
|
||||||
func UnwrapError(err error) error {
|
func UnwrapError(err error) error {
|
||||||
switch err.(type) {
|
switch err.(type) {
|
||||||
|
|||||||
@@ -3,8 +3,17 @@ package utils
|
|||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"gitlab.com/etke.cc/go/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var log *logger.Logger
|
||||||
|
|
||||||
|
// SetLogger for utils
|
||||||
|
func SetLogger(loggerInstance *logger.Logger) {
|
||||||
|
log = loggerInstance
|
||||||
|
}
|
||||||
|
|
||||||
// Mailbox returns mailbox part from email address
|
// Mailbox returns mailbox part from email address
|
||||||
func Mailbox(email string) string {
|
func Mailbox(email string) string {
|
||||||
index := strings.LastIndex(email, "@")
|
index := strings.LastIndex(email, "@")
|
||||||
|
|||||||
Reference in New Issue
Block a user