From 88b59eb053edc74c6c71c299b241c49a4e889df5 Mon Sep 17 00:00:00 2001 From: Ginger Date: Fri, 1 May 2026 13:15:17 -0400 Subject: [PATCH] fix: Include target user's membership when building stripped state --- src/api/client/membership/invite.rs | 6 +++++- src/api/server/send_knock.rs | 2 +- src/service/migrations.rs | 2 +- src/service/rooms/state/mod.rs | 12 +++++++++--- src/service/rooms/state_cache/update.rs | 6 +++++- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/api/client/membership/invite.rs b/src/api/client/membership/invite.rs index 82be4f85b..3f7acf6b5 100644 --- a/src/api/client/membership/invite.rs +++ b/src/api/client/membership/invite.rs @@ -163,7 +163,11 @@ pub(crate) async fn invite_helper( ) .await?; - let invite_room_state = services.rooms.state.summary_stripped(&pdu, room_id).await; + let invite_room_state = services + .rooms + .state + .summary_stripped(&pdu, room_id, recipient_user) + .await; drop(state_lock); diff --git a/src/api/server/send_knock.rs b/src/api/server/send_knock.rs index 8d55e0748..29d9a1e31 100644 --- a/src/api/server/send_knock.rs +++ b/src/api/server/send_knock.rs @@ -183,7 +183,7 @@ pub(crate) async fn create_knock_event_v1_route( let knock_room_state = services .rooms .state - .summary_stripped(&pdu, &body.room_id) + .summary_stripped(&pdu, &body.room_id, &sender) .await; Ok(create_knock_event::v1::Response::new(knock_room_state)) diff --git a/src/service/migrations.rs b/src/service/migrations.rs index 189afb585..bd087289b 100644 --- a/src/service/migrations.rs +++ b/src/service/migrations.rs @@ -802,7 +802,7 @@ async fn fix_local_invite_state(services: &Services) -> Result { && services.globals.user_is_local(&membership_event.sender) { // build and save stripped state for their invite in the database - let stripped_state = services.rooms.state.summary_stripped(&membership_event, &room_id).await; + let stripped_state = services.rooms.state.summary_stripped(&membership_event, &room_id, &user_id).await; userroomid_invitestate.put((&user_id, &room_id), Json(stripped_state)); fixed = fixed.saturating_add(1); } diff --git a/src/service/rooms/state/mod.rs b/src/service/rooms/state/mod.rs index 32ad62073..ccc4be87e 100644 --- a/src/service/rooms/state/mod.rs +++ b/src/service/rooms/state/mod.rs @@ -300,12 +300,13 @@ impl Service { &self, event: &'a E, room_id: &RoomId, + target_user: &UserId, ) -> Vec where E: Event + Send + Sync, &'a E: Event + Send, { - let cells = [ + let mut state_events = [ (&StateEventType::RoomCreate, ""), (&StateEventType::RoomJoinRules, ""), (&StateEventType::RoomCanonicalAlias, ""), @@ -314,9 +315,14 @@ impl Service { (&StateEventType::RoomMember, event.sender().as_str()), // Add recommended events (&StateEventType::RoomEncryption, ""), (&StateEventType::RoomTopic, ""), - ]; + ] + .to_vec(); - let fetches = cells.into_iter().map(|(event_type, state_key)| { + if target_user != event.sender() { + state_events.push((&StateEventType::RoomMember, target_user.as_str())); + } + + let fetches = state_events.into_iter().map(|(event_type, state_key)| { self.services .state_accessor .room_state_get(room_id, event_type, state_key) diff --git a/src/service/rooms/state_cache/update.rs b/src/service/rooms/state_cache/update.rs index fafcd32bd..1e3589811 100644 --- a/src/service/rooms/state_cache/update.rs +++ b/src/service/rooms/state_cache/update.rs @@ -119,7 +119,11 @@ pub async fn update_membership( self.mark_as_joined(user_id, room_id); }, | MembershipState::Invite => { - let last_state = self.services.state.summary_stripped(pdu, room_id).await; + let last_state = self + .services + .state + .summary_stripped(pdu, room_id, user_id) + .await; self.mark_as_invited(user_id, room_id, pdu.sender(), last_state, None) .await?;