From 139a0bd679428f366194418c8290258634e34c95 Mon Sep 17 00:00:00 2001 From: Sumner Evans Date: Wed, 17 Nov 2021 14:52:16 -0700 Subject: [PATCH] Send checkpoints using new API and send DECRYPTED step checkpoints --- matrix.go | 17 ++++++++++++++--- portal.go | 15 ++++----------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/matrix.go b/matrix.go index 981fa30..6829bfd 100644 --- a/matrix.go +++ b/matrix.go @@ -342,16 +342,20 @@ func (mx *MatrixHandler) HandleEncrypted(evt *event.Event) { mx.log.Debugfln("Got session %s after waiting, trying to decrypt %s again", content.SessionID, evt.ID) decrypted, err = mx.bridge.Crypto.Decrypt(evt) } else { + mx.as.SendErrorMessageSendCheckpoint(evt, appservice.StepDecrypted, err, false) go mx.waitLongerForSession(evt) return } } if err != nil { + mx.as.SendErrorMessageSendCheckpoint(evt, appservice.StepDecrypted, err, true) + mx.log.Warnfln("Failed to decrypt %s: %v", evt.ID, err) _, _ = mx.bridge.Bot.SendNotice(evt.RoomID, fmt.Sprintf( "\u26a0 Your message was not bridged: %v", err)) return } + mx.as.SendMessageSendCheckpoint(decrypted, appservice.StepDecrypted) mx.bridge.EventProcessor.Dispatch(decrypted) } @@ -375,14 +379,18 @@ func (mx *MatrixHandler) waitLongerForSession(evt *event.Event) { mx.log.Debugfln("Got session %s after waiting more, trying to decrypt %s again", content.SessionID, evt.ID) decrypted, err := mx.bridge.Crypto.Decrypt(evt) if err == nil { + mx.as.SendMessageSendCheckpoint(decrypted, appservice.StepDecrypted) mx.bridge.EventProcessor.Dispatch(decrypted) _, _ = mx.bridge.Bot.RedactEvent(evt.RoomID, resp.EventID) return } - mx.log.Warnfln("Failed to decrypt %s: %v", err) + mx.log.Warnfln("Failed to decrypt %s: %v", evt.ID, err) + mx.as.SendErrorMessageSendCheckpoint(evt, appservice.StepDecrypted, err, true) update.Body = fmt.Sprintf("\u26a0 Your message was not bridged: %v", err) } else { - mx.log.Debugfln("Didn't get %s, giving up on %s", content.SessionID, evt.ID) + errMsg := fmt.Sprintf("Didn't get %s, giving up on %s", content.SessionID, evt.ID) + mx.log.Debugfln(errMsg) + mx.as.SendErrorMessageSendCheckpoint(evt, appservice.StepDecrypted, fmt.Errorf(errMsg), true) update.Body = "\u26a0 Your message was not bridged: the bridge hasn't received the decryption keys. " + "If this keeps happening, try restarting your client." } @@ -395,7 +403,10 @@ func (mx *MatrixHandler) waitLongerForSession(evt *event.Event) { EventID: resp.EventID, } } - _, _ = mx.bridge.Bot.SendMessageEvent(evt.RoomID, event.EventMessage, &update) + _, err = mx.bridge.Bot.SendMessageEvent(evt.RoomID, event.EventMessage, &update) + if err != nil { + mx.log.Debugfln("Failed to update decryption error notice %s: %v", resp.EventID, err) + } } func (mx *MatrixHandler) HandleMessage(evt *event.Event) { diff --git a/portal.go b/portal.go index 988dbda..16dd13e 100644 --- a/portal.go +++ b/portal.go @@ -43,7 +43,6 @@ import ( "golang.org/x/image/webp" "google.golang.org/protobuf/proto" - "maunium.net/go/mautrix/bridge" "maunium.net/go/mautrix/format" "go.mau.fi/whatsmeow" @@ -2145,14 +2144,10 @@ func (portal *Portal) HandleMatrixMessage(sender *User, evt *event.Event) { if err != nil { portal.log.Errorln("Error sending message: %v", err) portal.sendErrorMessage(err.Error(), true) - checkpoint := bridge.NewErrorMessageSendCheckpoint(evt.ID, evt.RoomID, bridge.StepRemote, evt.Type, err) - checkpoint.MessageType = evt.Content.AsMessage().MsgType - go checkpoint.Send(portal.bridge.Config.Homeserver.MessageSendCheckpointEndpoint, portal.bridge.AS.Registration.AppToken) + portal.bridge.AS.SendErrorMessageSendCheckpoint(evt, appservice.StepRemote, err, true) } else { portal.log.Debugfln("Handled Matrix event %s", evt.ID) - checkpoint := bridge.NewMessageSendCheckpoint(evt.ID, evt.RoomID, bridge.StepRemote, bridge.StatusSuccesss, evt.Type) - checkpoint.MessageType = evt.Content.AsMessage().MsgType - go checkpoint.Send(portal.bridge.Config.Homeserver.MessageSendCheckpointEndpoint, portal.bridge.AS.Registration.AppToken) + portal.bridge.AS.SendMessageSendCheckpoint(evt, appservice.StepRemote) portal.sendDeliveryReceipt(evt.ID) dbMsg.MarkSent(ts) } @@ -2186,12 +2181,10 @@ func (portal *Portal) HandleMatrixRedaction(sender *User, evt *event.Event) { _, err := sender.Client.RevokeMessage(portal.Key.JID, msg.JID) if err != nil { portal.log.Errorfln("Error handling Matrix redaction %s: %v", evt.ID, err) - checkpoint := bridge.NewErrorMessageSendCheckpoint(evt.ID, evt.RoomID, bridge.StepRemote, evt.Type, err) - go checkpoint.Send(portal.bridge.Config.Homeserver.MessageSendCheckpointEndpoint, portal.bridge.AS.Registration.AppToken) + portal.bridge.AS.SendErrorMessageSendCheckpoint(evt, appservice.StepRemote, err, true) } else { portal.log.Debugfln("Handled Matrix redaction %s of %s", evt.ID, evt.Redacts) - checkpoint := bridge.NewMessageSendCheckpoint(evt.ID, evt.RoomID, bridge.StepRemote, bridge.StatusSuccesss, evt.Type) - go checkpoint.Send(portal.bridge.Config.Homeserver.MessageSendCheckpointEndpoint, portal.bridge.AS.Registration.AppToken) + portal.bridge.AS.SendMessageSendCheckpoint(evt, appservice.StepRemote) portal.sendDeliveryReceipt(evt.ID) } }