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

Commit 5279b91

Browse files
authored
Use RoomVersion objects (#10934)
Various refactors to use `RoomVersion` objects instead of room version identifiers.
1 parent 2be0fde commit 5279b91

File tree

5 files changed

+50
-48
lines changed

5 files changed

+50
-48
lines changed

changelog.d/10934.misc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Refactor various parts of the codebase to use `RoomVersion` objects instead of room version identifier strings.

synapse/events/builder.py

-20
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@
1818
from nacl.signing import SigningKey
1919

2020
from synapse.api.constants import MAX_DEPTH
21-
from synapse.api.errors import UnsupportedRoomVersionError
2221
from synapse.api.room_versions import (
2322
KNOWN_EVENT_FORMAT_VERSIONS,
24-
KNOWN_ROOM_VERSIONS,
2523
EventFormatVersions,
2624
RoomVersion,
2725
)
@@ -197,24 +195,6 @@ def __init__(self, hs: "HomeServer"):
197195
self.state = hs.get_state_handler()
198196
self._event_auth_handler = hs.get_event_auth_handler()
199197

200-
def new(self, room_version: str, key_values: dict) -> EventBuilder:
201-
"""Generate an event builder appropriate for the given room version
202-
203-
Deprecated: use for_room_version with a RoomVersion object instead
204-
205-
Args:
206-
room_version: Version of the room that we're creating an event builder for
207-
key_values: Fields used as the basis of the new event
208-
209-
Returns:
210-
EventBuilder
211-
"""
212-
v = KNOWN_ROOM_VERSIONS.get(room_version)
213-
if not v:
214-
# this can happen if support is withdrawn for a room version
215-
raise UnsupportedRoomVersionError()
216-
return self.for_room_version(v, key_values)
217-
218198
def for_room_version(
219199
self, room_version: RoomVersion, key_values: dict
220200
) -> EventBuilder:

synapse/handlers/federation.py

+26-20
Original file line numberDiff line numberDiff line change
@@ -718,8 +718,8 @@ async def on_make_join_request(
718718
state_ids,
719719
)
720720

721-
builder = self.event_builder_factory.new(
722-
room_version.identifier,
721+
builder = self.event_builder_factory.for_room_version(
722+
room_version,
723723
{
724724
"type": EventTypes.Member,
725725
"content": event_content,
@@ -897,9 +897,9 @@ async def on_make_leave_request(
897897
)
898898
raise SynapseError(403, "User not from origin", Codes.FORBIDDEN)
899899

900-
room_version = await self.store.get_room_version_id(room_id)
901-
builder = self.event_builder_factory.new(
902-
room_version,
900+
room_version_obj = await self.store.get_room_version(room_id)
901+
builder = self.event_builder_factory.for_room_version(
902+
room_version_obj,
903903
{
904904
"type": EventTypes.Member,
905905
"content": {"membership": Membership.LEAVE},
@@ -917,7 +917,7 @@ async def on_make_leave_request(
917917
# The remote hasn't signed it yet, obviously. We'll do the full checks
918918
# when we get the event back in `on_send_leave_request`
919919
await self._event_auth_handler.check_from_context(
920-
room_version, event, context, do_sig_check=False
920+
room_version_obj.identifier, event, context, do_sig_check=False
921921
)
922922
except AuthError as e:
923923
logger.warning("Failed to create new leave %r because %s", event, e)
@@ -949,10 +949,10 @@ async def on_make_knock_request(
949949
)
950950
raise SynapseError(403, "User not from origin", Codes.FORBIDDEN)
951951

952-
room_version = await self.store.get_room_version_id(room_id)
952+
room_version_obj = await self.store.get_room_version(room_id)
953953

954-
builder = self.event_builder_factory.new(
955-
room_version,
954+
builder = self.event_builder_factory.for_room_version(
955+
room_version_obj,
956956
{
957957
"type": EventTypes.Member,
958958
"content": {"membership": Membership.KNOCK},
@@ -979,7 +979,7 @@ async def on_make_knock_request(
979979
# The remote hasn't signed it yet, obviously. We'll do the full checks
980980
# when we get the event back in `on_send_knock_request`
981981
await self._event_auth_handler.check_from_context(
982-
room_version, event, context, do_sig_check=False
982+
room_version_obj.identifier, event, context, do_sig_check=False
983983
)
984984
except AuthError as e:
985985
logger.warning("Failed to create new knock %r because %s", event, e)
@@ -1245,16 +1245,18 @@ async def exchange_third_party_invite(
12451245
}
12461246

12471247
if await self._event_auth_handler.check_host_in_room(room_id, self.hs.hostname):
1248-
room_version = await self.store.get_room_version_id(room_id)
1249-
builder = self.event_builder_factory.new(room_version, event_dict)
1248+
room_version_obj = await self.store.get_room_version(room_id)
1249+
builder = self.event_builder_factory.for_room_version(
1250+
room_version_obj, event_dict
1251+
)
12501252

12511253
EventValidator().validate_builder(builder)
12521254
event, context = await self.event_creation_handler.create_new_client_event(
12531255
builder=builder
12541256
)
12551257

12561258
event, context = await self.add_display_name_to_third_party_invite(
1257-
room_version, event_dict, event, context
1259+
room_version_obj, event_dict, event, context
12581260
)
12591261

12601262
EventValidator().validate_new(event, self.config)
@@ -1265,7 +1267,7 @@ async def exchange_third_party_invite(
12651267

12661268
try:
12671269
await self._event_auth_handler.check_from_context(
1268-
room_version, event, context
1270+
room_version_obj.identifier, event, context
12691271
)
12701272
except AuthError as e:
12711273
logger.warning("Denying new third party invite %r because %s", event, e)
@@ -1299,22 +1301,24 @@ async def on_exchange_third_party_invite_request(
12991301
13001302
"""
13011303
assert_params_in_dict(event_dict, ["room_id"])
1302-
room_version = await self.store.get_room_version_id(event_dict["room_id"])
1304+
room_version_obj = await self.store.get_room_version(event_dict["room_id"])
13031305

13041306
# NB: event_dict has a particular specced format we might need to fudge
13051307
# if we change event formats too much.
1306-
builder = self.event_builder_factory.new(room_version, event_dict)
1308+
builder = self.event_builder_factory.for_room_version(
1309+
room_version_obj, event_dict
1310+
)
13071311

13081312
event, context = await self.event_creation_handler.create_new_client_event(
13091313
builder=builder
13101314
)
13111315
event, context = await self.add_display_name_to_third_party_invite(
1312-
room_version, event_dict, event, context
1316+
room_version_obj, event_dict, event, context
13131317
)
13141318

13151319
try:
13161320
await self._event_auth_handler.check_from_context(
1317-
room_version, event, context
1321+
room_version_obj.identifier, event, context
13181322
)
13191323
except AuthError as e:
13201324
logger.warning("Denying third party invite %r because %s", event, e)
@@ -1331,7 +1335,7 @@ async def on_exchange_third_party_invite_request(
13311335

13321336
async def add_display_name_to_third_party_invite(
13331337
self,
1334-
room_version: str,
1338+
room_version_obj: RoomVersion,
13351339
event_dict: JsonDict,
13361340
event: EventBase,
13371341
context: EventContext,
@@ -1363,7 +1367,9 @@ async def add_display_name_to_third_party_invite(
13631367
# auth checks. If we need the invite and don't have it then the
13641368
# auth check code will explode appropriately.
13651369

1366-
builder = self.event_builder_factory.new(room_version, event_dict)
1370+
builder = self.event_builder_factory.for_room_version(
1371+
room_version_obj, event_dict
1372+
)
13671373
EventValidator().validate_builder(builder)
13681374
event, context = await self.event_creation_handler.create_new_client_event(
13691375
builder=builder

synapse/handlers/message.py

+21-6
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
NotFoundError,
4141
ShadowBanError,
4242
SynapseError,
43+
UnsupportedRoomVersionError,
4344
)
4445
from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersions
4546
from synapse.api.urls import ConsentURIBuilder
@@ -550,16 +551,22 @@ async def create_event(
550551
await self.auth.check_auth_blocking(requester=requester)
551552

552553
if event_dict["type"] == EventTypes.Create and event_dict["state_key"] == "":
553-
room_version = event_dict["content"]["room_version"]
554+
room_version_id = event_dict["content"]["room_version"]
555+
room_version_obj = KNOWN_ROOM_VERSIONS.get(room_version_id)
556+
if not room_version_obj:
557+
# this can happen if support is withdrawn for a room version
558+
raise UnsupportedRoomVersionError(room_version_id)
554559
else:
555560
try:
556-
room_version = await self.store.get_room_version_id(
561+
room_version_obj = await self.store.get_room_version(
557562
event_dict["room_id"]
558563
)
559564
except NotFoundError:
560565
raise AuthError(403, "Unknown room")
561566

562-
builder = self.event_builder_factory.new(room_version, event_dict)
567+
builder = self.event_builder_factory.for_room_version(
568+
room_version_obj, event_dict
569+
)
563570

564571
self.validator.validate_builder(builder)
565572

@@ -1070,9 +1077,17 @@ async def handle_new_client_event(
10701077
EventTypes.Create,
10711078
"",
10721079
):
1073-
room_version = event.content.get("room_version", RoomVersions.V1.identifier)
1080+
room_version_id = event.content.get(
1081+
"room_version", RoomVersions.V1.identifier
1082+
)
1083+
room_version_obj = KNOWN_ROOM_VERSIONS.get(room_version_id)
1084+
if not room_version_obj:
1085+
raise UnsupportedRoomVersionError(
1086+
"Attempt to create a room with unsupported room version %s"
1087+
% (room_version_id,)
1088+
)
10741089
else:
1075-
room_version = await self.store.get_room_version_id(event.room_id)
1090+
room_version_obj = await self.store.get_room_version(event.room_id)
10761091

10771092
if event.internal_metadata.is_out_of_band_membership():
10781093
# the only sort of out-of-band-membership events we expect to see here are
@@ -1082,7 +1097,7 @@ async def handle_new_client_event(
10821097
else:
10831098
try:
10841099
await self._event_auth_handler.check_from_context(
1085-
room_version, event, context
1100+
room_version_obj.identifier, event, context
10861101
)
10871102
except AuthError as err:
10881103
logger.warning("Denying new event %r because %s", event, err)

synapse/handlers/room.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,9 @@ async def _upgrade_room(
237237
},
238238
},
239239
)
240-
old_room_version = await self.store.get_room_version_id(old_room_id)
240+
old_room_version = await self.store.get_room_version(old_room_id)
241241
await self._event_auth_handler.check_from_context(
242-
old_room_version, tombstone_event, tombstone_context
242+
old_room_version.identifier, tombstone_event, tombstone_context
243243
)
244244

245245
await self.clone_existing_room(

0 commit comments

Comments
 (0)