@@ -1667,16 +1667,52 @@ async def on_send_join_request(self, origin: str, pdu: EventBase) -> JsonDict:
16671667 # would introduce the danger of backwards-compatibility problems.
16681668 event .internal_metadata .send_on_behalf_of = origin
16691669
1670- context = await self ._handle_new_event (origin , event )
1670+ # Calculate the event context.
1671+ context = await self ._prep_event (
1672+ origin , event , state = None , auth_events = None , backfilled = False
1673+ )
1674+
1675+ # Get the current state at the to-be created event.
1676+ prev_state_ids = await context .get_prev_state_ids ()
1677+
1678+ # Check if the user is already in the room or invited to the room.
1679+ user_id = event .state_key
1680+ prev_member_event_id = prev_state_ids .get ((EventTypes .Member , user_id ), None )
1681+ newly_joined = True
1682+ is_invite = False
1683+ if prev_member_event_id :
1684+ prev_member_event = await self .store .get_event (prev_member_event_id )
1685+ newly_joined = prev_member_event .membership != Membership .JOIN
1686+ is_invite = prev_member_event .membership == Membership .INVITE
1687+
1688+ # We retrieve the room member handler here as to not cause a cyclic dependency
1689+ member_handler = self .hs .get_room_member_handler ()
1690+
1691+ # If the member is not already in the room, and not invited, check if
1692+ # they should be allowed access via membership in a space.
1693+ if (
1694+ newly_joined
1695+ and not is_invite
1696+ and not await member_handler .can_join_without_invite (
1697+ prev_state_ids ,
1698+ event .room_version ,
1699+ user_id ,
1700+ )
1701+ ):
1702+ raise SynapseError (
1703+ 400 ,
1704+ "You do not belong to any of the required spaces to join this room." ,
1705+ )
1706+
1707+ # Persist the event.
1708+ await self ._handle_new_event (origin , event , context )
16711709
16721710 logger .debug (
16731711 "on_send_join_request: After _handle_new_event: %s, sigs: %s" ,
16741712 event .event_id ,
16751713 event .signatures ,
16761714 )
16771715
1678- prev_state_ids = await context .get_prev_state_ids ()
1679-
16801716 state_ids = list (prev_state_ids .values ())
16811717 auth_chain = await self .store .get_auth_chain (event .room_id , state_ids )
16821718
0 commit comments