summaryrefslogtreecommitdiffstats
path: root/src/admin.rs
diff options
context:
space:
mode:
authorJokler <github@jokler.xyz>2026-10-05 16:07:20 +0200
committerJokler <github@jokler.xyz>2026-10-05 22:25:43 +0200
commit625ea9193202f678ab2799283ddfe2b282ba1e90 (patch)
treeccb98fdfca95b0787b730d5e9a3d3c9146eabf9a /src/admin.rs
parent0fed68e150b028b9ad62e75e0472a34224042501 (diff)
downloadjoklerpoints-625ea9193202f678ab2799283ddfe2b282ba1e90.tar.gz
joklerpoints-625ea9193202f678ab2799283ddfe2b282ba1e90.zip
Add user creation
Diffstat (limited to 'src/admin.rs')
-rw-r--r--src/admin.rs77
1 files changed, 70 insertions, 7 deletions
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<Addr<DbExecutor>>) -> HttpResponse {
+pub async fn handle_index(ident: Identity, db: web::Data<Addr<DbExecutor>>) -> 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<Addr<DbExecutor>>) -> 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<UserData>,
db: web::Data<Addr<DbExecutor>>,
@@ -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<LoginData>,
+ db: web::Data<Addr<DbExecutor>>,
+ hasher: web::Data<Addr<PassHashExecutor>>,
+ sec: web::Data<Secret>,
+) -> 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<DbExecutor>,
+ hasher: &Addr<PassHashExecutor>,
+ secret: String,
+) {
+ let hash = hasher
+ .send(PassHashRequest::new(login.password, secret))
+ .await
+ .unwrap()
+ .unwrap();
+
+ db.send(ChangePasswordRequest(login.user, hash))
+ .await
+ .unwrap()
+ .unwrap();
+}