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

Commit 942c30b

Browse files
authored
Add a new room version for MSC3787's knock+restricted join rule (#12623)
1 parent 24b590d commit 942c30b

6 files changed

Lines changed: 68 additions & 7 deletions

File tree

changelog.d/12623.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add support for [MSC3787: Allowing knocks to restricted rooms](https://github.com/matrix-org/matrix-spec-proposals/pull/3787).

synapse/api/constants.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ class JoinRules:
6565
PRIVATE: Final = "private"
6666
# As defined for MSC3083.
6767
RESTRICTED: Final = "restricted"
68+
# As defined for MSC3787.
69+
KNOCK_RESTRICTED: Final = "knock_restricted"
6870

6971

7072
class RestrictedJoinRuleTypes:

synapse/api/room_versions.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ class RoomVersion:
8181
msc2716_historical: bool
8282
# MSC2716: Adds support for redacting "insertion", "chunk", and "marker" events
8383
msc2716_redactions: bool
84+
# MSC3787: Adds support for a `knock_restricted` join rule, mixing concepts of
85+
# knocks and restricted join rules into the same join condition.
86+
msc3787_knock_restricted_join_rule: bool
8487

8588

8689
class RoomVersions:
@@ -99,6 +102,7 @@ class RoomVersions:
99102
msc2403_knocking=False,
100103
msc2716_historical=False,
101104
msc2716_redactions=False,
105+
msc3787_knock_restricted_join_rule=False,
102106
)
103107
V2 = RoomVersion(
104108
"2",
@@ -115,6 +119,7 @@ class RoomVersions:
115119
msc2403_knocking=False,
116120
msc2716_historical=False,
117121
msc2716_redactions=False,
122+
msc3787_knock_restricted_join_rule=False,
118123
)
119124
V3 = RoomVersion(
120125
"3",
@@ -131,6 +136,7 @@ class RoomVersions:
131136
msc2403_knocking=False,
132137
msc2716_historical=False,
133138
msc2716_redactions=False,
139+
msc3787_knock_restricted_join_rule=False,
134140
)
135141
V4 = RoomVersion(
136142
"4",
@@ -147,6 +153,7 @@ class RoomVersions:
147153
msc2403_knocking=False,
148154
msc2716_historical=False,
149155
msc2716_redactions=False,
156+
msc3787_knock_restricted_join_rule=False,
150157
)
151158
V5 = RoomVersion(
152159
"5",
@@ -163,6 +170,7 @@ class RoomVersions:
163170
msc2403_knocking=False,
164171
msc2716_historical=False,
165172
msc2716_redactions=False,
173+
msc3787_knock_restricted_join_rule=False,
166174
)
167175
V6 = RoomVersion(
168176
"6",
@@ -179,6 +187,7 @@ class RoomVersions:
179187
msc2403_knocking=False,
180188
msc2716_historical=False,
181189
msc2716_redactions=False,
190+
msc3787_knock_restricted_join_rule=False,
182191
)
183192
MSC2176 = RoomVersion(
184193
"org.matrix.msc2176",
@@ -195,6 +204,7 @@ class RoomVersions:
195204
msc2403_knocking=False,
196205
msc2716_historical=False,
197206
msc2716_redactions=False,
207+
msc3787_knock_restricted_join_rule=False,
198208
)
199209
V7 = RoomVersion(
200210
"7",
@@ -211,6 +221,7 @@ class RoomVersions:
211221
msc2403_knocking=True,
212222
msc2716_historical=False,
213223
msc2716_redactions=False,
224+
msc3787_knock_restricted_join_rule=False,
214225
)
215226
V8 = RoomVersion(
216227
"8",
@@ -227,6 +238,7 @@ class RoomVersions:
227238
msc2403_knocking=True,
228239
msc2716_historical=False,
229240
msc2716_redactions=False,
241+
msc3787_knock_restricted_join_rule=False,
230242
)
231243
V9 = RoomVersion(
232244
"9",
@@ -243,6 +255,7 @@ class RoomVersions:
243255
msc2403_knocking=True,
244256
msc2716_historical=False,
245257
msc2716_redactions=False,
258+
msc3787_knock_restricted_join_rule=False,
246259
)
247260
MSC2716v3 = RoomVersion(
248261
"org.matrix.msc2716v3",
@@ -259,6 +272,24 @@ class RoomVersions:
259272
msc2403_knocking=True,
260273
msc2716_historical=True,
261274
msc2716_redactions=True,
275+
msc3787_knock_restricted_join_rule=False,
276+
)
277+
MSC3787 = RoomVersion(
278+
"org.matrix.msc3787",
279+
RoomDisposition.UNSTABLE,
280+
EventFormatVersions.V3,
281+
StateResolutionVersions.V2,
282+
enforce_key_validity=True,
283+
special_case_aliases_auth=False,
284+
strict_canonicaljson=True,
285+
limit_notifications_power_levels=True,
286+
msc2176_redaction_rules=False,
287+
msc3083_join_rules=True,
288+
msc3375_redaction_rules=True,
289+
msc2403_knocking=True,
290+
msc2716_historical=False,
291+
msc2716_redactions=False,
292+
msc3787_knock_restricted_join_rule=True,
262293
)
263294

