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

Commit 861f40a

Browse files
committed
Check whether a user can join a restricted room during a /send_join request.
1 parent 902987c commit 861f40a

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

synapse/handlers/federation.py

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

synapse/handlers/room_member.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ async def ratelimit_invite(
179179

180180
await self._invites_per_user_limiter.ratelimit(requester, invitee_user_id)
181181

182-
async def _can_join_without_invite(
182+
async def can_join_without_invite(
183183
self, state_ids: StateMap[str], room_version: RoomVersion, user_id: str
184184
) -> bool:
185185
"""
@@ -303,7 +303,7 @@ async def _local_membership_update(
303303
if (
304304
newly_joined
305305
and not user_is_invited
306-
and not await self._can_join_without_invite(
306+
and not await self.can_join_without_invite(
307307
prev_state_ids, event.room_version, user_id
308308
)
309309
):

0 commit comments

Comments
 (0)