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 5 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
2 changes: 2 additions & 0 deletions changelog.d/9634.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Only save remote cross-signing and device keys if they're different from the
current ones.
clokep marked this conversation as resolved.
Show resolved Hide resolved
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