diff --git a/otter/src/server/web/mod.rs b/otter/src/server/web/mod.rs index 98f5d1e..ca6ce6f 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, middleware::{self, Next}, response::{IntoResponse, Redirect, Response}, - routing::get, - Form, RequestExt, Router, + routing::{get, post}, }; -use axum_extra::{extract::CookieJar, headers::UserAgent, TypedHeader}; -use cookie::{time::Duration, Cookie}; +use axum_extra::{TypedHeader, extract::CookieJar, headers::UserAgent}; +use cookie::{Cookie, time::Duration}; use gpodder::{AuthErr, Session}; use serde::Deserialize; use crate::web::{Page, TemplateExt, TemplateResponse, View}; use super::{ - error::{AppError, AppResult}, Context, + error::{AppError, AppResult}, }; const SESSION_ID_COOKIE: &str = "sessionid"; @@ -30,6 +30,7 @@ pub fn router(ctx: Context) -> Router { // 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) -> TemplateResponse> { @@ -96,6 +97,18 @@ async fn post_login( } } +/// Log out the user by simply removing the session +async fn post_logout( + State(ctx): State, + jar: CookieJar, +) -> AppResult<(CookieJar, Redirect)> { + if let Some(session) = extract_session(ctx.clone(), &jar).await? { + ctx.store.remove_session(session.id)?; + } + + Ok((jar.remove(SESSION_ID_COOKIE), Redirect::to("/"))) +} + 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/templates/base.html b/otter/src/web/templates/base.html index 3afd3e4..68e958f 100644 --- a/otter/src/web/templates/base.html +++ b/otter/src/web/templates/base.html @@ -15,6 +15,13 @@ a:hover {
{{ inner | safe }} diff --git a/otter/src/web/templates/views/login.html b/otter/src/web/templates/views/login.html index ecd0898..b81094c 100644 --- a/otter/src/web/templates/views/login.html +++ b/otter/src/web/templates/views/login.html @@ -1,5 +1,5 @@
-
+