Merge factors type for authentication
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
use std::ops::Deref;
|
||||
|
||||
use actix::Addr;
|
||||
use actix_web::{HttpResponse, Responder, web};
|
||||
use actix_web::{web, HttpResponse, Responder};
|
||||
use askama::Template;
|
||||
|
||||
use crate::actors::users_actor;
|
||||
@ -35,17 +35,15 @@ struct EditUserTemplate {
|
||||
clients: Vec<Client>,
|
||||
}
|
||||
|
||||
|
||||
pub async fn clients_route(user: CurrentUser, clients: web::Data<ClientManager>) -> impl Responder {
|
||||
HttpResponse::Ok().body(ClientsListTemplate {
|
||||
_p: BaseSettingsPage::get(
|
||||
"Clients list",
|
||||
&user,
|
||||
None,
|
||||
None,
|
||||
),
|
||||
clients: clients.cloned(),
|
||||
}.render().unwrap())
|
||||
HttpResponse::Ok().body(
|
||||
ClientsListTemplate {
|
||||
_p: BaseSettingsPage::get("Clients list", &user, None, None),
|
||||
clients: clients.cloned(),
|
||||
}
|
||||
.render()
|
||||
.unwrap(),
|
||||
)
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize, Debug)]
|
||||
@ -63,13 +61,20 @@ pub struct UpdateUserQuery {
|
||||
two_factor: String,
|
||||
}
|
||||
|
||||
pub async fn users_route(user: CurrentUser, users: web::Data<Addr<UsersActor>>, update_query: Option<web::Form<UpdateUserQuery>>) -> impl Responder {
|
||||
pub async fn users_route(
|
||||
user: CurrentUser,
|
||||
users: web::Data<Addr<UsersActor>>,
|
||||
update_query: Option<web::Form<UpdateUserQuery>>,
|
||||
) -> impl Responder {
|
||||
let mut danger = None;
|
||||
let mut success = None;
|
||||
|
||||
if let Some(update) = update_query {
|
||||
let current_user: Option<User> = users.send(users_actor::FindUserByUsername(update.username.to_string()))
|
||||
.await.unwrap().0;
|
||||
let current_user: Option<User> = users
|
||||
.send(users_actor::FindUserByUsername(update.username.to_string()))
|
||||
.await
|
||||
.unwrap()
|
||||
.0;
|
||||
let is_creating = current_user.is_none();
|
||||
|
||||
let mut user = current_user.unwrap_or_default();
|
||||
@ -82,67 +87,84 @@ pub async fn users_route(user: CurrentUser, users: web::Data<Addr<UsersActor>>,
|
||||
user.admin = update.0.admin.is_some();
|
||||
|
||||
let factors_to_keep = update.0.two_factor.split(';').collect::<Vec<_>>();
|
||||
user.two_factor.retain(|f| factors_to_keep.contains(&f.id.0.as_str()));
|
||||
|
||||
user.two_factor
|
||||
.retain(|f| factors_to_keep.contains(&f.id.0.as_str()));
|
||||
|
||||
user.authorized_clients = match update.0.grant_type.as_str() {
|
||||
"all_clients" => None,
|
||||
"custom_clients" => Some(update.0.granted_clients.split(',')
|
||||
.map(|c| ClientID(c.to_string()))
|
||||
.collect::<Vec<_>>()),
|
||||
_ => Some(Vec::new())
|
||||
"custom_clients" => Some(
|
||||
update
|
||||
.0
|
||||
.granted_clients
|
||||
.split(',')
|
||||
.map(|c| ClientID(c.to_string()))
|
||||
.collect::<Vec<_>>(),
|
||||
),
|
||||
_ => Some(Vec::new()),
|
||||
};
|
||||
|
||||
let new_password = match update.0.gen_new_password.is_some() {
|
||||
false => None,
|
||||
true => {
|
||||
let temp_pass = rand_str(TEMPORARY_PASSWORDS_LEN);
|
||||
user.password = hash_password(&temp_pass)
|
||||
.expect("Failed to hash password");
|
||||
user.password = hash_password(&temp_pass).expect("Failed to hash password");
|
||||
user.need_reset_password = true;
|
||||
Some(temp_pass)
|
||||
}
|
||||
};
|
||||
|
||||
let res = users.send(users_actor::UpdateUserRequest(user.clone())).await.unwrap().0;
|
||||
let res = users
|
||||
.send(users_actor::UpdateUserRequest(user.clone()))
|
||||
.await
|
||||
.unwrap()
|
||||
.0;
|
||||
|
||||
if !res {
|
||||
danger = Some(match is_creating {
|
||||
true => "Failed to create user!",
|
||||
false => "Failed to update user!"
|
||||
}.to_string())
|
||||
danger = Some(
|
||||
match is_creating {
|
||||
true => "Failed to create user!",
|
||||
false => "Failed to update user!",
|
||||
}
|
||||
.to_string(),
|
||||
)
|
||||
} else {
|
||||
success = Some(match is_creating {
|
||||
true => format!("User {} was successfully created!", user.full_name()),
|
||||
false => format!("User {} was successfully updated!", user.full_name())
|
||||
false => format!("User {} was successfully updated!", user.full_name()),
|
||||
});
|
||||
|
||||
if let Some(pass) = new_password {
|
||||
danger = Some(format!("{}'s temporary password is {}", user.full_name(), pass));
|
||||
danger = Some(format!(
|
||||
"{}'s temporary password is {}",
|
||||
user.full_name(),
|
||||
pass
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
let users = users.send(users_actor::GetAllUsersRequest).await.unwrap().0;
|
||||
|
||||
HttpResponse::Ok().body(UsersListTemplate {
|
||||
_p: BaseSettingsPage::get(
|
||||
"Users list",
|
||||
&user,
|
||||
danger,
|
||||
success,
|
||||
),
|
||||
users,
|
||||
}.render().unwrap())
|
||||
HttpResponse::Ok().body(
|
||||
UsersListTemplate {
|
||||
_p: BaseSettingsPage::get("Users list", &user, danger, success),
|
||||
users,
|
||||
}
|
||||
.render()
|
||||
.unwrap(),
|
||||
)
|
||||
}
|
||||
|
||||
pub async fn create_user(user: CurrentUser, clients: web::Data<ClientManager>) -> impl Responder {
|
||||
HttpResponse::Ok().body(EditUserTemplate {
|
||||
_p: BaseSettingsPage::get("Create a new user", user.deref(), None, None),
|
||||
u: Default::default(),
|
||||
clients: clients.cloned(),
|
||||
}.render().unwrap())
|
||||
HttpResponse::Ok().body(
|
||||
EditUserTemplate {
|
||||
_p: BaseSettingsPage::get("Create a new user", user.deref(), None, None),
|
||||
u: Default::default(),
|
||||
clients: clients.cloned(),
|
||||
}
|
||||
.render()
|
||||
.unwrap(),
|
||||
)
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
@ -150,26 +172,33 @@ pub struct EditUserQuery {
|
||||
id: UserID,
|
||||
}
|
||||
|
||||
pub async fn edit_user(user: CurrentUser,
|
||||
clients: web::Data<ClientManager>,
|
||||
users: web::Data<Addr<UsersActor>>,
|
||||
query: web::Query<EditUserQuery>,
|
||||
pub async fn edit_user(
|
||||
user: CurrentUser,
|
||||
clients: web::Data<ClientManager>,
|
||||
users: web::Data<Addr<UsersActor>>,
|
||||
query: web::Query<EditUserQuery>,
|
||||
) -> impl Responder {
|
||||
let edited_account = users.send(users_actor::GetUserRequest(query.0.id))
|
||||
.await.unwrap().0;
|
||||
let edited_account = users
|
||||
.send(users_actor::GetUserRequest(query.0.id))
|
||||
.await
|
||||
.unwrap()
|
||||
.0;
|
||||
|
||||
|
||||
HttpResponse::Ok().body(EditUserTemplate {
|
||||
_p: BaseSettingsPage::get(
|
||||
"Edit user account",
|
||||
user.deref(),
|
||||
match edited_account.is_none() {
|
||||
true => Some("Could not find requested user!".to_string()),
|
||||
false => None
|
||||
},
|
||||
None,
|
||||
),
|
||||
u: edited_account.unwrap_or_default(),
|
||||
clients: clients.cloned(),
|
||||
}.render().unwrap())
|
||||
HttpResponse::Ok().body(
|
||||
EditUserTemplate {
|
||||
_p: BaseSettingsPage::get(
|
||||
"Edit user account",
|
||||
user.deref(),
|
||||
match edited_account.is_none() {
|
||||
true => Some("Could not find requested user!".to_string()),
|
||||
false => None,
|
||||
},
|
||||
None,
|
||||
),
|
||||
u: edited_account.unwrap_or_default(),
|
||||
clients: clients.cloned(),
|
||||
}
|
||||
.render()
|
||||
.unwrap(),
|
||||
)
|
||||
}
|
||||
|
Reference in New Issue
Block a user