diff --git a/CHANGELOG.md b/CHANGELOG.md index d61481f..9129687 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,11 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased](https://git.rustybever.be/Chewing_Bever/otter) -### Added - -* Web UI - * Login/logout button - ## [0.1.0](https://git.rustybever.be/Chewing_Bever/otter/src/tag/0.1.0) ### Added diff --git a/otter/src/server/web/mod.rs b/otter/src/server/web/mod.rs index 2099ab4..98f5d1e 100644 --- a/otter/src/server/web/mod.rs +++ b/otter/src/server/web/mod.rs @@ -1,21 +1,21 @@ use axum::{ - Form, RequestExt, Router, extract::{Request, State}, - http::{HeaderMap, HeaderName, HeaderValue, header}, + http::HeaderMap, middleware::{self, Next}, response::{IntoResponse, Redirect, Response}, - routing::{get, post}, + routing::get, + Form, RequestExt, Router, }; -use axum_extra::{TypedHeader, extract::CookieJar, headers::UserAgent}; -use cookie::{Cookie, time::Duration}; +use axum_extra::{extract::CookieJar, headers::UserAgent, TypedHeader}; +use cookie::{time::Duration, Cookie}; use gpodder::{AuthErr, Session}; use serde::Deserialize; use crate::web::{Page, TemplateExt, TemplateResponse, View}; use super::{ - Context, error::{AppError, AppResult}, + Context, }; const SESSION_ID_COOKIE: &str = "sessionid"; @@ -23,27 +23,17 @@ const SESSION_ID_COOKIE: &str = "sessionid"; pub fn router(ctx: Context) -> Router { Router::new() .route("/", get(get_index)) - // .layer(middleware::from_fn_with_state( - // ctx.clone(), - // auth_web_middleware, - // )) + .layer(middleware::from_fn_with_state( + ctx.clone(), + auth_web_middleware, + )) // Login route needs to be handled differently, as the middleware turns it into a redirect // loop .route("/login", get(get_login).post(post_login)) - .route("/logout", post(post_logout)) } -async fn get_index( - State(ctx): State, - headers: HeaderMap, - jar: CookieJar, -) -> AppResult>> { - let authenticated = extract_session(ctx.clone(), &jar).await?.is_some(); - - Ok(View::Index - .page(&headers) - .authenticated(authenticated) - .response(&ctx.tera)) +async fn get_index(State(ctx): State, headers: HeaderMap) -> TemplateResponse> { + View::Index.page(&headers).response(&ctx.tera) } async fn get_login(State(ctx): State, headers: HeaderMap, jar: CookieJar) -> Response { @@ -88,16 +78,15 @@ async fn post_login( .unwrap() { Ok(session) => Ok(( - // Redirect forces htmx to reload the full page, refreshing the navbar - [("HX-Redirect", "/")], - (jar.add( + jar.add( Cookie::build((SESSION_ID_COOKIE, session.id.to_string())) .secure(true) .same_site(cookie::SameSite::Lax) .http_only(true) .path("/") .max_age(Duration::days(365)), - )), + ), + Redirect::to("/"), ) .into_response()), Err(AuthErr::UnknownUser | AuthErr::InvalidPassword) => { @@ -107,16 +96,6 @@ async fn post_login( } } -/// Log out the user by simply removing the session -async fn post_logout(State(ctx): State, jar: CookieJar) -> AppResult { - if let Some(session) = extract_session(ctx.clone(), &jar).await? { - ctx.store.remove_session(session.id)?; - } - - // Redirect forces htmx to reload the full page, refreshing the navbar - Ok(([("HX-Redirect", "/")], jar.remove(SESSION_ID_COOKIE))) -} - async fn extract_session(ctx: Context, jar: &CookieJar) -> AppResult> { if let Some(session_id) = jar .get(SESSION_ID_COOKIE) diff --git a/otter/src/web/page.rs b/otter/src/web/page.rs index d7c0b4c..0ba40c5 100644 --- a/otter/src/web/page.rs +++ b/otter/src/web/page.rs @@ -10,7 +10,6 @@ const HX_HISTORY_RESTORE_HEADER: &str = "HX-History-Restore-Request"; pub struct Page { template: T, wrap_with_base: bool, - authenticated: bool, } impl Template for Page { @@ -24,7 +23,6 @@ impl Template for Page { if self.wrap_with_base { let mut ctx = tera::Context::new(); ctx.insert("inner", &inner); - ctx.insert("authenticated", &self.authenticated); tera.render(super::BASE_TEMPLATE, &ctx) } else { @@ -38,7 +36,6 @@ impl Page { Self { template, wrap_with_base: false, - authenticated: false, } } @@ -53,10 +50,4 @@ impl Page { self } - - pub fn authenticated(mut self, authenticated: bool) -> Self { - self.authenticated = authenticated; - - self - } } diff --git a/otter/src/web/templates/base.html b/otter/src/web/templates/base.html index bf13d16..3afd3e4 100644 --- a/otter/src/web/templates/base.html +++ b/otter/src/web/templates/base.html @@ -15,20 +15,6 @@ a:hover {
{{ inner | safe }} diff --git a/otter/src/web/templates/views/index.html b/otter/src/web/templates/views/index.html index 6fc5b55..7116f34 100644 --- a/otter/src/web/templates/views/index.html +++ b/otter/src/web/templates/views/index.html @@ -1,3 +1,5 @@

Otter

Otter is a self-hostable Gpodder implementation. + +If you're seeing this, you're logged in. diff --git a/otter/src/web/templates/views/login.html b/otter/src/web/templates/views/login.html index b81094c..ecd0898 100644 --- a/otter/src/web/templates/views/login.html +++ b/otter/src/web/templates/views/login.html @@ -1,5 +1,5 @@
-
+