Refactor users management (#7)
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
* Improve general settings management by admin
This commit is contained in:
@ -11,7 +11,7 @@ use crate::controllers::settings_controller::BaseSettingsPage;
|
||||
use crate::data::action_logger::{Action, ActionLogger};
|
||||
use crate::data::client::{Client, ClientID, ClientManager};
|
||||
use crate::data::current_user::CurrentUser;
|
||||
use crate::data::user::{GrantedClients, User, UserID};
|
||||
use crate::data::user::{GeneralSettings, GrantedClients, User, UserID};
|
||||
use crate::utils::string_utils::rand_str;
|
||||
|
||||
#[derive(Template)]
|
||||
@ -74,39 +74,57 @@ pub async fn users_route(
|
||||
let mut success = None;
|
||||
|
||||
if let Some(update) = update_query {
|
||||
let current_user: Option<User> = users
|
||||
.send(users_actor::FindUserByUsername(update.username.to_string()))
|
||||
let edited_user: Option<User> = users
|
||||
.send(users_actor::GetUserRequest(update.uid.clone()))
|
||||
.await
|
||||
.unwrap()
|
||||
.0;
|
||||
let is_creating = current_user.is_none();
|
||||
let is_creating = edited_user.is_none();
|
||||
|
||||
let mut user = current_user.unwrap_or_default();
|
||||
user.uid = update.0.uid;
|
||||
user.username = update.0.username;
|
||||
user.first_name = update.0.first_name;
|
||||
user.last_name = update.0.last_name;
|
||||
user.email = update.0.email;
|
||||
user.enabled = update.0.enabled.is_some();
|
||||
user.two_factor_exemption_after_successful_login = update
|
||||
.0
|
||||
.two_factor_exemption_after_successful_login
|
||||
.is_some();
|
||||
user.admin = update.0.admin.is_some();
|
||||
let settings = GeneralSettings {
|
||||
uid: update.0.uid,
|
||||
username: update.0.username,
|
||||
first_name: update.0.first_name,
|
||||
last_name: update.0.last_name,
|
||||
email: update.0.email,
|
||||
enabled: update.0.enabled.is_some(),
|
||||
two_factor_exemption_after_successful_login: update
|
||||
.0
|
||||
.two_factor_exemption_after_successful_login
|
||||
.is_some(),
|
||||
is_admin: update.0.admin.is_some(),
|
||||
};
|
||||
let mut edited_user = edited_user.unwrap_or_default();
|
||||
edited_user.update_general_settings(settings.clone());
|
||||
|
||||
let res = users
|
||||
.send(users_actor::UpdateUserRequest(user.clone()))
|
||||
.await
|
||||
.unwrap();
|
||||
let res = match is_creating {
|
||||
true => {
|
||||
match users
|
||||
.send(users_actor::CreateAccount(settings))
|
||||
.await
|
||||
.unwrap()
|
||||
{
|
||||
Some(id) => {
|
||||
edited_user.uid = id;
|
||||
true
|
||||
}
|
||||
None => false,
|
||||
}
|
||||
}
|
||||
false => users
|
||||
.send(users_actor::UpdateUserSettings(settings))
|
||||
.await
|
||||
.unwrap(),
|
||||
};
|
||||
|
||||
// Update the list of factors
|
||||
let factors_to_keep = update.0.two_factor.split(';').collect::<Vec<_>>();
|
||||
for factor in &user.two_factor {
|
||||
for factor in &edited_user.two_factor {
|
||||
if !factors_to_keep.contains(&factor.id.0.as_str()) {
|
||||
logger.log(Action::AdminRemoveUserFactor(&user, factor));
|
||||
logger.log(Action::AdminRemoveUserFactor(&edited_user, factor));
|
||||
users
|
||||
.send(users_actor::Remove2FAFactor(
|
||||
user.uid.clone(),
|
||||
edited_user.uid.clone(),
|
||||
factor.id.clone(),
|
||||
))
|
||||
.await
|
||||
@ -130,14 +148,14 @@ pub async fn users_route(
|
||||
_ => GrantedClients::NoClient,
|
||||
};
|
||||
|
||||
if user.granted_clients() != granted_clients {
|
||||
if edited_user.granted_clients() != granted_clients {
|
||||
logger.log(Action::AdminSetNewGrantedClientsList(
|
||||
&user,
|
||||
&edited_user,
|
||||
&granted_clients,
|
||||
));
|
||||
users
|
||||
.send(users_actor::SetGrantedClients(
|
||||
user.uid.clone(),
|
||||
edited_user.uid.clone(),
|
||||
granted_clients,
|
||||
))
|
||||
.await
|
||||
@ -146,9 +164,9 @@ pub async fn users_route(
|
||||
|
||||
// Clear user 2FA history if requested
|
||||
if update.0.clear_2fa_history.is_some() {
|
||||
logger.log(Action::AdminClear2FAHistory(&user));
|
||||
logger.log(Action::AdminClear2FAHistory(&edited_user));
|
||||
users
|
||||
.send(users_actor::Clear2FALoginHistory(user.uid.clone()))
|
||||
.send(users_actor::Clear2FALoginHistory(edited_user.uid.clone()))
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
@ -157,12 +175,12 @@ pub async fn users_route(
|
||||
let new_password = match update.0.gen_new_password.is_some() {
|
||||
false => None,
|
||||
true => {
|
||||
logger.log(Action::AdminResetUserPassword(&user));
|
||||
logger.log(Action::AdminResetUserPassword(&edited_user));
|
||||
|
||||
let temp_pass = rand_str(TEMPORARY_PASSWORDS_LEN);
|
||||
users
|
||||
.send(users_actor::ChangePasswordRequest {
|
||||
user_id: user.uid.clone(),
|
||||
user_id: edited_user.uid.clone(),
|
||||
new_password: temp_pass.clone(),
|
||||
temporary: true,
|
||||
})
|
||||
@ -184,19 +202,19 @@ pub async fn users_route(
|
||||
} else {
|
||||
success = Some(match is_creating {
|
||||
true => {
|
||||
logger.log(Action::AdminCreateUser(&user));
|
||||
format!("User {} was successfully created!", user.full_name())
|
||||
logger.log(Action::AdminCreateUser(&edited_user));
|
||||
format!("User {} was successfully created!", edited_user.full_name())
|
||||
}
|
||||
false => {
|
||||
logger.log(Action::AdminUpdateUser(&user));
|
||||
format!("User {} was successfully updated!", user.full_name())
|
||||
logger.log(Action::AdminUpdateUser(&edited_user));
|
||||
format!("User {} was successfully updated!", edited_user.full_name())
|
||||
}
|
||||
});
|
||||
|
||||
if let Some(pass) = new_password {
|
||||
danger = Some(format!(
|
||||
"{}'s temporary password is {}",
|
||||
user.full_name(),
|
||||
edited_user.full_name(),
|
||||
pass
|
||||
));
|
||||
}
|
||||
|
Reference in New Issue
Block a user