Skip to main content

tuwunel_api/client/admin/mas/
is_localpart_available.rs

1use axum::extract::State;
2use ruma::UserId;
3use synapse_admin_api::mas::is_localpart_available::{Request, Response};
4use tuwunel_core::{Err, Result, err};
5
6use super::Mas;
7use crate::Ruma;
8
9/// # `GET /_synapse/mas/is_localpart_available`
10pub(crate) async fn is_localpart_available_route(
11	_mas: Mas,
12	State(services): State<crate::State>,
13	body: Ruma<Request>,
14) -> Result<Response> {
15	if services
16		.config
17		.forbidden_usernames
18		.is_match(&body.localpart)
19	{
20		return Err!(Request(InvalidUsername("Localpart is forbidden")));
21	}
22
23	let user_id = UserId::parse_with_server_name(&body.localpart, services.globals.server_name())
24		.map_err(|_| err!(Request(InvalidUsername("Localpart is not a valid username"))))?;
25
26	if user_id.validate_strict().is_err() {
27		return Err!(Request(InvalidUsername("Localpart contains disallowed characters")));
28	}
29
30	if services.users.exists(&user_id).await {
31		return Err!(Request(UserInUse("Localpart is not available")));
32	}
33
34	if services
35		.appservice
36		.is_exclusive_user_id(&user_id)
37		.await
38	{
39		return Err!(Request(Exclusive("Localpart is reserved by an appservice")));
40	}
41
42	Ok(Response::new())
43}