only save remote cross-signing keys if they're different from the current ones (#9634)
Co-authored-by: Patrick Cloke <clokep@users.noreply.github.com>pull/9649/head
parent
ad721fc559
commit
73dbce5523
|
@ -0,0 +1 @@
|
|||
Only save remote cross-signing and device keys if they're different from the current ones.
|
|
@ -907,6 +907,7 @@ class DeviceListUpdater:
|
|||
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
|
||||
|
@ -925,6 +926,12 @@ class DeviceListUpdater:
|
|||
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(
|
||||
|
@ -934,7 +941,10 @@ class DeviceListUpdater:
|
|||
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.
|
||||
|
@ -945,6 +955,7 @@ class DeviceListUpdater:
|
|||
)
|
||||
device_ids = device_ids + cross_signing_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
|
||||
|
@ -973,14 +984,17 @@ class DeviceListUpdater:
|
|||
"""
|
||||
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
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue