aboutsummaryrefslogtreecommitdiff
path: root/server/src/ui/admin
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-25 13:25:41 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-25 13:25:41 +0100
commit9c08495cca8b9aaf297c88da9ec98a619eb90762 (patch)
treefedb0ba09e45c51f7f1b9d5ce9ea5b9a47ce6f01 /server/src/ui/admin
parent6949f8d40d1784d5a9c54dbe44e212fe2fae76f4 (diff)
downloadjellything-9c08495cca8b9aaf297c88da9ec98a619eb90762.tar
jellything-9c08495cca8b9aaf297c88da9ec98a619eb90762.tar.bz2
jellything-9c08495cca8b9aaf297c88da9ec98a619eb90762.tar.zst
user creation; flash message in request info
Diffstat (limited to 'server/src/ui/admin')
-rw-r--r--server/src/ui/admin/import.rs6
-rw-r--r--server/src/ui/admin/mod.rs74
2 files changed, 59 insertions, 21 deletions
diff --git a/server/src/ui/admin/import.rs b/server/src/ui/admin/import.rs
index b263705..eba2a3b 100644
--- a/server/src/ui/admin/import.rs
+++ b/server/src/ui/admin/import.rs
@@ -6,9 +6,9 @@
use crate::{request_info::RequestInfo, ui::error::MyResult, ui_responder::UiResponse};
use jellycommon::{
- ADMIN_IMPORT_BUSY, ADMIN_IMPORT_ERROR, VIEW_ADMIN_IMPORT,
- jellyobject::{Object, ObjectBuffer},
+ jellyobject::{OBB, ObjectBuffer},
routes::u_admin_import,
+ *,
};
use jellyimport::{
ImportConfig, import_wrap, is_importing,
@@ -41,7 +41,7 @@ pub async fn r_admin_import(ri: RequestInfo<'_>) -> MyResult<UiResponse> {
.as_object()
.insert_multi(ADMIN_IMPORT_ERROR, &last_import_err);
- Ok(ri.respond_ui(Object::EMPTY.insert(VIEW_ADMIN_IMPORT, data.as_object())))
+ Ok(ri.respond_ui(OBB::new().with(VIEW_ADMIN_IMPORT, data.as_object())))
}
#[post("/admin/import?<incremental>")]
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}"),
+ ))
}