From 5ed830b3b4c74c89d876cc07756c5d98a100cbed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=9D=82=E9=9B=85?= <23130178+ShadowRZ@users.noreply.github.com> Date: Fri, 17 Jul 2026 01:33:13 +0800 Subject: [PATCH] Change default room version to 11 (MSC4239) (#18680) Fix #18530 Complement test changes: https://github.com/matrix-org/complement/pull/858 SyTest changes: https://github.com/matrix-org/sytest/pull/1422 --- changelog.d/18680.feature | 1 + .../configuration/config_documentation.md | 3 +- schema/synapse-config.schema.yaml | 6 ++- synapse/config/server.py | 2 +- .../test_federation_out_of_band_membership.py | 5 +-- tests/module_api/test_api.py | 19 ---------- .../client/sliding_sync/test_rooms_invites.py | 8 ++-- tests/rest/client/test_redactions.py | 7 +++- tests/rest/client/test_rooms.py | 38 +++++++++---------- tests/storage/databases/main/test_room.py | 21 ++++++++-- 10 files changed, 57 insertions(+), 53 deletions(-) create mode 100644 changelog.d/18680.feature diff --git a/changelog.d/18680.feature b/changelog.d/18680.feature new file mode 100644 index 0000000000..e4280d4678 --- /dev/null +++ b/changelog.d/18680.feature @@ -0,0 +1 @@ +Change default room version to 11, implementing [MSC4239](https://github.com/matrix-org/matrix-spec-proposals/pull/4239) as part of Matrix v1.14. diff --git a/docs/usage/configuration/config_documentation.md b/docs/usage/configuration/config_documentation.md index 62a4676adb..7f69cf23b1 100644 --- a/docs/usage/configuration/config_documentation.md +++ b/docs/usage/configuration/config_documentation.md @@ -363,8 +363,9 @@ Known room versions are listed [here](https://spec.matrix.org/latest/rooms/#comp For example, for room version 1, `default_room_version` should be set to "1". _Changed in Synapse 1.76:_ the default version room version was increased from [9](https://spec.matrix.org/v1.5/rooms/v9/) to [10](https://spec.matrix.org/v1.5/rooms/v10/). +_Changed in Synapse 1.157:_ the default version room version was increased from [10](https://spec.matrix.org/v1.12/rooms/v10/) to [11](https://spec.matrix.org/v1.12/rooms/v11/). -Defaults to `"10"`. +Defaults to `"11"`. Example configuration: ```yaml diff --git a/schema/synapse-config.schema.yaml b/schema/synapse-config.schema.yaml index ea5bd7c7af..68e9e2676b 100644 --- a/schema/synapse-config.schema.yaml +++ b/schema/synapse-config.schema.yaml @@ -309,7 +309,11 @@ properties: _Changed in Synapse 1.76:_ the default version room version was increased from [9](https://spec.matrix.org/v1.5/rooms/v9/) to [10](https://spec.matrix.org/v1.5/rooms/v10/). - default: "10" + + _Changed in Synapse 1.157:_ the default version room version was increased + from [10](https://spec.matrix.org/v1.12/rooms/v10/) to + [11](https://spec.matrix.org/v1.12/rooms/v11/). + default: "11" examples: - "8" gc_thresholds: diff --git a/synapse/config/server.py b/synapse/config/server.py index 832183f32b..a892d7b1e1 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -176,7 +176,7 @@ DEFAULT_IP_RANGE_BLOCKLIST = [ "fec0::/10", ] -DEFAULT_ROOM_VERSION = "10" +DEFAULT_ROOM_VERSION = "11" # Defaults for the presence state machine timers, in milliseconds. Overridden # by the corresponding options in the `presence` config section. diff --git a/tests/federation/test_federation_out_of_band_membership.py b/tests/federation/test_federation_out_of_band_membership.py index 1707081863..85e221a64a 100644 --- a/tests/federation/test_federation_out_of_band_membership.py +++ b/tests/federation/test_federation_out_of_band_membership.py @@ -189,7 +189,7 @@ class OutOfBandMembershipTests(unittest.FederatingHomeserverTestCase): # Create a remote room room_creator_user_id = f"@remote-user:{self.OTHER_SERVER_NAME}" remote_room_id = f"!remote-room:{self.OTHER_SERVER_NAME}" - room_version = RoomVersions.V10 + room_version = RoomVersions.V11 room_create_event = make_test_event( self.add_hashes_and_signatures_from_other_server( @@ -201,9 +201,6 @@ class OutOfBandMembershipTests(unittest.FederatingHomeserverTestCase): "type": EventTypes.Create, "state_key": "", "content": { - # The `ROOM_CREATOR` field could be removed if we used a room - # version > 10 (in favor of relying on `sender`) - EventContentFields.ROOM_CREATOR: room_creator_user_id, EventContentFields.ROOM_VERSION: room_version.identifier, }, "auth_events": [], diff --git a/tests/module_api/test_api.py b/tests/module_api/test_api.py index 3114675052..b4b14c87b9 100644 --- a/tests/module_api/test_api.py +++ b/tests/module_api/test_api.py @@ -743,7 +743,6 @@ class ModuleApiTestCase(BaseModuleApiTestCase): # Now do the happy path. user_id = self.register_user("user", "password") - access_token = self.login(user_id, "password") room_id, room_alias = self.get_success( self.module_api.create_room( @@ -751,15 +750,6 @@ class ModuleApiTestCase(BaseModuleApiTestCase): ) ) - # Check room creator. - channel = self.make_request( - "GET", - f"/_matrix/client/v3/rooms/{room_id}/state/m.room.create", - access_token=access_token, - ) - self.assertEqual(channel.code, 200, channel.result) - self.assertEqual(channel.json_body["creator"], user_id) - # Check room alias. self.assertEqual(room_alias, f"#foo-bar:{self.module_api.server_name}") @@ -768,15 +758,6 @@ class ModuleApiTestCase(BaseModuleApiTestCase): self.module_api.create_room(user_id=user_id, config={}, ratelimit=False) ) - # Check room creator. - channel = self.make_request( - "GET", - f"/_matrix/client/v3/rooms/{room_id}/state/m.room.create", - access_token=access_token, - ) - self.assertEqual(channel.code, 200, channel.result) - self.assertEqual(channel.json_body["creator"], user_id) - # Check room alias. self.assertIsNone(room_alias) diff --git a/tests/rest/client/sliding_sync/test_rooms_invites.py b/tests/rest/client/sliding_sync/test_rooms_invites.py index 5a463303dd..85628833f5 100644 --- a/tests/rest/client/sliding_sync/test_rooms_invites.py +++ b/tests/rest/client/sliding_sync/test_rooms_invites.py @@ -143,7 +143,7 @@ class SlidingSyncRoomsInvitesTestCase(SlidingSyncBase): response_body["rooms"][room_id1]["invite_state"], [ { - "content": {"creator": user2_id, "room_version": "10"}, + "content": {"room_version": "11"}, "sender": user2_id, "state_key": "", "type": "m.room.create", @@ -253,7 +253,7 @@ class SlidingSyncRoomsInvitesTestCase(SlidingSyncBase): response_body["rooms"][room_id1]["invite_state"], [ { - "content": {"creator": user2_id, "room_version": "10"}, + "content": {"room_version": "11"}, "sender": user2_id, "state_key": "", "type": "m.room.create", @@ -374,7 +374,7 @@ class SlidingSyncRoomsInvitesTestCase(SlidingSyncBase): response_body["rooms"][room_id1]["invite_state"], [ { - "content": {"creator": user2_id, "room_version": "10"}, + "content": {"room_version": "11"}, "sender": user2_id, "state_key": "", "type": "m.room.create", @@ -500,7 +500,7 @@ class SlidingSyncRoomsInvitesTestCase(SlidingSyncBase): response_body["rooms"][room_id1]["invite_state"], [ { - "content": {"creator": user2_id, "room_version": "10"}, + "content": {"room_version": "11"}, "sender": user2_id, "state_key": "", "type": "m.room.create", diff --git a/tests/rest/client/test_redactions.py b/tests/rest/client/test_redactions.py index 997ca5f9ca..c8ab9577a3 100644 --- a/tests/rest/client/test_redactions.py +++ b/tests/rest/client/test_redactions.py @@ -63,7 +63,12 @@ class RedactionsTestCase(HomeserverTestCase): # Create a room self.room_id = self.helper.create_room_as( - self.mod_user_id, tok=self.mod_access_token + self.mod_user_id, + tok=self.mod_access_token, + # FIXME: Using room version 10 here as using later version requires + # https://github.com/element-hq/synapse/pull/19782 + # Remove the override when the above PR is merged. + room_version="10", ) # Invite the other user diff --git a/tests/rest/client/test_rooms.py b/tests/rest/client/test_rooms.py index 90063ccb06..4df2002a86 100644 --- a/tests/rest/client/test_rooms.py +++ b/tests/rest/client/test_rooms.py @@ -4916,7 +4916,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): bad_user = "@remote_bad_user:" + self.OTHER_SERVER_NAME channel = self.make_signed_federation_request( "GET", - f"/_matrix/federation/v1/make_join/{self.room_id}/{bad_user}?ver=10", + f"/_matrix/federation/v1/make_join/{self.room_id}/{bad_user}?ver=11", ) self.assertEqual(channel.code, HTTPStatus.OK, channel.json_body) join_result = channel.json_body @@ -4924,7 +4924,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): join_event_dict = join_result["event"] self.add_hashes_and_signatures_from_other_server( join_event_dict, - RoomVersions.V10, + RoomVersions.V11, ) channel = self.make_signed_federation_request( "PUT", @@ -4959,7 +4959,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): "prev_events": auth_ids, } ), - room_version=RoomVersions.V10, + room_version=RoomVersions.V11, ) self.get_success( @@ -5010,7 +5010,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): "prev_events": auth_ids, } ), - room_version=RoomVersions.V10, + room_version=RoomVersions.V11, ) self.get_success( @@ -5035,7 +5035,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): bad_user = "@remote_bad_user:" + self.OTHER_SERVER_NAME channel = self.make_signed_federation_request( "GET", - f"/_matrix/federation/v1/make_join/{self.room_id}/{bad_user}?ver=10", + f"/_matrix/federation/v1/make_join/{self.room_id}/{bad_user}?ver=11", ) self.assertEqual(channel.code, HTTPStatus.OK, channel.json_body) join_result = channel.json_body @@ -5043,7 +5043,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): join_event_dict = join_result["event"] self.add_hashes_and_signatures_from_other_server( join_event_dict, - RoomVersions.V10, + RoomVersions.V11, ) channel = self.make_signed_federation_request( "PUT", @@ -5078,7 +5078,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): "prev_events": auth_ids, } ), - room_version=RoomVersions.V10, + room_version=RoomVersions.V11, ) self.get_success( @@ -5119,7 +5119,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): # user should be able to join again channel = self.make_signed_federation_request( "GET", - f"/_matrix/federation/v1/make_join/{self.room_id}/{bad_user}?ver=10", + f"/_matrix/federation/v1/make_join/{self.room_id}/{bad_user}?ver=11", ) self.assertEqual(channel.code, HTTPStatus.OK, channel.json_body) join_result = channel.json_body @@ -5167,7 +5167,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): "prev_events": auth_ids, } ), - room_version=RoomVersions.V10, + room_version=RoomVersions.V11, ) self.get_success( @@ -5281,7 +5281,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): bad_user = "@remote_bad_user:" + self.OTHER_SERVER_NAME channel = self.make_signed_federation_request( "GET", - f"/_matrix/federation/v1/make_join/{self.room_id}/{bad_user}?ver=10", + f"/_matrix/federation/v1/make_join/{self.room_id}/{bad_user}?ver=11", ) self.assertEqual(channel.code, HTTPStatus.OK, channel.json_body) join_result = channel.json_body @@ -5289,7 +5289,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): join_event_dict = join_result["event"] self.add_hashes_and_signatures_from_other_server( join_event_dict, - RoomVersions.V10, + RoomVersions.V11, ) channel = self.make_signed_federation_request( "PUT", @@ -5324,7 +5324,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): "prev_events": auth_ids, } ), - room_version=RoomVersions.V10, + room_version=RoomVersions.V11, ) self.get_success( @@ -5375,7 +5375,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): "prev_events": auth_ids, } ), - room_version=RoomVersions.V10, + room_version=RoomVersions.V11, ) self.get_success( @@ -5397,7 +5397,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): bad_user = "@remote_bad_user:" + self.OTHER_SERVER_NAME channel = self.make_signed_federation_request( "GET", - f"/_matrix/federation/v1/make_join/{self.room_id}/{bad_user}?ver=10", + f"/_matrix/federation/v1/make_join/{self.room_id}/{bad_user}?ver=11", ) self.assertEqual(channel.code, HTTPStatus.OK, channel.json_body) join_result = channel.json_body @@ -5405,7 +5405,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): join_event_dict = join_result["event"] self.add_hashes_and_signatures_from_other_server( join_event_dict, - RoomVersions.V10, + RoomVersions.V11, ) channel = self.make_signed_federation_request( "PUT", @@ -5440,7 +5440,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): "prev_events": auth_ids, } ), - room_version=RoomVersions.V10, + room_version=RoomVersions.V11, ) self.get_success( @@ -5476,7 +5476,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): # user re-joins after kick channel = self.make_signed_federation_request( "GET", - f"/_matrix/federation/v1/make_join/{self.room_id}/{bad_user}?ver=10", + f"/_matrix/federation/v1/make_join/{self.room_id}/{bad_user}?ver=11", ) self.assertEqual(channel.code, HTTPStatus.OK, channel.json_body) join_result = channel.json_body @@ -5484,7 +5484,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): join_event_dict = join_result["event"] self.add_hashes_and_signatures_from_other_server( join_event_dict, - RoomVersions.V10, + RoomVersions.V11, ) channel = self.make_signed_federation_request( "PUT", @@ -5524,7 +5524,7 @@ class MSC4293RedactOnBanKickTestCase(unittest.FederatingHomeserverTestCase): "prev_events": auth_ids, } ), - room_version=RoomVersions.V10, + room_version=RoomVersions.V11, ) self.get_success( diff --git a/tests/storage/databases/main/test_room.py b/tests/storage/databases/main/test_room.py index 4ed775ad76..ef6193da98 100644 --- a/tests/storage/databases/main/test_room.py +++ b/tests/storage/databases/main/test_room.py @@ -20,6 +20,7 @@ # import json +from typing import Optional from twisted.internet.testing import MemoryReactor @@ -45,9 +46,13 @@ class RoomBackgroundUpdateStoreTestCase(HomeserverTestCase): self.user_id = self.register_user("foo", "pass") self.token = self.login("foo", "pass") - def _generate_room(self) -> str: + def _generate_room(self, room_version: Optional[str] = None) -> str: """Create a room and return the room ID.""" - return self.helper.create_room_as(self.user_id, tok=self.token) + return self.helper.create_room_as( + self.user_id, + tok=self.token, + room_version=room_version, + ) def run_background_updates(self, update_name: str) -> None: """Insert and run the background update.""" @@ -70,7 +75,17 @@ class RoomBackgroundUpdateStoreTestCase(HomeserverTestCase): """ # Insert a room without the creator - room_id = self._generate_room() + room_id = self._generate_room( + # Create the room as v10, because the `POPULATE_ROOMS_CREATOR_COLUMN` + # background update assumes that the room `creator` field is available + # in the `m.room.create` event content, which was removed in room + # version 11. That assumption is safe as the background update only + # backfills rooms whose `creator` column is unset, which can only be + # rooms created before Synapse started populating the column at room + # creation time (Synapse 1.43, 2021), all of which predate room version + # 11 (2023). + room_version="10" + ) self.get_success( self.store.db_pool.simple_update( table="rooms",