Skip to content

Commit eccb1c5

Browse files
committed
Adjust cross-signing things
1 parent e496c2f commit eccb1c5

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

mautrix/crypto/cross_signing.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,12 @@ async def get_cross_signing_public_keys(
8585
self, user_id: UserID
8686
) -> CrossSigningPublicKeys | None:
8787
db_keys = await self.crypto_store.get_cross_signing_keys(user_id)
88-
if CrossSigningUsage.MASTER not in db_keys:
89-
await self._fetch_keys([user_id], include_untracked=True)
88+
if CrossSigningUsage.MASTER not in db_keys and user_id not in self._cs_fetch_attempted:
89+
self.log.debug(f"Didn't find any cross-signing keys for {user_id}, fetching...")
90+
async with self._fetch_keys_lock:
91+
if user_id not in self._cs_fetch_attempted:
92+
self._cs_fetch_attempted.add(user_id)
93+
await self._fetch_keys([user_id], include_untracked=True)
9094
db_keys = await self.crypto_store.get_cross_signing_keys(user_id)
9195
if CrossSigningUsage.MASTER not in db_keys:
9296
return None

mautrix/crypto/device_lists.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -315,18 +315,23 @@ async def _validate_device(
315315
deleted=False,
316316
)
317317

318-
async def resolve_trust(self, device: DeviceIdentity) -> TrustState:
318+
async def resolve_trust(self, device: DeviceIdentity, allow_fetch: bool = True) -> TrustState:
319319
try:
320-
return await self._try_resolve_trust(device)
320+
return await self._try_resolve_trust(device, allow_fetch)
321321
except Exception:
322322
self.log.exception(f"Failed to resolve trust of {device.user_id}/{device.device_id}")
323323
return TrustState.UNVERIFIED
324324

325-
async def _try_resolve_trust(self, device: DeviceIdentity) -> TrustState:
326-
if device.trust in (TrustState.VERIFIED, TrustState.BLACKLISTED):
325+
async def _try_resolve_trust(
326+
self, device: DeviceIdentity, allow_fetch: bool = True
327+
) -> TrustState:
328+
if device.device_id != self.client.device_id and device.trust in (
329+
TrustState.VERIFIED,
330+
TrustState.BLACKLISTED,
331+
):
327332
return device.trust
328333
their_keys = await self.crypto_store.get_cross_signing_keys(device.user_id)
329-
if len(their_keys) == 0 and device.user_id not in self._cs_fetch_attempted:
334+
if len(their_keys) == 0 and allow_fetch and device.user_id not in self._cs_fetch_attempted:
330335
self.log.debug(f"Didn't find any cross-signing keys for {device.user_id}, fetching...")
331336
async with self._fetch_keys_lock:
332337
if device.user_id not in self._cs_fetch_attempted:
@@ -337,7 +342,8 @@ async def _try_resolve_trust(self, device: DeviceIdentity) -> TrustState:
337342
msk = their_keys[CrossSigningUsage.MASTER]
338343
ssk = their_keys[CrossSigningUsage.SELF]
339344
except KeyError as e:
340-
self.log.error(f"Didn't find cross-signing key {e.args[0]} of {device.user_id}")
345+
if allow_fetch:
346+
self.log.error(f"Didn't find cross-signing key {e.args[0]} of {device.user_id}")
341347
return TrustState.UNVERIFIED
342348
ssk_signed = await self.crypto_store.is_key_signed_by(
343349
target=CrossSigner(device.user_id, ssk.key),

0 commit comments

Comments
 (0)