aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-01-26 20:04:40 +0100
committermetamuffin <metamuffin@disroot.org>2026-01-26 20:04:40 +0100
commitf59c6f472d25084aa5f8a116f8cf92f81df09c50 (patch)
treed3282488db81b3c09d34f2aa1ca452c2bef1451c
parent783d3598753bf84756296a2016e5dab30300519b (diff)
downloadjellything-f59c6f472d25084aa5f8a116f8cf92f81df09c50.tar
jellything-f59c6f472d25084aa5f8a116f8cf92f81df09c50.tar.bz2
jellything-f59c6f472d25084aa5f8a116f8cf92f81df09c50.tar.zst
can render login ui
-rw-r--r--common/src/api.rs4
-rw-r--r--server/src/auth.rs2
-rw-r--r--server/src/logger.rs2
-rw-r--r--server/src/routes.rs9
-rw-r--r--server/src/ui/account/mod.rs101
-rw-r--r--ui/client-style/build.rs6
-rw-r--r--ui/src/lib.rs2
-rw-r--r--ui/src/scaffold.rs1
8 files changed, 37 insertions, 90 deletions
diff --git a/common/src/api.rs b/common/src/api.rs
index 415ef76..90efc76 100644
--- a/common/src/api.rs
+++ b/common/src/api.rs
@@ -21,8 +21,8 @@ fields! {
VIEW_STATGROUP: Object = 2041 "statgroup";
VIEW_STATTEXT: Object = 2042 "stattext";
VIEW_ACCOUNT_LOGIN: () = 2043 "account_login";
- VIEW_ACCOUNT_LOGOUT: () = 2043 "account_logout";
- VIEW_ACCOUNT_SET_PASSWORD: &str = 2044 "account_set_password";
+ VIEW_ACCOUNT_LOGOUT: () = 2044 "account_logout";
+ VIEW_ACCOUNT_SET_PASSWORD: &str = 2045 "account_set_password";
NKU_NODE: Object = 2025 "node";
NKU_UDATA: Object = 2026 "udata";
diff --git a/server/src/auth.rs b/server/src/auth.rs
index 0e523ed..ed9a469 100644
--- a/server/src/auth.rs
+++ b/server/src/auth.rs
@@ -42,7 +42,7 @@ pub fn login(state: &State, username: &str, password: &str, expire: Option<i64>)
user = state.users.get(txn, ur)?;
}
Ok(())
- });
+ })?;
let (Some(user_row), Some(user)) = (user_row, user) else {
bail!("unknown user");
diff --git a/server/src/logger.rs b/server/src/logger.rs
index 9195b99..e7419ba 100644
--- a/server/src/logger.rs
+++ b/server/src/logger.rs
@@ -30,7 +30,7 @@ pub struct LogLine {
}
#[derive(Serialize, Deserialize, Clone, Copy, PartialEq)]
-enum LogLevel {
+pub enum LogLevel {
Trace,
Debug,
Info,
diff --git a/server/src/routes.rs b/server/src/routes.rs
index 01d0081..bf6865e 100644
--- a/server/src/routes.rs
+++ b/server/src/routes.rs
@@ -12,6 +12,7 @@ use crate::{
stream::r_stream,
},
ui::{
+ account::{r_account_login, r_account_login_post, r_account_logout, r_account_logout_post},
assets::r_image,
error::{r_api_catch, r_catch},
node::r_node,
@@ -64,10 +65,10 @@ pub(super) fn build_rocket(state: Arc<State>) -> Rocket<Build> {
"/",
routes![
// Frontend
- // r_account_login_post,
- // r_account_login,
- // r_account_logout_post,
- // r_account_logout,
+ r_account_login_post,
+ r_account_login,
+ r_account_logout_post,
+ r_account_logout,
// r_account_register_post,
// r_account_register,
// r_account_settings_post,
diff --git a/server/src/ui/account/mod.rs b/server/src/ui/account/mod.rs
index ec8bd49..765b6aa 100644
--- a/server/src/ui/account/mod.rs
+++ b/server/src/ui/account/mod.rs
@@ -6,13 +6,9 @@
// pub mod settings;
use super::error::MyError;
-use crate::{
- request_info::RequestInfo,
- ui::{error::MyResult, home::rocket_uri_macro_r_home},
-};
+use crate::{auth::login, request_info::RequestInfo, ui::error::MyResult};
use anyhow::anyhow;
-use jellycommon::{VIEW_ACCOUNT_LOGIN, jellyobject::Object};
-use jellyimport::is_importing;
+use jellycommon::{VIEW_ACCOUNT_LOGIN, VIEW_ACCOUNT_LOGOUT, jellyobject::Object, routes::u_home};
use jellyui::render_view;
use rocket::{
FromForm,
@@ -20,7 +16,7 @@ use rocket::{
get,
http::{Cookie, CookieJar},
post,
- response::{Redirect, content::RawHtml},
+ response::{Flash, Redirect, content::RawHtml},
};
use serde::{Deserialize, Serialize};
@@ -34,12 +30,18 @@ pub struct RegisterForm {
pub password: String,
}
-#[get("/account/register")]
-pub async fn r_account_register(ri: RequestInfo<'_>) -> RawHtml<String> {
+#[get("/account/login")]
+pub async fn r_account_login(ri: RequestInfo<'_>) -> RawHtml<String> {
let ob = Object::EMPTY.insert(VIEW_ACCOUNT_LOGIN, ());
RawHtml(render_view(ri.render_info(), ob.as_object()))
}
+#[get("/account/logout")]
+pub fn r_account_logout(ri: RequestInfo<'_>) -> RawHtml<String> {
+ let ob = Object::EMPTY.insert(VIEW_ACCOUNT_LOGOUT, ());
+ RawHtml(render_view(ri.render_info(), ob.as_object()))
+}
+
#[derive(FromForm, Serialize, Deserialize)]
pub struct LoginForm {
#[field(validate = len(4..32))]
@@ -50,66 +52,9 @@ pub struct LoginForm {
pub expire: u64,
}
-#[get("/account/login")]
-pub fn r_account_login(session: Option<A<Session>>, lang: AcceptLanguage) -> RawHtml<String> {
- let AcceptLanguage(lang) = lang;
- let logged_in = session.is_some();
- RawHtml(render_page(
- &AccountLogin {
- lang: &lang,
- logged_in,
- },
- RenderInfo {
- session: session.map(|s| SessionInfo { user: s.0.user }),
- importing: is_importing(),
- lang,
- },
- ))
-}
-
-#[get("/account/logout")]
-pub fn r_account_logout(session: Option<A<Session>>, lang: AcceptLanguage) -> RawHtml<String> {
- let AcceptLanguage(lang) = lang;
- RawHtml(render_page(
- &AccountLogout { lang: &lang },
- RenderInfo {
- session: session.map(|s| SessionInfo { user: s.0.user }),
- importing: is_importing(),
- lang,
- },
- ))
-}
-
-#[post("/account/register", data = "<form>")]
-pub fn r_account_register_post<'a>(
- session: Option<A<Session>>,
- lang: AcceptLanguage,
- form: Form<Contextual<'a, RegisterForm>>,
-) -> MyResult<RawHtml<String>> {
- let AcceptLanguage(lang) = lang;
- let logged_in = session.is_some();
- let form = match &form.value {
- Some(v) => v,
- None => return Err(MyError(anyhow!(format_form_error(form)))),
- };
-
- register_user(&form.invitation, &form.username, &form.password)?;
-
- Ok(RawHtml(render_page(
- &AccountRegisterSuccess {
- lang: &lang,
- logged_in,
- },
- RenderInfo {
- session: session.map(|s| SessionInfo { user: s.0.user }),
- importing: is_importing(),
- lang,
- },
- )))
-}
-
#[post("/account/login", data = "<form>")]
pub fn r_account_login_post(
+ ri: RequestInfo<'_>,
jar: &CookieJar,
form: Form<Contextual<LoginForm>>,
) -> MyResult<Redirect> {
@@ -117,22 +62,20 @@ pub fn r_account_login_post(
Some(v) => v,
None => return Err(MyError(anyhow!(format_form_error(form)))),
};
- jar.add(
- Cookie::build((
- "session",
- login_logic(&form.username, &form.password, None, None)?,
- ))
- .permanent()
- .build(),
- );
+ let session = login(&ri.state, &form.username, &form.password, None)?;
+ jar.add(Cookie::build(("session", session)).permanent().build());
- Ok(Redirect::found(rocket::uri!(r_home())))
+ Ok(Redirect::found(u_home()))
}
#[post("/account/logout")]
-pub fn r_account_logout_post(jar: &CookieJar) -> MyResult<Redirect> {
- jar.remove_private(Cookie::build("session"));
- Ok(Redirect::found(rocket::uri!(r_home())))
+pub fn r_account_logout_post(jar: &CookieJar) -> MyResult<Flash<Redirect>> {
+ jar.remove(Cookie::build("session"));
+ Ok(Flash::new(
+ Redirect::found(u_home()),
+ "success",
+ "Logged out!",
+ ))
}
pub fn format_form_error<T>(form: Form<Contextual<T>>) -> String {
diff --git a/ui/client-style/build.rs b/ui/client-style/build.rs
index c5bdf78..9e39aec 100644
--- a/ui/client-style/build.rs
+++ b/ui/client-style/build.rs
@@ -6,6 +6,7 @@
use std::{
fs::{File, read_to_string},
+ io::Write,
path::PathBuf,
};
fn main() {
@@ -16,5 +17,8 @@ fn main() {
out += &read_to_string(file).unwrap();
}
let outpath: PathBuf = std::env::var("OUT_DIR").unwrap().try_into().unwrap();
- File::create(outpath.join("bundle.css")).unwrap();
+ File::create(outpath.join("bundle.css"))
+ .unwrap()
+ .write_all(out.as_bytes())
+ .unwrap();
}
diff --git a/ui/src/lib.rs b/ui/src/lib.rs
index f3a1282..9509129 100644
--- a/ui/src/lib.rs
+++ b/ui/src/lib.rs
@@ -34,7 +34,7 @@ pub fn render_view(ri: RenderInfo<'_>, view: Object<'_>) -> String {
ri: &ri,
main: View { ri: &ri, view },
title: view.get(VIEW_TITLE).unwrap_or_default(),
- class: "",
+ class: "theme-purple",
}
.to_string()
}
diff --git a/ui/src/scaffold.rs b/ui/src/scaffold.rs
index 8cfb432..a8ce8c9 100644
--- a/ui/src/scaffold.rs
+++ b/ui/src/scaffold.rs
@@ -54,7 +54,6 @@ markup::define! {
a.settings.hybrid_button[href=u_account_settings()] { p {@tr(ri.lang, "nav.settings")} } " "
a.logout.hybrid_button[href=u_account_logout()] { p {@tr(ri.lang, "nav.logout")} }
} else {
- a.register.hybrid_button[href=u_account_register()] { p {@tr(ri.lang, "nav.register")} } " "
a.login.hybrid_button[href=u_account_login()] { p {@tr(ri.lang, "nav.login")} }
}
}