Refactor users management (#7)
All checks were successful
continuous-integration/drone/push Build is passing

* Improve general settings management by admin
This commit is contained in:
2022-11-26 16:06:16 +01:00
parent a2d731bfff
commit fc6ab00e30
6 changed files with 166 additions and 58 deletions

View File

@ -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
));
}