From 7e0e944d01cfe65e14c87dd3431b968d0c3274dd Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Thu, 19 Feb 2026 14:49:04 +0000 Subject: [PATCH] Remove `Event.user_id` It was just an alternate name for `sender`. --- synapse/event_auth.py | 44 ++++++++++++------------ synapse/events/__init__.py | 1 - synapse/handlers/federation.py | 2 +- synapse/handlers/initial_sync.py | 4 +-- synapse/handlers/message.py | 6 ++-- synapse/push/httppusher.py | 2 +- synapse/storage/databases/main/events.py | 2 +- 7 files changed, 29 insertions(+), 32 deletions(-) diff --git a/synapse/event_auth.py b/synapse/event_auth.py index f39f55b472..bf239e660d 100644 --- a/synapse/event_auth.py +++ b/synapse/event_auth.py @@ -358,7 +358,7 @@ def check_state_dependent_auth_rules( # a user is allowed to issue invites. Fixes # https://github.com/vector-im/vector-web/issues/1208 hopefully if event.type == EventTypes.ThirdPartyInvite: - user_level = get_user_power_level(event.user_id, auth_dict) + user_level = get_user_power_level(event.sender, auth_dict) invite_level = get_named_level(auth_dict, "invite", 0) if user_level < invite_level: @@ -409,8 +409,8 @@ def _check_size_limits(event: "EventBase") -> None: # Codepoint size check: Synapse always enforced these limits, so apply # them strictly. - if len(event.user_id) > 255: - raise EventSizeError("'user_id' too large", unpersistable=True) + if len(event.sender) > 255: + raise EventSizeError("'sender' too large", unpersistable=True) if len(event.room_id) > 255: raise EventSizeError("'room_id' too large", unpersistable=True) if event.is_state() and len(event.state_key) > 255: @@ -423,8 +423,8 @@ def _check_size_limits(event: "EventBase") -> None: strict_byte_limits = event.room_version.strict_event_byte_limits_room_versions # Byte size check: if these fail, then be lenient to avoid breaking rooms. - if len(event.user_id.encode("utf-8")) > 255: - raise EventSizeError("'user_id' too large", unpersistable=strict_byte_limits) + if len(event.sender.encode("utf-8")) > 255: + raise EventSizeError("'sender' too large", unpersistable=strict_byte_limits) if len(event.room_id.encode("utf-8")) > 255: raise EventSizeError("'room_id' too large", unpersistable=strict_byte_limits) if event.is_state() and len(event.state_key.encode("utf-8")) > 255: @@ -544,7 +544,7 @@ def _is_membership_change_allowed( raise AuthError(403, "This room has been marked as unfederatable.") # get info about the caller - key = (EventTypes.Member, event.user_id) + key = (EventTypes.Member, event.sender) caller = auth_events.get(key) caller_in_room = caller and caller.membership == Membership.JOIN @@ -569,7 +569,7 @@ def _is_membership_change_allowed( else: join_rule = JoinRules.INVITE - user_level = get_user_power_level(event.user_id, auth_events) + user_level = get_user_power_level(event.sender, auth_events) target_level = get_user_power_level(target_user_id, auth_events) invite_level = get_named_level(auth_events, "invite", 0) @@ -587,7 +587,7 @@ def _is_membership_change_allowed( "membership": membership, "join_rule": join_rule, "target_user_id": target_user_id, - "event.user_id": event.user_id, + "event.sender": event.sender, }, ) @@ -607,14 +607,14 @@ def _is_membership_change_allowed( if ( (caller_invited or caller_knocked) and Membership.LEAVE == membership - and target_user_id == event.user_id + and target_user_id == event.sender ): return if not caller_in_room: # caller isn't joined raise UnstableSpecAuthError( 403, - "%s not in room %s." % (event.user_id, event.room_id), + "%s not in room %s." % (event.sender, event.room_id), errcode=Codes.NOT_JOINED, ) @@ -645,7 +645,7 @@ def _is_membership_change_allowed( # * They are already joined (it's a NOOP). # * The room is public. # * The room is restricted and the user meets the allows rules. - if event.user_id != target_user_id: + if event.sender != target_user_id: raise AuthError(403, "Cannot force another user to join.") elif target_banned: raise AuthError(403, "You are banned from this room") @@ -705,7 +705,7 @@ def _is_membership_change_allowed( "You cannot unban user %s." % (target_user_id,), errcode=Codes.INSUFFICIENT_POWER, ) - elif target_user_id != event.user_id: + elif target_user_id != event.sender: kick_level = get_named_level(auth_events, "kick", 50) if user_level < kick_level or user_level <= target_level: @@ -733,7 +733,7 @@ def _is_membership_change_allowed( or join_rule != JoinRules.KNOCK_RESTRICTED ): raise AuthError(403, "You don't have permission to knock") - elif target_user_id != event.user_id: + elif target_user_id != event.sender: raise AuthError(403, "You cannot knock for other users") elif target_in_room: raise UnstableSpecAuthError( @@ -752,10 +752,10 @@ def _is_membership_change_allowed( def _check_event_sender_in_room( event: "EventBase", auth_events: StateMap["EventBase"] ) -> None: - key = (EventTypes.Member, event.user_id) + key = (EventTypes.Member, event.sender) member_event = auth_events.get(key) - _check_joined_room(member_event, event.user_id, event.room_id) + _check_joined_room(member_event, event.sender, event.room_id) def _check_joined_room( @@ -809,7 +809,7 @@ def _can_send_event(event: "EventBase", auth_events: StateMap["EventBase"]) -> b power_levels_event = get_power_level_event(auth_events) send_level = get_send_level(event.type, state_key, power_levels_event) - user_level = get_user_power_level(event.user_id, auth_events) + user_level = get_user_power_level(event.sender, auth_events) if user_level < send_level: raise UnstableSpecAuthError( @@ -822,7 +822,7 @@ def _can_send_event(event: "EventBase", auth_events: StateMap["EventBase"]) -> b if ( state_key is not None and state_key.startswith("@") - and state_key != event.user_id + and state_key != event.sender ): if event.room_version.msc3757_enabled: try: @@ -841,7 +841,7 @@ def _can_send_event(event: "EventBase", auth_events: StateMap["EventBase"]) -> b ) if ( # sender is owner of the state key - state_key_user_id == event.user_id + state_key_user_id == event.sender # sender has higher PL than the owner of the state key or user_level > get_user_power_level(state_key_user_id, auth_events) ): @@ -868,7 +868,7 @@ def check_redaction( AuthError if the event sender is definitely not allowed to redact the target event. """ - user_level = get_user_power_level(event.user_id, auth_events) + user_level = get_user_power_level(event.sender, auth_events) redact_level = get_named_level(auth_events, "redact", 50) @@ -966,7 +966,7 @@ def _check_power_levels( if not current_state: return - user_level = get_user_power_level(event.user_id, auth_events) + user_level = get_user_power_level(event.sender, auth_events) # Check other levels: levels_to_check: list[tuple[str, str | None]] = [ @@ -1020,7 +1020,7 @@ def _check_power_levels( if new_level == old_level: continue - if dir == "users" and level_to_check != event.user_id: + if dir == "users" and level_to_check != event.sender: if old_level == user_level: raise AuthError( 403, @@ -1137,7 +1137,7 @@ def _verify_third_party_invite( if invite_event.sender != event.sender: return False - if event.user_id != invite_event.user_id: + if event.sender != invite_event.sender: return False if signed["mxid"] != event.state_key: diff --git a/synapse/events/__init__.py b/synapse/events/__init__.py index abce235721..f48d5c4f1d 100644 --- a/synapse/events/__init__.py +++ b/synapse/events/__init__.py @@ -221,7 +221,6 @@ class EventBase(metaclass=abc.ABCMeta): # get_state_key() (and a check for None). state_key: DictProperty[str] = DictProperty("state_key") type: DictProperty[str] = DictProperty("type") - user_id: DictProperty[str] = DictProperty("sender") @property def event_id(self) -> str: diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py index 14805ac80f..1e4ac8c5e6 100644 --- a/synapse/handlers/federation.py +++ b/synapse/handlers/federation.py @@ -1188,7 +1188,7 @@ class FederationHandler: # We should assert some things. # FIXME: Do this in a nicer way assert event.type == EventTypes.Member - assert event.user_id == user_id + assert event.sender == user_id assert event.state_key == user_id assert event.room_id == room_id return origin, event, room_version diff --git a/synapse/handlers/initial_sync.py b/synapse/handlers/initial_sync.py index 9bcc047467..591a0aefd3 100644 --- a/synapse/handlers/initial_sync.py +++ b/synapse/handlers/initial_sync.py @@ -460,9 +460,7 @@ class InitialSyncHandler: if not self.hs.config.server.presence_enabled: return [] - states = await presence_handler.get_states( - [m.user_id for m in room_members] - ) + states = await presence_handler.get_states([m.sender for m in room_members]) return [ { diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py index 319d70cbe8..0aa0a16127 100644 --- a/synapse/handlers/message.py +++ b/synapse/handlers/message.py @@ -899,7 +899,7 @@ class EventCreationHandler: if not prev_event: return None - if prev_event and event.user_id == prev_event.user_id: + if prev_event and event.sender == prev_event.sender: prev_content = encode_canonical_json(prev_event.content) next_content = encode_canonical_json(event.content) if prev_content == next_content: @@ -1545,7 +1545,7 @@ class EventCreationHandler: EventTypes.Message, EventTypes.Encrypted, ]: - await self.store.set_room_participation(event.user_id, event.room_id) + await self.store.set_room_participation(event.sender, event.room_id) if event.internal_metadata.is_out_of_band_membership(): # the only sort of out-of-band-membership events we expect to see here are @@ -2102,7 +2102,7 @@ class EventCreationHandler: "Could not find event %s" % (event.redacts,) ) - if event.user_id != original_event.user_id: + if event.sender != original_event.sender: raise AuthError( 403, "You don't have permission to redact events" ) diff --git a/synapse/push/httppusher.py b/synapse/push/httppusher.py index fdfae234be..ca63a99e3e 100644 --- a/synapse/push/httppusher.py +++ b/synapse/push/httppusher.py @@ -501,7 +501,7 @@ class HttpPusher(Pusher): "event_id": event.event_id, "room_id": event.room_id, "type": event.type, - "sender": event.user_id, + "sender": event.sender, "prio": priority, } if not self.disable_badge_count: diff --git a/synapse/storage/databases/main/events.py b/synapse/storage/databases/main/events.py index 941a5f9f3a..6d3bc15777 100644 --- a/synapse/storage/databases/main/events.py +++ b/synapse/storage/databases/main/events.py @@ -3028,7 +3028,7 @@ class PersistEventsStore: event.event_id, event.internal_metadata.stream_ordering, event.state_key, - event.user_id, + event.sender, event.room_id, event.membership, non_null_str_or_none(event.content.get("displayname")),