Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 73dbce5

Browse files
uhoregclokep
andauthored
only save remote cross-signing keys if they're different from the current ones (#9634)
Co-authored-by: Patrick Cloke <[email protected]>
1 parent ad721fc commit 73dbce5

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

changelog.d/9634.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Only save remote cross-signing and device keys if they're different from the current ones.

synapse/handlers/device.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,7 @@ async def user_device_resync(
907907
master_key = result.get("master_key")
908908
self_signing_key = result.get("self_signing_key")
909909

910+
ignore_devices = False
910911
# If the remote server has more than ~1000 devices for this user
911912
# we assume that something is going horribly wrong (e.g. a bot
912913
# that logs in and creates a new device every time it tries to
@@ -925,6 +926,12 @@ async def user_device_resync(
925926
len(devices),
926927
)
927928
devices = []
929+
ignore_devices = True
930+
else:
931+
cached_devices = await self.store.get_cached_devices_for_user(user_id)
932+
if cached_devices == {d["device_id"]: d for d in devices}:
933+
devices = []
934+
ignore_devices = True
928935

929936
for device in devices:
930937
logger.debug(
@@ -934,7 +941,10 @@ async def user_device_resync(
934941
stream_id,
935942
)
936943

937-
await self.store.update_remote_device_list_cache(user_id, devices, stream_id)
944+
if not ignore_devices:
945+
await self.store.update_remote_device_list_cache(
946+
user_id, devices, stream_id
947+
)
938948
device_ids = [device["device_id"] for device in devices]
939949

940950
# Handle cross-signing keys.
@@ -945,7 +955,8 @@ async def user_device_resync(
945955
)
946956
device_ids = device_ids + cross_signing_device_ids
947957

948-
await self.device_handler.notify_device_update(user_id, device_ids)
958+
if device_ids:
959+
await self.device_handler.notify_device_update(user_id, device_ids)
949960

950961
# We clobber the seen updates since we've re-synced from a given
951962
# point.
@@ -973,14 +984,17 @@ async def process_cross_signing_key_update(
973984
"""
974985
device_ids = []
975986

976-
if master_key:
987+
current_keys_map = await self.store.get_e2e_cross_signing_keys_bulk([user_id])
988+
current_keys = current_keys_map.get(user_id) or {}
989+
990+
if master_key and master_key != current_keys.get("master"):
977991
await self.store.set_e2e_cross_signing_key(user_id, "master", master_key)
978992
_, verify_key = get_verify_key_from_cross_signing_key(master_key)
979993
# verify_key is a VerifyKey from signedjson, which uses
980994
# .version to denote the portion of the key ID after the
981995
# algorithm and colon, which is the device ID
982996
device_ids.append(verify_key.version)
983-
if self_signing_key:
997+
if self_signing_key and self_signing_key != current_keys.get("self_signing"):
984998
await self.store.set_e2e_cross_signing_key(
985999
user_id, "self_signing", self_signing_key
9861000
)

0 commit comments

Comments
 (0)