Skip to main content

tuwunel_api/client/membership/
knock.rs

1use axum::extract::State;
2use ruma::api::client::knock::knock_room;
3use tuwunel_core::Result;
4
5use super::banned_room_check;
6use crate::{ClientIp, Ruma};
7
8/// # `POST /_matrix/client/*/knock/{roomIdOrAlias}`
9///
10/// Tries to knock the room to ask permission to join for the sender user.
11#[tracing::instrument(skip_all, fields(%client), name = "knock")]
12pub(crate) async fn knock_room_route(
13	State(services): State<crate::State>,
14	ClientIp(client): ClientIp,
15	body: Ruma<knock_room::v3::Request>,
16) -> Result<knock_room::v3::Response> {
17	let sender_user = body.sender_user();
18
19	let (room_id, servers) = services
20		.alias
21		.maybe_resolve_with_servers(&body.room_id_or_alias, Some(&body.via))
22		.await?;
23
24	banned_room_check(&services, sender_user, &room_id, Some(&body.room_id_or_alias), client)
25		.await?;
26
27	let state_lock = services.state.mutex.lock(&room_id).await;
28
29	services
30		.membership
31		.knock(
32			sender_user,
33			&room_id,
34			Some(&body.room_id_or_alias),
35			body.reason.clone(),
36			&servers,
37			&state_lock,
38		)
39		.await?;
40
41	drop(state_lock);
42
43	Ok(knock_room::v3::Response::new(room_id.clone()))
44}