264295

@@ -276,6 +307,7 @@ class RoomVersions:
276307
RoomVersions.V8,
277308
RoomVersions.V9,
278309
RoomVersions.MSC2716v3,
310+
RoomVersions.MSC3787,
279311
)
280312
}
281313

synapse/event_auth.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,12 @@ def _is_membership_change_allowed(
414414
raise AuthError(403, "You are banned from this room")
415415
elif join_rule == JoinRules.PUBLIC:
416416
pass
417-
elif room_version.msc3083_join_rules and join_rule == JoinRules.RESTRICTED:
417+
elif (
418+
room_version.msc3083_join_rules and join_rule == JoinRules.RESTRICTED
419+
) or (
420+
room_version.msc3787_knock_restricted_join_rule
421+
and join_rule == JoinRules.KNOCK_RESTRICTED
422+
):
418423
# This is the same as public, but the event must contain a reference
419424
# to the server who authorised the join. If the event does not contain
420425
# the proper content it is rejected.
@@ -440,8 +445,13 @@ def _is_membership_change_allowed(
440445
if authorising_user_level < invite_level:
441446
raise AuthError(403, "Join event authorised by invalid server.")
442447

443-
elif join_rule == JoinRules.INVITE or (
444-
room_version.msc2403_knocking and join_rule == JoinRules.KNOCK
448+
elif (
449+
join_rule == JoinRules.INVITE
450+
or (room_version.msc2403_knocking and join_rule == JoinRules.KNOCK)
451+
or (
452+
room_version.msc3787_knock_restricted_join_rule
453+
and join_rule == JoinRules.KNOCK_RESTRICTED
454+
)
445455
):
446456
if not caller_in_room and not caller_invited:
447457
raise AuthError(403, "You are not invited to this room.")
@@ -462,7 +472,10 @@ def _is_membership_change_allowed(
462472
if user_level < ban_level or user_level <= target_level:
463473
raise AuthError(403, "You don't have permission to ban")
464474
elif room_version.msc2403_knocking and Membership.KNOCK == membership:
465-
if join_rule != JoinRules.KNOCK:
475+
if join_rule != JoinRules.KNOCK and (
476+
not room_version.msc3787_knock_restricted_join_rule
477+
or join_rule != JoinRules.KNOCK_RESTRICTED
478+
):
466479
raise AuthError(403, "You don't have permission to knock")
467480
elif target_user_id != event.user_id:
468481
raise AuthError(403, "You cannot knock for other users")

synapse/handlers/event_auth.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,15 @@ async def has_restricted_join_rules(
241241

242242
# If the join rule is not restricted, this doesn't apply.
243243
join_rules_event = await self._store.get_event(join_rules_event_id)
244-
return join_rules_event.content.get("join_rule") == JoinRules.RESTRICTED
244+
content_join_rule = join_rules_event.content.get("join_rule")
245+
if content_join_rule == JoinRules.RESTRICTED:
246+
return True
247+
248+
# also check for MSC3787 behaviour
249+
if room_version.msc3787_knock_restricted_join_rule:
250+
return content_join_rule == JoinRules.KNOCK_RESTRICTED
251+
252+
return False
245253

246254
async def get_rooms_that_allow_join(
247255
self, state_ids: StateMap[str]

synapse/handlers/room_summary.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -562,8 +562,13 @@ async def _is_local_room_accessible(
562562
if join_rules_event_id:
563563
join_rules_event = await self._store.get_event(join_rules_event_id)
564564
join_rule = join_rules_event.content.get("join_rule")
565-
if join_rule == JoinRules.PUBLIC or (
566-
room_version.msc2403_knocking and join_rule == JoinRules.KNOCK
565+
if (
566+
join_rule == JoinRules.PUBLIC
567+
or (room_version.msc2403_knocking and join_rule == JoinRules.KNOCK)
568+
or (
569+
room_version.msc3787_knock_restricted_join_rule
570+
and join_rule == JoinRules.KNOCK_RESTRICTED
571+
)
567572
):
568573
return True
569574

0 commit comments

Comments
 (0)