aboutsummaryrefslogtreecommitdiff
path: root/syncapi/consumers
diff options
context:
space:
mode:
authorTill <2353100+S7evinK@users.noreply.github.com>2022-09-20 11:32:03 +0200
committerGitHub <noreply@github.com>2022-09-20 11:32:03 +0200
commite007b8038f677b6578a65cfe2cbd8a7192ae69b0 (patch)
tree27157dc3e229c2a2b6fcf190d4d94a1a0ba17621 /syncapi/consumers
parent47af4bff5b930c86630c7879e14f5b07b9d08497 (diff)
Mark device list as stale, if we don't have the requesting device (#2728)
This hopefully makes E2EE chats a little bit more reliable by re-syncing devices if we don't have the `requesting_device_id` in our database. (As seen in [Synapse](https://github.com/matrix-org/synapse/blob/c52abc1cfdd9e5480cdb4a03d626fe61cacc6573/synapse/handlers/devicemessage.py#L157-L201))
Diffstat (limited to 'syncapi/consumers')
-rw-r--r--syncapi/consumers/sendtodevice.go25
1 files changed, 23 insertions, 2 deletions
diff --git a/syncapi/consumers/sendtodevice.go b/syncapi/consumers/sendtodevice.go
index 7d6aae59..c0b43225 100644
--- a/syncapi/consumers/sendtodevice.go
+++ b/syncapi/consumers/sendtodevice.go
@@ -23,7 +23,9 @@ import (
"github.com/matrix-org/util"
"github.com/nats-io/nats.go"
log "github.com/sirupsen/logrus"
+ "github.com/tidwall/gjson"
+ keyapi "github.com/matrix-org/dendrite/keyserver/api"
"github.com/matrix-org/dendrite/setup/config"
"github.com/matrix-org/dendrite/setup/jetstream"
"github.com/matrix-org/dendrite/setup/process"
@@ -39,6 +41,7 @@ type OutputSendToDeviceEventConsumer struct {
durable string
topic string
db storage.Database
+ keyAPI keyapi.SyncKeyAPI
serverName gomatrixserverlib.ServerName // our server name
stream types.StreamProvider
notifier *notifier.Notifier
@@ -51,6 +54,7 @@ func NewOutputSendToDeviceEventConsumer(
cfg *config.SyncAPI,
js nats.JetStreamContext,
store storage.Database,
+ keyAPI keyapi.SyncKeyAPI,
notifier *notifier.Notifier,
stream types.StreamProvider,
) *OutputSendToDeviceEventConsumer {
@@ -60,6 +64,7 @@ func NewOutputSendToDeviceEventConsumer(
topic: cfg.Matrix.JetStream.Prefixed(jetstream.OutputSendToDeviceEvent),
durable: cfg.Matrix.JetStream.Durable("SyncAPISendToDeviceConsumer"),
db: store,
+ keyAPI: keyAPI,
serverName: cfg.Matrix.ServerName,
notifier: notifier,
stream: stream,
@@ -96,12 +101,28 @@ func (s *OutputSendToDeviceEventConsumer) onMessage(ctx context.Context, msgs []
return true
}
- util.GetLogger(context.TODO()).WithFields(log.Fields{
+ logger := util.GetLogger(context.TODO()).WithFields(log.Fields{
"sender": output.Sender,
"user_id": output.UserID,
"device_id": output.DeviceID,
"event_type": output.Type,
- }).Debugf("sync API received send-to-device event from the clientapi/federationsender")
+ })
+ logger.Debugf("sync API received send-to-device event from the clientapi/federationsender")
+
+ // Check we actually got the requesting device in our store, if we receive a room key request
+ if output.Type == "m.room_key_request" {
+ requestingDeviceID := gjson.GetBytes(output.SendToDeviceEvent.Content, "requesting_device_id").Str
+ _, senderDomain, _ := gomatrixserverlib.SplitID('@', output.Sender)
+ if requestingDeviceID != "" && senderDomain != s.serverName {
+ // Mark the requesting device as stale, if we don't know about it.
+ if err = s.keyAPI.PerformMarkAsStaleIfNeeded(ctx, &keyapi.PerformMarkAsStaleRequest{
+ UserID: output.Sender, Domain: senderDomain, DeviceID: requestingDeviceID,
+ }, &struct{}{}); err != nil {
+ logger.WithError(err).Errorf("failed to mark as stale if needed")
+ return false
+ }
+ }
+ }
streamPos, err := s.db.StoreNewSendForDeviceMessage(
s.ctx, output.UserID, output.DeviceID, output.SendToDeviceEvent,