6464 RoomVersion ,
6565 RoomVersions ,
6666)
67+ from synapse .state import CREATE_KEY
6768from synapse .storage .databases .main .events_worker import EventRedactBehaviour
6869from synapse .types import (
6970 MutableStateMap ,
@@ -308,6 +309,13 @@ def check_state_dependent_auth_rules(
308309
309310 auth_dict = {(e .type , e .state_key ): e for e in auth_events }
310311
312+ # Later code relies on there being a create event e.g _can_federate, _is_membership_change_allowed
313+ # so produce a more intelligible error if we don't have one.
314+ if auth_dict .get (CREATE_KEY ) is None :
315+ raise AuthError (
316+ 403 , f"Event { event .event_id } is missing a create event in auth_events."
317+ )
318+
311319 # additional check for m.federate
312320 creating_domain = get_domain_from_id (event .room_id )
313321 originating_domain = get_domain_from_id (event .sender )
@@ -1010,11 +1018,16 @@ def get_user_power_level(user_id: str, auth_events: StateMap["EventBase"]) -> in
10101018 user_id: user's id to look up in power_levels
10111019 auth_events:
10121020 state in force at this point in the room (or rather, a subset of
1013- it including at least the create event and power levels event.
1021+ it including at least the create event, and possibly a power levels event) .
10141022
10151023 Returns:
10161024 the user's power level in this room.
10171025 """
1026+ create_event = auth_events .get (CREATE_KEY )
1027+ assert create_event is not None , (
1028+ "A create event in the auth events chain is required to calculate user power level correctly,"
1029+ " but was not found. This indicates a bug"
1030+ )
10181031 power_level_event = get_power_level_event (auth_events )
10191032 if power_level_event :
10201033 level = power_level_event .content .get ("users" , {}).get (user_id )
@@ -1028,18 +1041,12 @@ def get_user_power_level(user_id: str, auth_events: StateMap["EventBase"]) -> in
10281041 else :
10291042 # if there is no power levels event, the creator gets 100 and everyone
10301043 # else gets 0.
1031-
1032- # some things which call this don't pass the create event: hack around
1033- # that.
1034- key = (EventTypes .Create , "" )
1035- create_event = auth_events .get (key )
1036- if create_event is not None :
1037- if create_event .room_version .implicit_room_creator :
1038- creator = create_event .sender
1039- else :
1040- creator = create_event .content [EventContentFields .ROOM_CREATOR ]
1041- if creator == user_id :
1042- return 100
1044+ if create_event .room_version .implicit_room_creator :
1045+ creator = create_event .sender
1046+ else :
1047+ creator = create_event .content [EventContentFields .ROOM_CREATOR ]
1048+ if creator == user_id :
1049+ return 100
10431050 return 0
10441051
10451052
0 commit comments