diff --git a/src/admin/user/commands.rs b/src/admin/user/commands.rs index 9b4eea69..9d503605 100644 --- a/src/admin/user/commands.rs +++ b/src/admin/user/commands.rs @@ -17,7 +17,7 @@ use tuwunel_core::{ matrix::{Event, pdu::PduBuilder}, utils::{self, ReadyExt}, }; -use tuwunel_service::Services; +use tuwunel_service::{Services, users::Register}; use crate::{ admin_command, get_room_info, @@ -63,7 +63,12 @@ pub(super) async fn create_user(&self, username: String, password: Option, diff --git a/src/service/users/register.rs b/src/service/users/register.rs index c8ce6e5f..5ba76cd0 100644 --- a/src/service/users/register.rs +++ b/src/service/users/register.rs @@ -6,19 +6,45 @@ use tuwunel_core::{Err, Result, error, implement, info, is_equal_to, warn}; use crate::appservice::RegistrationInfo; +#[derive(Debug, Default)] +pub struct Register<'a> { + pub user_id: Option<&'a UserId>, + pub username: Option<&'a str>, + pub password: Option<&'a str>, + pub origin: Option<&'a str>, + pub appservice_info: Option<&'a RegistrationInfo>, + pub is_guest: bool, + pub grant_first_user_admin: bool, +} + /// Fully register a local user /// /// Returns a device id and access token for the registered user #[implement(super::Service)] +#[tracing::instrument(level = "info", skip(self))] pub async fn full_register( &self, - user_id: &UserId, - password: Option<&str>, - origin: Option<&str>, - appservice_info: Option<&RegistrationInfo>, - is_guest: bool, - grant_admin: bool, + Register { + username, + user_id, + password, + origin, + appservice_info, + is_guest, + grant_first_user_admin, + }: Register<'_>, ) -> Result { + let ref user_id = user_id + .map(ToOwned::to_owned) + .map(Ok) + .or_else(|| { + username.map(|username| { + UserId::parse_with_server_name(username, self.services.globals.server_name()) + }) + }) + .transpose()? + .expect("Caller failed to supply either user_id or username parameter"); + if !self.services.globals.user_is_local(user_id) { return Err!("Cannot register remote user"); } @@ -80,7 +106,7 @@ pub async fn full_register( // users // Note: the server user is generated first if !is_guest - && grant_admin + && grant_first_user_admin && self.services.config.grant_admin_to_first_user && let Ok(admin_room) = self.services.admin.get_admin_room().await && self