Skip to main content

tuwunel_service/membership/
unban.rs

1use ruma::{
2	RoomId, UserId,
3	events::room::member::{MembershipState, RoomMemberEventContent},
4};
5use tuwunel_core::{Err, Result, implement, pdu::PduBuilder};
6
7use super::Service;
8use crate::rooms::timeline::RoomMutexGuard;
9
10#[implement(Service)]
11#[tracing::instrument(
12	name = "remote",
13    level = "debug",
14    skip_all,
15    fields(%sender_user, %room_id, %user_id),
16)]
17pub async fn unban(
18	&self,
19	room_id: &RoomId,
20	user_id: &UserId,
21	reason: Option<&String>,
22	sender_user: &UserId,
23	state_lock: &RoomMutexGuard,
24) -> Result {
25	let current_member_content = self
26		.services
27		.state_accessor
28		.get_member(room_id, user_id)
29		.await
30		.unwrap_or_else(|_| RoomMemberEventContent::new(MembershipState::Leave));
31
32	if current_member_content.membership != MembershipState::Ban {
33		return Err!(Request(Forbidden(
34			"Cannot unban a user who is not banned (current membership: {})",
35			current_member_content.membership
36		)));
37	}
38
39	self.services
40		.timeline
41		.build_and_append_pdu(
42			PduBuilder::state(user_id.to_string(), &RoomMemberEventContent {
43				membership: MembershipState::Leave,
44				reason: reason.cloned(),
45				join_authorized_via_users_server: None,
46				third_party_invite: None,
47				is_direct: None,
48				..current_member_content
49			}),
50			sender_user,
51			room_id,
52			state_lock,
53		)
54		.await?;
55
56	Ok(())
57}