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

only save remote cross-signing keys if they're different from the current ones #9634

Merged
merged 6 commits into from
Mar 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/9634.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Only save remote cross-signing and device keys if they're different from the current ones.
22 changes: 18 additions & 4 deletions synapse/handlers/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,7 @@ async def user_device_resync(
master_key = result.get("master_key")
self_signing_key = result.get("self_signing_key")

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

for device in devices:
logger.debug(
Expand All @@ -934,7 +941,10 @@ async def user_device_resync(
stream_id,
)

await self.store.update_remote_device_list_cache(user_id, devices, stream_id)
if not ignore_devices:
await self.store.update_remote_device_list_cache(
user_id, devices, stream_id
)
device_ids = [device["device_id"] for device in devices]

# Handle cross-signing keys.
Expand All @@ -945,7 +955,8 @@ async def user_device_resync(
)
device_ids = device_ids + cross_signing_device_ids

await self.device_handler.notify_device_update(user_id, device_ids)
if device_ids:
await self.device_handler.notify_device_update(user_id, device_ids)

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

if master_key:
current_keys_map = await self.store.get_e2e_cross_signing_keys_bulk([user_id])
current_keys = current_keys_map.get(user_id) or {}

if master_key and master_key != current_keys.get("master"):
await self.store.set_e2e_cross_signing_key(user_id, "master", master_key)
_, verify_key = get_verify_key_from_cross_signing_key(master_key)
# verify_key is a VerifyKey from signedjson, which uses
# .version to denote the portion of the key ID after the
# algorithm and colon, which is the device ID
device_ids.append(verify_key.version)
if self_signing_key:
if self_signing_key and self_signing_key != current_keys.get("self_signing"):
await self.store.set_e2e_cross_signing_key(
user_id, "self_signing", self_signing_key
)
Expand Down