Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/19732.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Refactor `get_user_which_could_invite` logic to reuse `get_users_which_can_issue_invite`. Contributed by Noah Markert.
62 changes: 14 additions & 48 deletions synapse/handlers/event_auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@

from synapse import event_auth
from synapse.api.constants import (
CREATOR_POWER_LEVEL,
EventContentFields,
EventTypes,
JoinRules,
Membership,
Expand All @@ -38,6 +36,7 @@
)
from synapse.events import EventBase
from synapse.events.builder import EventBuilder
from synapse.handlers.room_member import get_users_which_can_issue_invite
from synapse.types import StateMap, StrCollection

if TYPE_CHECKING:
Expand Down Expand Up @@ -143,53 +142,20 @@ async def get_user_which_could_invite(
Raises:
SynapseError if no appropriate user is found.
"""
create_event_id = current_state_ids[(EventTypes.Create, "")]
create_event = await self._store.get_event(create_event_id)
power_level_event_id = current_state_ids.get((EventTypes.PowerLevels, ""))
invite_level = 0
users_default_level = 0
if power_level_event_id:
power_level_event = await self._store.get_event(power_level_event_id)
invite_level = power_level_event.content.get("invite", invite_level)
users_default_level = power_level_event.content.get(
"users_default", users_default_level
)
users = power_level_event.content.get("users", {})
else:
users = {}

# Find the user with the highest power level (only interested in local
# users).
user_power_level = 0
chosen_user = None
local_users_in_room = await self._store.get_local_users_in_room(room_id)
if create_event.room_version.msc4289_creator_power_enabled:
creators = set(
create_event.content.get(EventContentFields.ADDITIONAL_CREATORS, [])
)
creators.add(create_event.sender)
local_creators = creators.intersection(set(local_users_in_room))
if len(local_creators) > 0:
chosen_user = local_creators.pop() # random creator
user_power_level = CREATOR_POWER_LEVEL
if chosen_user is None:
chosen_user = max(
local_users_in_room,
key=lambda user: users.get(user, users_default_level),
default=None,
)
# Return the chosen if they can issue invites.
if chosen_user:
user_power_level = users.get(chosen_user, users_default_level)

if chosen_user and user_power_level >= invite_level:
logger.debug(
"Found a user who can issue invites %s with power level %d >= invite level %d",
chosen_user,
user_power_level,
invite_level,
)
return chosen_user
current_state = await self._store.get_events(current_state_ids.values())
auth_events = {
state_key: event
for state_key, event_id in current_state_ids.items()
if (event := current_state.get(event_id)) is not None
}

users_which_can_invite = get_users_which_can_issue_invite(auth_events)
local_users_which_can_invite = set(users_which_can_invite).intersection(
local_users_in_room
)
if local_users_which_can_invite:
return local_users_which_can_invite.pop()

# No user was found.
raise SynapseError(
Expand Down
Loading