From 962179fb750922411dee638272b9b74fb07fe0f4 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 19 May 2022 12:08:30 +0300 Subject: [PATCH] Handle edge cases with missing senders in historical messages --- go.mod | 2 +- go.sum | 4 ++-- historysync.go | 4 ++++ portal.go | 18 +++++++++++++++--- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 8e4949a..49e07ca 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/prometheus/client_golang v1.12.2-0.20220514081015-5d584e2717ef github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/tidwall/gjson v1.14.1 - go.mau.fi/whatsmeow v0.0.0-20220517205516-246a2007ca7f + go.mau.fi/whatsmeow v0.0.0-20220519090423-468ee95de7e7 golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 golang.org/x/net v0.0.0-20220513224357-95641704303c google.golang.org/protobuf v1.28.0 diff --git a/go.sum b/go.sum index 70b13fc..5335dbf 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/yuin/goldmark v1.4.12 h1:6hffw6vALvEDqJ19dOJvJKOoAOKe4NDaTqvd2sktGN0= github.com/yuin/goldmark v1.4.12/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mau.fi/libsignal v0.0.0-20220425070825-c40c839ee6a0 h1:3IQF2bgAyibdo77hTejwuJe4jlypj9QaE4xCQuxrThM= go.mau.fi/libsignal v0.0.0-20220425070825-c40c839ee6a0/go.mod h1:kBOXTvYyDG/q1Ihgvd4J6WenGPh7wtEGvPKF6vmf5ak= -go.mau.fi/whatsmeow v0.0.0-20220517205516-246a2007ca7f h1:0eo1TMJBx2pv7vNh/sPAl8bXPpn+HwrVJntuOnejMfs= -go.mau.fi/whatsmeow v0.0.0-20220517205516-246a2007ca7f/go.mod h1:iUBgOLNaqShLrR17u0kIiRptIGFH+nbT1tRhaWBEX/c= +go.mau.fi/whatsmeow v0.0.0-20220519090423-468ee95de7e7 h1:08FioJlQ6/50fAp+hRkTWhDuoBeg1UFt3yrNnsWPKuM= +go.mau.fi/whatsmeow v0.0.0-20220519090423-468ee95de7e7/go.mod h1:iUBgOLNaqShLrR17u0kIiRptIGFH+nbT1tRhaWBEX/c= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9 h1:NUzdAbFtCJSXU20AOXgeqaUwg8Ypg4MPYmL+d+rsB5c= golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= diff --git a/historysync.go b/historysync.go index 4eeae76..5c2e6ca 100644 --- a/historysync.go +++ b/historysync.go @@ -302,6 +302,7 @@ func (user *User) handleHistorySync(backfillQueue *BackfillQueue, evt *waProto.H // Don't store messages that will just be skipped. msgEvt, err := user.Client.ParseWebMessage(portal.Key.JID, rawMsg.GetMessage()) if err != nil { + user.log.Warnln("Dropping historical message due to info parse error:", err) continue } @@ -493,6 +494,9 @@ func (portal *Portal) backfill(source *User, messages []*waProto.WebMessageInfo, } } puppet := portal.getMessagePuppet(source, &msgEvt.Info) + if puppet == nil { + continue + } intent := puppet.IntentFor(portal) if intent.IsCustomPuppet && !portal.bridge.Config.CanDoublePuppetBackfill(puppet.CustomMXID) { intent = puppet.DefaultIntent() diff --git a/portal.go b/portal.go index ccd7ba6..79cc6d4 100644 --- a/portal.go +++ b/portal.go @@ -560,7 +560,9 @@ func (portal *Portal) handleUndecryptableMessage(source *User, evt *events.Undec "undecryptableType": metricType, }) intent := portal.getMessageIntent(source, &evt.Info) - if !intent.IsCustomPuppet && portal.IsPrivateChat() && evt.Info.Sender.User == portal.Key.Receiver.User { + if intent == nil { + return + } else if !intent.IsCustomPuppet && portal.IsPrivateChat() && evt.Info.Sender.User == portal.Key.Receiver.User { portal.log.Debugfln("Not handling %s (undecryptable): user doesn't have double puppeting enabled", evt.Info.ID) return } @@ -634,7 +636,9 @@ func (portal *Portal) handleMessage(source *User, evt *events.Message) { } intent := portal.getMessageIntent(source, &evt.Info) - if !intent.IsCustomPuppet && portal.IsPrivateChat() && evt.Info.Sender.User == portal.Key.Receiver.User { + if intent == nil { + return + } else if !intent.IsCustomPuppet && portal.IsPrivateChat() && evt.Info.Sender.User == portal.Key.Receiver.User { portal.log.Debugfln("Not handling %s (%s): user doesn't have double puppeting enabled", msgID, msgType) return } @@ -753,13 +757,21 @@ func (portal *Portal) getMessagePuppet(user *User, info *types.MessageInfo) *Pup return portal.bridge.GetPuppetByJID(portal.Key.JID) } else { puppet := portal.bridge.GetPuppetByJID(info.Sender) + if puppet == nil { + portal.log.Warnfln("Message %+v doesn't seem to have a valid sender (%s): puppet is nil", *info, info.Sender) + return nil + } puppet.SyncContact(user, true, true, "handling message") return puppet } } func (portal *Portal) getMessageIntent(user *User, info *types.MessageInfo) *appservice.IntentAPI { - return portal.getMessagePuppet(user, info).IntentFor(portal) + puppet := portal.getMessagePuppet(user, info) + if puppet == nil { + return nil + } + return puppet.IntentFor(portal) } func (portal *Portal) finishHandling(existing *database.Message, message *types.MessageInfo, mxid id.EventID, msgType database.MessageType, errType database.MessageErrorType) {