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

e2e: ensure we have both master and self-signing key #8455

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
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/8455.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix fetching of E2E cross signing keys over federation when only one of the master key and device signing key is cached already.
25 changes: 20 additions & 5 deletions synapse/handlers/e2e_keys.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,11 @@ async def query_devices(self, query_body, timeout, from_user_id):
if user_id in local_query:
results[user_id] = keys

# Get cached cross-signing keys
cross_signing_keys = await self.get_cross_signing_keys_from_cache(
device_keys_query, from_user_id
)

# Now attempt to get any remote devices from our local cache.
remote_queries_not_in_cache = {}
if remote_queries:
Expand All @@ -155,16 +160,26 @@ async def query_devices(self, query_body, timeout, from_user_id):
unsigned["device_display_name"] = device_display_name
user_devices[device_id] = result

# check for missing cross-signing keys.
for user_id in remote_queries.keys():
cached_cross_master = user_id in cross_signing_keys["master_keys"]
cached_cross_selfsigning = (
user_id in cross_signing_keys["self_signing_keys"]
)

# check if only one of the cross-signing master and
# self-signing key are cached.
# for each user we want the master _and_ the self-signing key,
# so we fetch those keys from federation
if cached_cross_master ^ cached_cross_selfsigning:
user_ids_not_in_cache.add(user_id)
TheJJ marked this conversation as resolved.
Show resolved Hide resolved

# add those users to the list to fetch over federation.
for user_id in user_ids_not_in_cache:
domain = get_domain_from_id(user_id)
r = remote_queries_not_in_cache.setdefault(domain, {})
r[user_id] = remote_queries[user_id]

# Get cached cross-signing keys
cross_signing_keys = await self.get_cross_signing_keys_from_cache(
device_keys_query, from_user_id
)

# Now fetch any devices that we don't have in our cache
@trace
async def do_remote_query(destination):
Expand Down