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

Commit ad5761b

Browse files
authored
Add support for room version 10 (#13220)
1 parent 2341032 commit ad5761b

File tree

4 files changed

+100
-1
lines changed

4 files changed

+100
-1
lines changed

changelog.d/13220.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add support for room version 10.

synapse/api/room_versions.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ class RoomVersion:
8484
# MSC3787: Adds support for a `knock_restricted` join rule, mixing concepts of
8585
# knocks and restricted join rules into the same join condition.
8686
msc3787_knock_restricted_join_rule: bool
87+
# MSC3667: Enforce integer power levels
88+
msc3667_int_only_power_levels: bool
8789

8890

8991
class RoomVersions:
@@ -103,6 +105,7 @@ class RoomVersions:
103105
msc2716_historical=False,
104106
msc2716_redactions=False,
105107
msc3787_knock_restricted_join_rule=False,
108+
msc3667_int_only_power_levels=False,
106109
)
107110
V2 = RoomVersion(
108111
"2",
@@ -120,6 +123,7 @@ class RoomVersions:
120123
msc2716_historical=False,
121124
msc2716_redactions=False,
122125
msc3787_knock_restricted_join_rule=False,
126+
msc3667_int_only_power_levels=False,
123127
)
124128
V3 = RoomVersion(
125129
"3",
@@ -137,6 +141,7 @@ class RoomVersions:
137141
msc2716_historical=False,
138142
msc2716_redactions=False,
139143
msc3787_knock_restricted_join_rule=False,
144+
msc3667_int_only_power_levels=False,
140145
)
141146
V4 = RoomVersion(
142147
"4",
@@ -154,6 +159,7 @@ class RoomVersions:
154159
msc2716_historical=False,
155160
msc2716_redactions=False,
156161
msc3787_knock_restricted_join_rule=False,
162+
msc3667_int_only_power_levels=False,
157163
)
158164
V5 = RoomVersion(
159165
"5",
@@ -171,6 +177,7 @@ class RoomVersions:
171177
msc2716_historical=False,
172178
msc2716_redactions=False,
173179
msc3787_knock_restricted_join_rule=False,
180+
msc3667_int_only_power_levels=False,
174181
)
175182
V6 = RoomVersion(
176183
"6",
@@ -188,6 +195,7 @@ class RoomVersions:
188195
msc2716_historical=False,
189196
msc2716_redactions=False,
190197
msc3787_knock_restricted_join_rule=False,
198+
msc3667_int_only_power_levels=False,
191199
)
192200
MSC2176 = RoomVersion(
193201
"org.matrix.msc2176",
@@ -205,6 +213,7 @@ class RoomVersions:
205213
msc2716_historical=False,
206214
msc2716_redactions=False,
207215
msc3787_knock_restricted_join_rule=False,
216+
msc3667_int_only_power_levels=False,
208217
)
209218
V7 = RoomVersion(
210219
"7",
@@ -222,6 +231,7 @@ class RoomVersions:
222231
msc2716_historical=False,
223232
msc2716_redactions=False,
224233
msc3787_knock_restricted_join_rule=False,
234+
msc3667_int_only_power_levels=False,
225235
)
226236
V8 = RoomVersion(
227237
"8",
@@ -239,6 +249,7 @@ class RoomVersions:
239249
msc2716_historical=False,
240250
msc2716_redactions=False,
241251
msc3787_knock_restricted_join_rule=False,
252+
msc3667_int_only_power_levels=False,
242253
)
243254
V9 = RoomVersion(
244255
"9",
@@ -256,6 +267,7 @@ class RoomVersions:
256267
msc2716_historical=False,
257268
msc2716_redactions=False,
258269
msc3787_knock_restricted_join_rule=False,
270+
msc3667_int_only_power_levels=False,
259271
)
260272
MSC2716v3 = RoomVersion(
261273
"org.matrix.msc2716v3",
@@ -273,6 +285,7 @@ class RoomVersions:
273285
msc2716_historical=True,
274286
msc2716_redactions=True,
275287
msc3787_knock_restricted_join_rule=False,
288+
msc3667_int_only_power_levels=False,
276289
)
277290
MSC3787 = RoomVersion(
278291
"org.matrix.msc3787",
@@ -290,6 +303,25 @@ class RoomVersions:
290303
msc2716_historical=False,
291304
msc2716_redactions=False,
292305
msc3787_knock_restricted_join_rule=True,
306+
msc3667_int_only_power_levels=False,
307+
)
308+
V10 = RoomVersion(
309+
"10",
310+
RoomDisposition.STABLE,
311+
EventFormatVersions.V3,
312+
StateResolutionVersions.V2,
313+
enforce_key_validity=True,
314+
special_case_aliases_auth=False,
315+
strict_canonicaljson=True,
316+
limit_notifications_power_levels=True,
317+
msc2176_redaction_rules=False,
318+
msc3083_join_rules=True,
319+
msc3375_redaction_rules=True,
320+
msc2403_knocking=True,
321+
msc2716_historical=False,
322+
msc2716_redactions=False,
323+
msc3787_knock_restricted_join_rule=True,
324+
msc3667_int_only_power_levels=True,
293325
)
294326

