From 53c2aec704a9e05bd0b4c2157590683443987b1d Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Tue, 9 Jul 2024 04:33:48 +0000 Subject: [PATCH] fix ABA Signed-off-by: Jason Volk --- src/api/client_server/membership.rs | 78 ++++++++++++++--------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/src/api/client_server/membership.rs b/src/api/client_server/membership.rs index 3f3d25d5..37e54ce6 100644 --- a/src/api/client_server/membership.rs +++ b/src/api/client_server/membership.rs @@ -188,6 +188,17 @@ pub async fn kick_user_route( ) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); + let mutex_state = Arc::clone( + services() + .globals + .roomid_mutex_state + .write() + .await + .entry(body.room_id.clone()) + .or_default(), + ); + let state_lock = mutex_state.lock().await; + let event: RoomMemberEventContent = serde_json::from_str( services() .rooms @@ -220,17 +231,6 @@ pub async fn kick_user_route( ..event }; - let mutex_state = Arc::clone( - services() - .globals - .roomid_mutex_state - .write() - .await - .entry(body.room_id.clone()) - .or_default(), - ); - let state_lock = mutex_state.lock().await; - services() .rooms .timeline @@ -260,6 +260,17 @@ pub async fn kick_user_route( pub async fn ban_user_route(body: Ruma) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); + let mutex_state = Arc::clone( + services() + .globals + .roomid_mutex_state + .write() + .await + .entry(body.room_id.clone()) + .or_default(), + ); + let state_lock = mutex_state.lock().await; + let event = if let Some(event) = services() .rooms .state_accessor @@ -293,17 +304,6 @@ pub async fn ban_user_route(body: Ruma) -> Result Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); + let mutex_state = Arc::clone( + services() + .globals + .roomid_mutex_state + .write() + .await + .entry(body.room_id.clone()) + .or_default(), + ); + let state_lock = mutex_state.lock().await; + let event: RoomMemberEventContent = serde_json::from_str( services() .rooms @@ -367,17 +378,6 @@ pub async fn unban_user_route( ..event }; - let mutex_state = Arc::clone( - services() - .globals - .roomid_mutex_state - .write() - .await - .entry(body.room_id.clone()) - .or_default(), - ); - let state_lock = mutex_state.lock().await; - services() .rooms .timeline @@ -527,12 +527,6 @@ async fn join_room_by_id_helper( ) -> Result { let sender_user = sender_user.expect("user is authenticated"); - if let Ok(true) = services().rooms.state_cache.is_joined(sender_user, room_id) { - return Ok(join_room_by_id::v3::Response { - room_id: room_id.into(), - }); - } - let mutex_state = Arc::clone( services() .globals @@ -544,6 +538,12 @@ async fn join_room_by_id_helper( ); let state_lock = mutex_state.lock().await; + if let Ok(true) = services().rooms.state_cache.is_joined(sender_user, room_id) { + return Ok(join_room_by_id::v3::Response { + room_id: room_id.into(), + }); + } + // Ask a remote server if we are not participating in this room if !services() .rooms