From 1c3890476a43c818a8d36967a02d9efad577eca1 Mon Sep 17 00:00:00 2001 From: Jonathan Sutton Date: Wed, 18 Mar 2026 01:41:51 -0500 Subject: [PATCH] fix(room_member): Strip join_authorized_via_users_server (#1542) Actually implemented fix. Modified json if user was already a member. Signed-off-by: Jonathan Sutton --- src/api/client/state.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/api/client/state.rs b/src/api/client/state.rs index 460521d2d..04fde5763 100644 --- a/src/api/client/state.rs +++ b/src/api/client/state.rs @@ -194,6 +194,7 @@ async fn send_state_event_for_key_helper( state_key: &str, timestamp: Option, ) -> Result { + let json: &mut Raw = &mut json.clone(); allowed_to_send_state_event(services, room_id, event_type, state_key, json).await?; let state_lock = services.rooms.state.mutex.lock(room_id).await; let event_id = services @@ -221,7 +222,7 @@ async fn allowed_to_send_state_event( room_id: &RoomId, event_type: &StateEventType, state_key: &str, - json: &Raw, + json: &mut Raw, ) -> Result { match event_type { | StateEventType::RoomCreate => { @@ -366,22 +367,26 @@ async fn allowed_to_send_state_event( } }, | StateEventType::RoomMember => match json.deserialize_as::() { - | Ok(mut membership_content) => { + | Ok(membership_content) => { let Ok(state_key) = UserId::parse(state_key) else { return Err!(Request(BadJson( "Membership event has invalid or non-existent state key" ))); }; - // Moved the check for if user is already joined and then stripped the Option - // Unsure if this actually fixes it + // join_authorized_via_users_server must be thrown away, if user is already a + // member of the room. if services .rooms .state_cache .is_joined(state_key, room_id) .await { - membership_content.join_authorized_via_users_server.take(); + let mut content: RoomMemberEventContent = membership_content.clone(); + content.join_authorized_via_users_server = None; + *json = Raw::::from_json_string( + serde_json::to_string(&content)?, + )?; } else if let Some(authorising_user) = membership_content.join_authorized_via_users_server {