Skip to content

Commit 1e464f8

Browse files
committed
Fetch encryption info from server if not cached
1 parent 57a7a5c commit 1e464f8

File tree

3 files changed

+37
-16
lines changed

3 files changed

+37
-16
lines changed

mautrix/crypto/base.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2022 Tulir Asokan
1+
# Copyright (c) 2023 Tulir Asokan
22
#
33
# This Source Code Form is subject to the terms of the Mozilla Public
44
# License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -12,13 +12,17 @@
1212

1313
import olm
1414

15+
from mautrix.errors import MForbidden, MNotFound
1516
from mautrix.types import (
1617
DeviceID,
1718
EncryptionKeyAlgorithm,
19+
EventType,
1820
IdentityKey,
1921
KeyID,
2022
RequestedKeyInfo,
23+
RoomEncryptionStateEventContent,
2124
RoomID,
25+
RoomKeyEventContent,
2226
SessionID,
2327
SigningKey,
2428
TrustState,
@@ -82,6 +86,34 @@ def _mark_session_received(self, session_id: SessionID) -> None:
8286
except KeyError:
8387
return
8488

89+
async def _fill_encryption_info(self, evt: RoomKeyEventContent) -> None:
90+
encryption_info = await self.state_store.get_encryption_info(evt.room_id)
91+
if not encryption_info:
92+
self.log.warning(
93+
f"Encryption info for {evt.room_id} not found in state store, fetching from server"
94+
)
95+
try:
96+
encryption_info = await self.client.get_state_event(
97+
evt.room_id, EventType.ROOM_ENCRYPTION
98+
)
99+
except (MNotFound, MForbidden) as e:
100+
self.log.warning(
101+
f"Failed to get encryption info for {evt.room_id} from server: {e},"
102+
" using defaults"
103+
)
104+
encryption_info = RoomEncryptionStateEventContent()
105+
if not encryption_info:
106+
self.log.warning(
107+
f"Didn't find encryption info for {evt.room_id} on server either,"
108+
" using defaults"
109+
)
110+
encryption_info = RoomEncryptionStateEventContent()
111+
112+
if not evt.beeper_max_age_ms:
113+
evt.beeper_max_age_ms = encryption_info.rotation_period_ms
114+
if not evt.beeper_max_messages:
115+
evt.beeper_max_messages = encryption_info.rotation_period_msgs
116+
85117

86118
canonical_json = functools.partial(
87119
json.dumps, ensure_ascii=False, separators=(",", ":"), sort_keys=True

mautrix/crypto/key_request.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
# Copyright (c) 2022 Tulir Asokan
1+
# Copyright (c) 2023 Tulir Asokan
22
#
33
# This Source Code Form is subject to the terms of the Mozilla Public
44
# License, v. 2.0. If a copy of the MPL was not distributed with this
55
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
from typing import Dict, List, Optional, Union
7-
from datetime import timedelta
87
import asyncio
98
import uuid
109

@@ -122,12 +121,7 @@ async def _receive_forwarded_room_key(self, evt: DecryptedOlmEvent) -> None:
122121
)
123122
return
124123
if not key.beeper_max_messages or not key.beeper_max_age_ms:
125-
encryption_info = await self.state_store.get_encryption_info(key.room_id)
126-
if encryption_info:
127-
if not key.beeper_max_age_ms:
128-
key.beeper_max_age_ms = encryption_info.rotation_period_ms
129-
if not key.beeper_max_messages:
130-
key.beeper_max_messages = encryption_info.rotation_period_msgs
124+
await self._fill_encryption_info(key)
131125
key.forwarding_key_chain.append(evt.sender_key)
132126
sess = InboundGroupSession.import_session(
133127
key.session_key,

mautrix/crypto/machine.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2022 Tulir Asokan
1+
# Copyright (c) 2023 Tulir Asokan
22
#
33
# This Source Code Form is subject to the terms of the Mozilla Public
44
# License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -223,12 +223,7 @@ async def _receive_room_key(self, evt: DecryptedOlmEvent) -> None:
223223
if evt.content.algorithm != EncryptionAlgorithm.MEGOLM_V1 or not evt.keys.ed25519:
224224
return
225225
if not evt.content.beeper_max_messages or not evt.content.beeper_max_age_ms:
226-
encryption_info = await self.state_store.get_encryption_info(evt.content.room_id)
227-
if encryption_info:
228-
if not evt.content.beeper_max_age_ms:
229-
evt.content.beeper_max_age_ms = encryption_info.rotation_period_ms
230-
if not evt.content.beeper_max_messages:
231-
evt.content.beeper_max_messages = encryption_info.rotation_period_msgs
226+
await self._fill_encryption_info(evt.content)
232227
if self.delete_previous_keys_on_receive and not evt.content.beeper_is_scheduled:
233228
removed_ids = await self.crypto_store.redact_group_sessions(
234229
evt.content.room_id, evt.sender_key, reason="received new key from device"

0 commit comments

Comments
 (0)