diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-25 13:25:41 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-25 13:25:41 +0100 |
| commit | 9c08495cca8b9aaf297c88da9ec98a619eb90762 (patch) | |
| tree | fedb0ba09e45c51f7f1b9d5ce9ea5b9a47ce6f01 /server/src/ui/admin/mod.rs | |
| parent | 6949f8d40d1784d5a9c54dbe44e212fe2fae76f4 (diff) | |
| download | jellything-9c08495cca8b9aaf297c88da9ec98a619eb90762.tar jellything-9c08495cca8b9aaf297c88da9ec98a619eb90762.tar.bz2 jellything-9c08495cca8b9aaf297c88da9ec98a619eb90762.tar.zst | |
user creation; flash message in request info
Diffstat (limited to 'server/src/ui/admin/mod.rs')
| -rw-r--r-- | server/src/ui/admin/mod.rs | 74 |
1 files changed, 56 insertions, 18 deletions
diff --git a/server/src/ui/admin/mod.rs b/server/src/ui/admin/mod.rs index 3fa0591..79c9241 100644 --- a/server/src/ui/admin/mod.rs +++ b/server/src/ui/admin/mod.rs @@ -8,14 +8,22 @@ pub mod import; pub mod log; use super::error::MyResult; -use crate::{request_info::RequestInfo, ui_responder::UiResponse}; +use crate::{auth::hash_password, request_info::RequestInfo, ui_responder::UiResponse}; +use base64::{Engine, prelude::BASE64_URL_SAFE}; use jellycommon::{ - jellyobject::{ObjectBuffer, ObjectBufferBuilder}, + jellyobject::{OBB, ObjectBuffer, ObjectBufferBuilder}, + routes::u_admin_users, *, }; use jellydb::Query; use jellyui::tr; -use rocket::get; +use rand::random; +use rocket::{ + FromForm, + form::Form, + get, post, + response::{Flash, Redirect}, +}; use std::str::FromStr; #[get("/admin/dashboard")] @@ -28,17 +36,18 @@ pub async fn r_admin_dashboard(ri: RequestInfo<'_>) -> MyResult<UiResponse> { Ok(()) })?; - Ok(ri.respond_ui(ObjectBuffer::new(&mut [ - (VIEW_TITLE.0, &&*tr(ri.lang, "admin.dashboard.title")), - (VIEW_ADMIN_DASHBOARD.0, &()), - ( - VIEW_ADMIN_INFO.0, - &ObjectBuffer::new(&mut [ - (ADMIN_INFO_TITLE.0, &"Database Debug"), - (ADMIN_INFO_TEXT.0, &db_debug.as_str()), - ]), - ), - ]))) + let mut page = OBB::new(); + page.push(VIEW_TITLE, &*tr(ri.lang, "admin.dashboard.title")); + page.push(VIEW_ADMIN_DASHBOARD, ()); + page.push( + VIEW_ADMIN_INFO, + ObjectBuffer::new(&mut [ + (ADMIN_INFO_TITLE.0, &"Database Debug"), + (ADMIN_INFO_TEXT.0, &db_debug.as_str()), + ]) + .as_object(), + ); + Ok(ri.respond_ui(page)) } #[get("/admin/users")] @@ -62,8 +71,37 @@ pub fn r_admin_users(ri: RequestInfo) -> MyResult<UiResponse> { for u in users { list.push(ADMIN_USER_LIST_ITEM, u.as_object()); } - Ok(ri.respond_ui(ObjectBuffer::new(&mut [( - VIEW_ADMIN_USER_LIST.0, - &list.finish().as_object(), - )]))) + + let mut page = ObjectBufferBuilder::default(); + page.push(VIEW_TITLE, &*tr(ri.lang, "admin.users")); + page.push(VIEW_ADMIN_USER_LIST, list.finish().as_object()); + Ok(ri.respond_ui(page)) +} + +#[derive(FromForm)] +pub struct NewUser { + login: String, +} + +#[post("/admin/new_user", data = "<form>")] +pub fn r_admin_new_user(ri: RequestInfo, form: Form<NewUser>) -> MyResult<Flash<Redirect>> { + ri.require_admin()?; + + let password = BASE64_URL_SAFE.encode([(); 12].map(|()| random())); + let password_hashed = hash_password(&form.login, &password); + + ri.state.database.transaction(&mut |txn| { + let mut user = ObjectBufferBuilder::default(); + user.push(USER_LOGIN, &form.login); + user.push(USER_PASSWORD, &password_hashed); + user.push(USER_PASSWORD_REQUIRE_CHANGE, ()); + txn.insert(user.finish())?; + Ok(()) + })?; + + Ok(Flash::new( + Redirect::to(u_admin_users()), + "success", + format!("User created; password: {password}"), + )) } |