diff --git a/src/api/client_server/membership.rs b/src/api/client_server/membership.rs index 73e817b6..c60a8fcc 100644 --- a/src/api/client_server/membership.rs +++ b/src/api/client_server/membership.rs @@ -224,6 +224,15 @@ pub async fn invite_user_route(body: Ruma) -> Result) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); + if let Ok(true) = services() + .rooms + .state_cache + .is_left(sender_user, &body.room_id) + { + info!("{} is not in room {}", &body.user_id, &body.room_id); + return Ok(kick_user::v3::Response {}); + } + let mut event: RoomMemberEventContent = serde_json::from_str( services() .rooms @@ -280,6 +289,17 @@ pub async fn kick_user_route(body: Ruma) -> Result) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); + if let Ok(Some(membership_event)) = services() + .rooms + .state_accessor + .get_member(&body.room_id, sender_user) + { + if membership_event.membership == MembershipState::Ban { + info!("{} is already banned in {}", &body.user_id, &body.room_id); + return Ok(ban_user::v3::Response {}); + } + } + let event = services() .rooms .state_accessor @@ -355,6 +375,17 @@ pub async fn ban_user_route(body: Ruma) -> Result) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); + if let Ok(Some(membership_event)) = services() + .rooms + .state_accessor + .get_member(&body.room_id, sender_user) + { + if membership_event.membership != MembershipState::Ban { + info!("{} is already unbanned in {}", &body.user_id, &body.room_id); + return Ok(unban_user::v3::Response {}); + } + } + let mut event: RoomMemberEventContent = serde_json::from_str( services() .rooms @@ -524,6 +555,13 @@ pub(crate) 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) { + info!("{sender_user} is already joined in {room_id}"); + return Ok(join_room_by_id::v3::Response { + room_id: room_id.into(), + }); + } + let mutex_state = Arc::clone( services() .globals