fix: Include target user's membership when building stripped state

This commit is contained in:
Ginger
2026-05-01 13:15:17 -04:00
parent 4a99de0d28
commit 88b59eb053
5 changed files with 21 additions and 7 deletions
+5 -1
View File
@@ -163,7 +163,11 @@ pub(crate) async fn invite_helper(
) )
.await?; .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); drop(state_lock);
+1 -1
View File
@@ -183,7 +183,7 @@ pub(crate) async fn create_knock_event_v1_route(
let knock_room_state = services let knock_room_state = services
.rooms .rooms
.state .state
.summary_stripped(&pdu, &body.room_id) .summary_stripped(&pdu, &body.room_id, &sender)
.await; .await;
Ok(create_knock_event::v1::Response::new(knock_room_state)) Ok(create_knock_event::v1::Response::new(knock_room_state))
+1 -1
View File
@@ -802,7 +802,7 @@ async fn fix_local_invite_state(services: &Services) -> Result {
&& services.globals.user_is_local(&membership_event.sender) { && services.globals.user_is_local(&membership_event.sender) {
// build and save stripped state for their invite in the database // 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)); userroomid_invitestate.put((&user_id, &room_id), Json(stripped_state));
fixed = fixed.saturating_add(1); fixed = fixed.saturating_add(1);
} }
+9 -3
View File
@@ -300,12 +300,13 @@ impl Service {
&self, &self,
event: &'a E, event: &'a E,
room_id: &RoomId, room_id: &RoomId,
target_user: &UserId,
) -> Vec<RawStrippedState> ) -> Vec<RawStrippedState>
where where
E: Event + Send + Sync, E: Event + Send + Sync,
&'a E: Event + Send, &'a E: Event + Send,
{ {
let cells = [ let mut state_events = [
(&StateEventType::RoomCreate, ""), (&StateEventType::RoomCreate, ""),
(&StateEventType::RoomJoinRules, ""), (&StateEventType::RoomJoinRules, ""),
(&StateEventType::RoomCanonicalAlias, ""), (&StateEventType::RoomCanonicalAlias, ""),
@@ -314,9 +315,14 @@ impl Service {
(&StateEventType::RoomMember, event.sender().as_str()), // Add recommended events (&StateEventType::RoomMember, event.sender().as_str()), // Add recommended events
(&StateEventType::RoomEncryption, ""), (&StateEventType::RoomEncryption, ""),
(&StateEventType::RoomTopic, ""), (&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 self.services
.state_accessor .state_accessor
.room_state_get(room_id, event_type, state_key) .room_state_get(room_id, event_type, state_key)
+5 -1
View File
@@ -119,7 +119,11 @@ pub async fn update_membership(
self.mark_as_joined(user_id, room_id); self.mark_as_joined(user_id, room_id);
}, },
| MembershipState::Invite => { | 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) self.mark_as_invited(user_id, room_id, pdu.sender(), last_state, None)
.await?; .await?;