@@ -141,6 +141,15 @@ async def check_state_independent_auth_rules(
141141 Raises:
142142 AuthError if the checks fail
143143 """
144+ # Implementation of https://spec.matrix.org/v1.2/rooms/v9/#authorization-rules
145+
146+ # 1. If type is m.room.create:
147+ if event .type == EventTypes .Create :
148+ _check_create (event )
149+
150+ # 1.5 Otherwise, allow
151+ return
152+
144153 # Check the auth events.
145154 auth_events = await store .get_events (
146155 event .auth_event_ids (),
@@ -180,29 +189,6 @@ async def check_state_independent_auth_rules(
180189
181190 auth_dict [(auth_event .type , auth_event .state_key )] = auth_event_id
182191
183- # Implementation of https://matrix.org/docs/spec/rooms/v1#authorization-rules
184- #
185- # 1. If type is m.room.create:
186- if event .type == EventTypes .Create :
187- # 1b. If the domain of the room_id does not match the domain of the sender,
188- # reject.
189- sender_domain = get_domain_from_id (event .sender )
190- room_id_domain = get_domain_from_id (event .room_id )
191- if room_id_domain != sender_domain :
192- raise AuthError (
193- 403 , "Creation event's room_id domain does not match sender's"
194- )
195-
196- # 1c. If content.room_version is present and is not a recognised version, reject
197- room_version_prop = event .content .get ("room_version" , "1" )
198- if room_version_prop not in KNOWN_ROOM_VERSIONS :
199- raise AuthError (
200- 403 ,
201- "room appears to have unsupported version %s" % (room_version_prop ,),
202- )
203-
204- return
205-
206192 # 3. If event does not have a m.room.create in its auth_events, reject.
207193 creation_event = auth_dict .get ((EventTypes .Create , "" ), None )
208194 if not creation_event :
@@ -324,6 +310,41 @@ def _check_size_limits(event: "EventBase") -> None:
324310 raise EventSizeError ("event too large" )
325311
326312
313+ def _check_create (event : "EventBase" ) -> None :
314+ """Implementation of the auth rules for m.room.create events
315+
316+ Args:
317+ event: The `m.room.create` event to be checked
318+
319+ Raises:
320+ AuthError if the event does not pass the auth rules
321+ """
322+ assert event .type == EventTypes .Create
323+
324+ # 1.1 If it has any previous events, reject.
325+ if event .prev_event_ids ():
326+ raise AuthError (403 , "Create event has prev events" )
327+
328+ # 1.2 If the domain of the room_id does not match the domain of the sender,
329+ # reject.
330+ sender_domain = get_domain_from_id (event .sender )
331+ room_id_domain = get_domain_from_id (event .room_id )
332+ if room_id_domain != sender_domain :
333+ raise AuthError (403 , "Creation event's room_id domain does not match sender's" )
334+
335+ # 1.3 If content.room_version is present and is not a recognised version, reject
336+ room_version_prop = event .content .get ("room_version" , "1" )
337+ if room_version_prop not in KNOWN_ROOM_VERSIONS :
338+ raise AuthError (
339+ 403 ,
340+ "room appears to have unsupported version %s" % (room_version_prop ,),
341+ )
342+
343+ # 1.4 If content has no creator field, reject.
344+ if EventContentFields .ROOM_CREATOR not in event .content :
345+ raise AuthError (403 , "Create event lacks a 'creator' property" )
346+
347+
327348def _can_federate (event : "EventBase" , auth_events : StateMap ["EventBase" ]) -> bool :
328349 creation_event = auth_events .get ((EventTypes .Create , "" ))
329350 # There should always be a creation event, but if not don't federate.
0 commit comments