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

Commit c919574

Browse files
authored
Move more encryption endpoints off master (#9068)
1 parent 42d3a28 commit c919574

File tree

3 files changed

+55
-46
lines changed

3 files changed

+55
-46
lines changed

changelog.d/9068.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add experimental support for handling `/keys/claim` and `/room_keys` APIs on worker processes.

synapse/app/generic_worker.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,18 @@
100100
)
101101
from synapse.rest.client.v1.push_rule import PushRuleRestServlet
102102
from synapse.rest.client.v1.voip import VoipRestServlet
103-
from synapse.rest.client.v2_alpha import groups, sync, user_directory
103+
from synapse.rest.client.v2_alpha import groups, room_keys, sync, user_directory
104104
from synapse.rest.client.v2_alpha._base import client_patterns
105105
from synapse.rest.client.v2_alpha.account import ThreepidRestServlet
106106
from synapse.rest.client.v2_alpha.account_data import (
107107
AccountDataServlet,
108108
RoomAccountDataServlet,
109109
)
110-
from synapse.rest.client.v2_alpha.keys import KeyChangesServlet, KeyQueryServlet
110+
from synapse.rest.client.v2_alpha.keys import (
111+
KeyChangesServlet,
112+
KeyQueryServlet,
113+
OneTimeKeyServlet,
114+
)
111115
from synapse.rest.client.v2_alpha.register import RegisterRestServlet
112116
from synapse.rest.client.v2_alpha.sendtodevice import SendToDeviceRestServlet
113117
from synapse.rest.client.versions import VersionsRestServlet
@@ -116,6 +120,7 @@
116120
from synapse.server import HomeServer, cache_in_self
117121
from synapse.storage.databases.main.censor_events import CensorEventsStore
118122
from synapse.storage.databases.main.client_ips import ClientIpWorkerStore
123+
from synapse.storage.databases.main.e2e_room_keys import EndToEndRoomKeyStore
119124
from synapse.storage.databases.main.media_repository import MediaRepositoryStore
120125
from synapse.storage.databases.main.metrics import ServerMetricsStore
121126
from synapse.storage.databases.main.monthly_active_users import (
@@ -447,6 +452,7 @@ class GenericWorkerSlavedStore(
447452
UserDirectoryStore,
448453
StatsStore,
449454
UIAuthWorkerStore,
455+
EndToEndRoomKeyStore,
450456
SlavedDeviceInboxStore,
451457
SlavedDeviceStore,
452458
SlavedReceiptsStore,
@@ -504,6 +510,7 @@ def _listen_http(self, listener_config: ListenerConfig):
504510
LoginRestServlet(self).register(resource)
505511
ThreepidRestServlet(self).register(resource)
506512
KeyQueryServlet(self).register(resource)
513+
OneTimeKeyServlet(self).register(resource)
507514
KeyChangesServlet(self).register(resource)
508515
VoipRestServlet(self).register(resource)
509516
PushRuleRestServlet(self).register(resource)
@@ -521,6 +528,7 @@ def _listen_http(self, listener_config: ListenerConfig):
521528
room.register_servlets(self, resource, True)
522529
room.register_deprecated_servlets(self, resource)
523530
InitialSyncRestServlet(self).register(resource)
531+
room_keys.register_servlets(self, resource)
524532

525533
SendToDeviceRestServlet(self).register(resource)
526534

synapse/storage/databases/main/end_to_end_keys.py

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -707,50 +707,6 @@ def get_device_stream_token(self) -> int:
707707
"""Get the current stream id from the _device_list_id_gen"""
708708
...
709709

710-
711-
class EndToEndKeyStore(EndToEndKeyWorkerStore, SQLBaseStore):
712-
async def set_e2e_device_keys(
713-
self, user_id: str, device_id: str, time_now: int, device_keys: JsonDict
714-
) -> bool:
715-
"""Stores device keys for a device. Returns whether there was a change
716-
or the keys were already in the database.
717-
"""
718-
719-
def _set_e2e_device_keys_txn(txn):
720-
set_tag("user_id", user_id)
721-
set_tag("device_id", device_id)
722-
set_tag("time_now", time_now)
723-
set_tag("device_keys", device_keys)
724-
725-
old_key_json = self.db_pool.simple_select_one_onecol_txn(
726-
txn,
727-
table="e2e_device_keys_json",
728-
keyvalues={"user_id": user_id, "device_id": device_id},
729-
retcol="key_json",
730-
allow_none=True,
731-
)
732-
733-
# In py3 we need old_key_json to match new_key_json type. The DB
734-
# returns unicode while encode_canonical_json returns bytes.
735-
new_key_json = encode_canonical_json(device_keys).decode("utf-8")
736-
737-
if old_key_json == new_key_json:
738-
log_kv({"Message": "Device key already stored."})
739-
return False
740-
741-
self.db_pool.simple_upsert_txn(
742-
txn,
743-
table="e2e_device_keys_json",
744-
keyvalues={"user_id": user_id, "device_id": device_id},
745-
values={"ts_added_ms": time_now, "key_json": new_key_json},
746-
)
747-
log_kv({"message": "Device keys stored."})
748-
return True
749-
750-
return await self.db_pool.runInteraction(
751-
"set_e2e_device_keys", _set_e2e_device_keys_txn
752-
)
753-
754710
async def claim_e2e_one_time_keys(
755711
self, query_list: Iterable[Tuple[str, str, str]]
756712
) -> Dict[str, Dict[str, Dict[str, bytes]]]:
@@ -840,6 +796,50 @@ def _claim_e2e_one_time_keys(txn):
840796
"claim_e2e_one_time_keys", _claim_e2e_one_time_keys
841797
)
842798

799+
800+
class EndToEndKeyStore(EndToEndKeyWorkerStore, SQLBaseStore):
801+
async def set_e2e_device_keys(
802+
self, user_id: str, device_id: str, time_now: int, device_keys: JsonDict
803+
) -> bool:
804+
"""Stores device keys for a device. Returns whether there was a change
805+
or the keys were already in the database.
806+
"""
807+
808+
def _set_e2e_device_keys_txn(txn):
809+
set_tag("user_id", user_id)
810+
set_tag("device_id", device_id)
811+
set_tag("time_now", time_now)
812+
set_tag("device_keys", device_keys)
813+
814+
old_key_json = self.db_pool.simple_select_one_onecol_txn(
815+
txn,
816+
table="e2e_device_keys_json",
817+
keyvalues={"user_id": user_id, "device_id": device_id},
818+
retcol="key_json",
819+
allow_none=True,
820+
)
821+
822+
# In py3 we need old_key_json to match new_key_json type. The DB
823+
# returns unicode while encode_canonical_json returns bytes.
824+
new_key_json = encode_canonical_json(device_keys).decode("utf-8")
825+
826+
if old_key_json == new_key_json:
827+
log_kv({"Message": "Device key already stored."})
828+
return False
829+
830+
self.db_pool.simple_upsert_txn(
831+
txn,
832+
table="e2e_device_keys_json",
833+
keyvalues={"user_id": user_id, "device_id": device_id},
834+
values={"ts_added_ms": time_now, "key_json": new_key_json},
835+
)
836+
log_kv({"message": "Device keys stored."})
837+
return True
838+
839+
return await self.db_pool.runInteraction(
840+
"set_e2e_device_keys", _set_e2e_device_keys_txn
841+
)
842+
843843
async def delete_e2e_keys_by_device(self, user_id: str, device_id: str) -> None:
844844
def delete_e2e_keys_by_device_txn(txn):
845845
log_kv(

0 commit comments

Comments
 (0)