tuwunel_api/client/admin/mas/
is_localpart_available.rs1use 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
9pub(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}