tuwunel_admin/user/
create_user.rs1use tuwunel_core::{Err, Result, utils};
2use tuwunel_service::users::Register;
3
4use super::AUTO_GEN_PASSWORD_LENGTH;
5use crate::{admin_command, utils::parse_local_user_id};
6
7#[admin_command]
8pub(super) async fn create_user(&self, username: String, password: Option<String>) -> Result {
9 let user_id = parse_local_user_id(self.services, &username)?;
11
12 if let Err(e) = user_id.validate_strict()
13 && self.services.config.emergency_password.is_none()
14 {
15 return Err!("Username {user_id} contains disallowed characters or spaces: {e}");
16 }
17
18 if self.services.users.exists(&user_id).await {
19 return Err!("User {user_id} already exists");
20 }
21
22 let password = password.unwrap_or_else(|| utils::random_string(AUTO_GEN_PASSWORD_LENGTH));
23
24 self.services
25 .users
26 .full_register(Register {
27 user_id: Some(&user_id),
28 password: Some(&password),
29 grant_first_user_admin: true,
30 ..Default::default()
31 })
32 .await?;
33
34 write!(self, "Created user with user_id: {user_id} and password: `{password}`").await
35}