|
|
|
@ -6,6 +6,7 @@ use std::{
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
use crate::{
|
|
|
|
|
client_server::AUTO_GEN_PASSWORD_LENGTH,
|
|
|
|
|
error::{Error, Result},
|
|
|
|
|
pdu::PduBuilder,
|
|
|
|
|
server_server, utils,
|
|
|
|
@ -268,6 +269,13 @@ enum AdminCommand {
|
|
|
|
|
/// Username of the user for whom the password should be reset
|
|
|
|
|
username: String,
|
|
|
|
|
},
|
|
|
|
|
/// Create a new user
|
|
|
|
|
CreateUser {
|
|
|
|
|
/// Username of the new user
|
|
|
|
|
username: String,
|
|
|
|
|
/// Password of the new user, if unspecified one is generated
|
|
|
|
|
password: Option<String>,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn process_admin_command(
|
|
|
|
@ -480,6 +488,63 @@ fn process_admin_command(
|
|
|
|
|
)),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
AdminCommand::CreateUser { username, password } => {
|
|
|
|
|
let password = password.unwrap_or(utils::random_string(AUTO_GEN_PASSWORD_LENGTH));
|
|
|
|
|
// Validate user id
|
|
|
|
|
let user_id = match UserId::parse_with_server_name(
|
|
|
|
|
username.as_str().to_lowercase(),
|
|
|
|
|
db.globals.server_name(),
|
|
|
|
|
) {
|
|
|
|
|
Ok(id) => id,
|
|
|
|
|
Err(e) => {
|
|
|
|
|
return Ok(RoomMessageEventContent::text_plain(format!(
|
|
|
|
|
"The supplied username is not a valid username: {}",
|
|
|
|
|
e
|
|
|
|
|
)))
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
if user_id.is_historical() {
|
|
|
|
|
return Ok(RoomMessageEventContent::text_plain(format!(
|
|
|
|
|
"userid {user_id} is not allowed due to historical"
|
|
|
|
|
)));
|
|
|
|
|
}
|
|
|
|
|
if db.users.exists(&user_id)? {
|
|
|
|
|
return Ok(RoomMessageEventContent::text_plain(format!(
|
|
|
|
|
"userid {user_id} already exists"
|
|
|
|
|
)));
|
|
|
|
|
}
|
|
|
|
|
// Create user
|
|
|
|
|
db.users.create(&user_id, Some(password.as_str()))?;
|
|
|
|
|
|
|
|
|
|
// Default to pretty displayname
|
|
|
|
|
let displayname = format!("{} ⚡️", user_id.localpart());
|
|
|
|
|
db.users
|
|
|
|
|
.set_displayname(&user_id, Some(displayname.clone()))?;
|
|
|
|
|
|
|
|
|
|
// Initial account data
|
|
|
|
|
db.account_data.update(
|
|
|
|
|
None,
|
|
|
|
|
&user_id,
|
|
|
|
|
ruma::events::GlobalAccountDataEventType::PushRules
|
|
|
|
|
.to_string()
|
|
|
|
|
.into(),
|
|
|
|
|
&ruma::events::push_rules::PushRulesEvent {
|
|
|
|
|
content: ruma::events::push_rules::PushRulesEventContent {
|
|
|
|
|
global: ruma::push::Ruleset::server_default(&user_id),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
&db.globals,
|
|
|
|
|
)?;
|
|
|
|
|
|
|
|
|
|
// we dont add a device since we're not the user, just the creator
|
|
|
|
|
|
|
|
|
|
db.flush()?;
|
|
|
|
|
|
|
|
|
|
// Inhibit login does not work for guests
|
|
|
|
|
RoomMessageEventContent::text_plain(format!(
|
|
|
|
|
"Created user with user_id: {user_id} and password: {password}"
|
|
|
|
|
))
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Ok(reply_message_content)
|
|
|
|
|