295327

@@ -308,6 +340,7 @@ class RoomVersions:
308340
RoomVersions.V9,
309341
RoomVersions.MSC2716v3,
310342
RoomVersions.MSC3787,
343+
RoomVersions.V10,
311344
)
312345
}
313346

synapse/event_auth.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,32 @@ def _check_power_levels(
740740
except Exception:
741741
raise SynapseError(400, "Not a valid power level: %s" % (v,))
742742

743+
# Reject events with stringy power levels if required by room version
744+
if (
745+
event.type == EventTypes.PowerLevels
746+
and room_version_obj.msc3667_int_only_power_levels
747+
):
748+
for k, v in event.content.items():
749+
if k in {
750+
"users_default",
751+
"events_default",
752+
"state_default",
753+
"ban",
754+
"redact",
755+
"kick",
756+
"invite",
757+
}:
758+
if not isinstance(v, int):
759+
raise SynapseError(400, f"{v!r} must be an integer.")
760+
if k in {"events", "notifications", "users"}:
761+
if not isinstance(v, dict) or not all(
762+
isinstance(v, int) for v in v.values()
763+
):
764+
raise SynapseError(
765+
400,
766+
f"{v!r} must be a dict wherein all the values are integers.",
767+
)
768+
743769
key = (event.type, event.state_key)
744770
current_state = auth_events.get(key)
745771

tests/test_event_auth.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
from synapse import event_auth
2121
from synapse.api.constants import EventContentFields
22-
from synapse.api.errors import AuthError
22+
from synapse.api.errors import AuthError, SynapseError
2323
from synapse.api.room_versions import EventFormatVersions, RoomVersion, RoomVersions
2424
from synapse.events import EventBase, make_event_from_dict
2525
from synapse.storage.databases.main.events_worker import EventRedactBehaviour
@@ -689,6 +689,45 @@ def test_join_rules_msc3083_restricted(self) -> None:
689689
auth_events.values(),
690690
)
691691

692+
def test_room_v10_rejects_string_power_levels(self) -> None:
693+
pl_event_content = {"users_default": "42"}
694+
pl_event = make_event_from_dict(
695+
{
696+
"room_id": TEST_ROOM_ID,
697+
**_maybe_get_event_id_dict_for_room_version(RoomVersions.V10),
698+
"type": "m.room.power_levels",
699+
"sender": "@test:test.com",
700+
"state_key": "",
701+
"content": pl_event_content,
702+
"signatures": {"test.com": {"ed25519:0": "some9signature"}},
703+
},
704+
room_version=RoomVersions.V10,
705+
)
706+
707+
pl_event2_content = {"events": {"m.room.name": "42", "m.room.power_levels": 42}}
708+
pl_event2 = make_event_from_dict(
709+
{
710+
"room_id": TEST_ROOM_ID,
711+
**_maybe_get_event_id_dict_for_room_version(RoomVersions.V10),
712+
"type": "m.room.power_levels",
713+
"sender": "@test:test.com",
714+
"state_key": "",
715+
"content": pl_event2_content,
716+
"signatures": {"test.com": {"ed25519:0": "some9signature"}},
717+
},
718+
room_version=RoomVersions.V10,
719+
)
720+
721+
with self.assertRaises(SynapseError):
722+
event_auth._check_power_levels(
723+
pl_event.room_version, pl_event, {("fake_type", "fake_key"): pl_event2}
724+
)
725+
726+
with self.assertRaises(SynapseError):
727+
event_auth._check_power_levels(
728+
pl_event.room_version, pl_event2, {("fake_type", "fake_key"): pl_event}
729+
)
730+
692731

693732
# helpers for making events
694733
TEST_DOMAIN = "example.com"

0 commit comments

Comments
 (0)