aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyserver/internal/device_list_update.go27
1 files changed, 23 insertions, 4 deletions
diff --git a/keyserver/internal/device_list_update.go b/keyserver/internal/device_list_update.go
index c5a5d40c..b208f0ce 100644
--- a/keyserver/internal/device_list_update.go
+++ b/keyserver/internal/device_list_update.go
@@ -241,14 +241,33 @@ func (u *DeviceListUpdater) update(ctx context.Context, event gomatrixserverlib.
StreamID: event.StreamID,
},
}
+
+ // DeviceKeysJSON will side-effect modify this, so it needs
+ // to be a copy, not sharing any pointers with the above.
+ deviceKeysCopy := *keys[0].DeviceKeys
+ deviceKeysCopy.KeyJSON = nil
+ existingKeys := []api.DeviceMessage{
+ {
+ Type: keys[0].Type,
+ DeviceKeys: &deviceKeysCopy,
+ StreamID: keys[0].StreamID,
+ },
+ }
+
+ // fetch what keys we had already and only emit changes
+ if err = u.db.DeviceKeysJSON(ctx, existingKeys); err != nil {
+ // non-fatal, log and continue
+ util.GetLogger(ctx).WithError(err).WithField("user_id", event.UserID).Errorf(
+ "failed to query device keys json for calculating diffs",
+ )
+ }
+
err = u.db.StoreRemoteDeviceKeys(ctx, keys, nil)
if err != nil {
return false, fmt.Errorf("failed to store remote device keys for %s (%s): %w", event.UserID, event.DeviceID, err)
}
- // ALWAYS emit key changes when we've been poked over federation even if there's no change
- // just in case this poke is important for something.
- err = u.producer.ProduceKeyChanges(keys)
- if err != nil {
+
+ if err = emitDeviceKeyChanges(u.producer, existingKeys, keys); err != nil {
return false, fmt.Errorf("failed to produce device key changes for %s (%s): %w", event.UserID, event.DeviceID, err)
}
return false, nil