From 625ea9193202f678ab2799283ddfe2b282ba1e90 Mon Sep 17 00:00:00 2001 From: Jokler Date: Mon, 5 Oct 2026 16:07:20 +0200 Subject: Add user creation --- src/admin.rs | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 70 insertions(+), 7 deletions(-) (limited to 'src/admin.rs') diff --git a/src/admin.rs b/src/admin.rs index 2efe02f..912d0a3 100644 --- a/src/admin.rs +++ b/src/admin.rs @@ -5,21 +5,32 @@ use actix_http::error::ResponseError; use actix_identity::Identity; use actix_web::{http::header, web, HttpResponse}; use askama::Template; -use serde::Deserialize; +use serde::{Serialize, Deserialize}; use crate::error::ServiceError; use crate::model::{DbExecutor, NewUser}; +use crate::user::LoginData; use crate::util::UserRequest; use crate::Secret; pub mod user_creation; -use user_creation::{PassHashExecutor, PassHashRequest, SaveUserRequest}; +use user_creation::{ChangePasswordRequest, PassHashExecutor, PassHashRequest, SaveUserRequest}; #[derive(Template)] #[template(path = "admin.htm")] -struct AdminTemplate; +struct AdminTemplate { + success: OperationResult, +} + +#[derive(Serialize, Deserialize, Debug, PartialEq)] +#[serde(rename_all = "kebab-case")] +pub enum OperationResult { + ChangePassword, + CreateUser, + Empty, +} -pub async fn index(ident: Identity, db: web::Data>) -> HttpResponse { +pub async fn handle_index(ident: Identity, db: web::Data>) -> HttpResponse { if let Some(name) = ident.identity() { ident.remember(name.clone()); let user = match db.send(UserRequest(name.clone())).await.unwrap() { @@ -35,7 +46,11 @@ pub async fn index(ident: Identity, db: web::Data>) -> HttpResp return ServiceError::Unauthorized.error_response(); } - let page = AdminTemplate.render().unwrap(); + let page = AdminTemplate { + success: OperationResult::Empty, + } + .render() + .unwrap(); HttpResponse::Ok().content_type("text/html").body(page) } else { @@ -53,7 +68,7 @@ pub struct UserData { pub password: String, } -pub async fn create_user( +pub async fn handle_create_user( ident: Identity, params: web::Form, db: web::Data>, @@ -95,7 +110,7 @@ pub async fn create_user( name: new_login.user, // TODO Let the admin pick power_level: 0, - balance: balance, + balance, }; db.send(SaveUserRequest::new(new_user, hash)) @@ -112,3 +127,51 @@ pub async fn create_user( .finish() } } + +pub async fn handle_change_password( + ident: Identity, + params: web::Form, + db: web::Data>, + hasher: web::Data>, + sec: web::Data, +) -> HttpResponse { + if let Some(name) = ident.identity() { + ident.remember(name.clone()); + let user = db.send(UserRequest(name.clone())).await.unwrap().unwrap(); + if user.power_level != 9001 { + return ServiceError::Unauthorized.error_response(); + } + + change_password(params.into_inner(), &db, &hasher, sec.0.clone()).await; + + let page = AdminTemplate { + success: OperationResult::ChangePassword, + } + .render() + .unwrap(); + + HttpResponse::Ok().content_type("text/html").body(page) + } else { + HttpResponse::Found() + .header(header::LOCATION, "/user/login") + .finish() + } +} + +pub async fn change_password( + login: LoginData, + db: &Addr, + hasher: &Addr, + secret: String, +) { + let hash = hasher + .send(PassHashRequest::new(login.password, secret)) + .await + .unwrap() + .unwrap(); + + db.send(ChangePasswordRequest(login.user, hash)) + .await + .unwrap() + .unwrap(); +} -- cgit v1.3.1