diff --git a/src/api/v1/admin/auth.rs b/src/api/v1/admin/auth.rs index 91ac7c4..bfd7be7 100644 --- a/src/api/v1/admin/auth.rs +++ b/src/api/v1/admin/auth.rs @@ -17,10 +17,10 @@ use actix_identity::Identity; use actix_web::http::header; -use actix_web::{web, HttpResponse, Responder}; +use actix_web::{web, HttpResponse, Responder}; use serde::{Deserialize, Serialize}; -use super::{RedirectQuery, get_random}; +use super::{get_random, RedirectQuery}; use crate::errors::*; use crate::AppData; diff --git a/src/api/v1/bench.rs b/src/api/v1/bench.rs index bfbdb05..e50586d 100644 --- a/src/api/v1/bench.rs +++ b/src/api/v1/bench.rs @@ -24,7 +24,7 @@ use serde::{Deserialize, Serialize}; use sqlx::types::time::OffsetDateTime; use uuid::Uuid; -use super::{RedirectQuery, get_uuid}; +use super::{get_uuid, RedirectQuery}; use crate::errors::*; use crate::AppData; @@ -121,8 +121,6 @@ pub mod runners { } } - - #[my_codegen::get(path = "crate::V1_API_ROUTES.benches.register")] async fn register( data: AppData, diff --git a/src/main.rs b/src/main.rs index 252722f..bbb0b4d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -51,6 +51,7 @@ lazy_static! { pub static ref CSS: &'static str = FILES.get("./static/cache/bundle/css/main.css").unwrap(); + pub static ref JS: &'static str = FILES.get("./static/cache/bundle/bundle.js").unwrap(); diff --git a/src/pages/auth/login.rs b/src/pages/auth/login.rs index a6d0f42..55e26c1 100644 --- a/src/pages/auth/login.rs +++ b/src/pages/auth/login.rs @@ -22,6 +22,7 @@ use my_codegen::{get, post}; use sailfish::TemplateOnce; use crate::api::v1::admin::auth::runners; +use crate::api::v1::RedirectQuery; use crate::errors::*; use crate::pages::errors::ErrorPage; use crate::AppData; @@ -65,14 +66,22 @@ pub async fn login_submit( id: Identity, payload: web::Form, data: AppData, + path: web::Path, ) -> PageResult { let payload = payload.into_inner(); match runners::login_runner(&payload, &data).await { Ok(username) => { id.remember(username); - Ok(HttpResponse::Found() - .insert_header((header::LOCATION, PAGES.home)) - .finish()) + let path = path.into_inner(); + if let Some(redirect_to) = path.redirect_to { + Ok(HttpResponse::Found() + .insert_header((header::LOCATION, redirect_to)) + .finish()) + } else { + Ok(HttpResponse::Found() + .insert_header((header::LOCATION, PAGES.home)) + .finish()) + } } Err(e) => { let status = e.status_code(); diff --git a/src/pages/auth/mod.rs b/src/pages/auth/mod.rs index 35f31a6..a6c0d70 100644 --- a/src/pages/auth/mod.rs +++ b/src/pages/auth/mod.rs @@ -18,8 +18,6 @@ pub mod join; pub mod login; pub mod sudo; -pub use crate::api::v1::admin::get_admin_check_login; - pub fn services(cfg: &mut actix_web::web::ServiceConfig) { cfg.service(login::login); cfg.service(login::login_submit); @@ -28,10 +26,29 @@ pub fn services(cfg: &mut actix_web::web::ServiceConfig) { } pub mod routes { + use crate::middleware::auth::GetLoginRoute; + use url::Url; + pub struct Auth { pub login: &'static str, pub join: &'static str, } + + impl GetLoginRoute for Auth { + fn get_login_route(&self, src: Option<&str>) -> String { + if let Some(redirect_to) = src { + let mut url = Url::parse("http://x/").unwrap(); + url.set_path(self.login); + url.query_pairs_mut() + .append_pair("redirect_to", redirect_to); + let path = format!("{}/?{}", url.path(), url.query().unwrap()); + path + } else { + self.login.to_string() + } + } + } + impl Auth { pub const fn new() -> Auth { Auth { diff --git a/src/pages/mod.rs b/src/pages/mod.rs index c14368c..5e36f48 100644 --- a/src/pages/mod.rs +++ b/src/pages/mod.rs @@ -30,6 +30,10 @@ pub fn services(cfg: &mut ServiceConfig) { errors::services(cfg); } +pub fn get_page_check_login() -> crate::CheckLogin { + crate::CheckLogin::new(crate::PAGES.auth) +} + #[cfg(not(tarpaulin_include))] #[cfg(test)] mod tests { diff --git a/src/pages/panel/campaigns/delete.rs b/src/pages/panel/campaigns/delete.rs index 9b2b5cb..deaf050 100644 --- a/src/pages/panel/campaigns/delete.rs +++ b/src/pages/panel/campaigns/delete.rs @@ -25,7 +25,6 @@ use my_codegen::{get, post}; use sailfish::TemplateOnce; use uuid::Uuid; -use super::get_admin_check_login; use crate::api::v1::admin::auth::runners::{login_runner, Login, Password}; use crate::api::v1::admin::campaigns::runners; use crate::errors::*; @@ -60,7 +59,7 @@ async fn get_title( #[get( path = "PAGES.panel.campaigns.delete", - wrap = "get_admin_check_login()" + wrap = "crate::pages::get_page_check_login()" )] pub async fn delete_campaign( id: Identity, @@ -86,7 +85,7 @@ pub async fn delete_campaign( #[post( path = "PAGES.panel.campaigns.delete", - wrap = "get_admin_check_login()" + wrap = "crate::pages::get_page_check_login()" )] pub async fn delete_campaign_submit( id: Identity, diff --git a/src/pages/panel/campaigns/get.rs b/src/pages/panel/campaigns/get.rs index 73df5b4..20cb51c 100644 --- a/src/pages/panel/campaigns/get.rs +++ b/src/pages/panel/campaigns/get.rs @@ -22,7 +22,6 @@ //use crate::api::v1::admin::campaigns::{runners, GetFeedbackResp}; //use crate::AppData; //use crate::PAGES; -//use super::get_admin_check_login; // //#[derive(TemplateOnce)] //#[template(path = "panel/campaigns/get/index.html")] @@ -41,7 +40,7 @@ // //#[get( // path = "PAGES.panel.campaigns.get_feedback", -// wrap = "get_admin_check_login()" +// wrap = "crate::pages::get_page_check_login()" //)] //pub async fn get_feedback( // id: Identity, diff --git a/src/pages/panel/campaigns/mod.rs b/src/pages/panel/campaigns/mod.rs index 20d47d5..20fa43d 100644 --- a/src/pages/panel/campaigns/mod.rs +++ b/src/pages/panel/campaigns/mod.rs @@ -24,8 +24,6 @@ use crate::api::v1::admin::campaigns::{ use crate::AppData; use crate::PAGES; -use super::get_admin_check_login; - pub mod delete; pub mod get; pub mod new; @@ -85,7 +83,10 @@ impl HomePage { const PAGE: &str = "Campaigns"; -#[get(path = "PAGES.panel.campaigns.home", wrap = "get_admin_check_login()")] +#[get( + path = "PAGES.panel.campaigns.home", + wrap = "crate::pages::get_page_check_login()" +)] pub async fn home(data: AppData, id: Identity) -> impl Responder { let username = id.identity().unwrap(); let campaigns = list_campaign_runner(&username, &data).await.unwrap(); diff --git a/src/pages/panel/campaigns/new.rs b/src/pages/panel/campaigns/new.rs index 6e3af84..67e9c91 100644 --- a/src/pages/panel/campaigns/new.rs +++ b/src/pages/panel/campaigns/new.rs @@ -27,8 +27,6 @@ use crate::pages::errors::ErrorPage; use crate::AppData; use crate::PAGES; -use super::get_admin_check_login; - #[derive(Clone, TemplateOnce)] #[template(path = "panel/campaigns/new/index.html")] struct NewCampaign<'a> { @@ -55,14 +53,20 @@ lazy_static! { static ref INDEX: String = NewCampaign::default().render_once().unwrap(); } -#[get(path = "PAGES.panel.campaigns.new", wrap = "get_admin_check_login()")] +#[get( + path = "PAGES.panel.campaigns.new", + wrap = "crate::pages::get_page_check_login()" +)] pub async fn new_campaign() -> impl Responder { HttpResponse::Ok() .content_type("text/html; charset=utf-8") .body(&*INDEX) } -#[post(path = "PAGES.panel.campaigns.new", wrap = "get_admin_check_login()")] +#[post( + path = "PAGES.panel.campaigns.new", + wrap = "crate::pages::get_page_check_login()" +)] pub async fn new_campaign_submit( id: Identity, payload: web::Json, diff --git a/src/pages/panel/mod.rs b/src/pages/panel/mod.rs index 2db471d..2a55744 100644 --- a/src/pages/panel/mod.rs +++ b/src/pages/panel/mod.rs @@ -16,8 +16,6 @@ use actix_web::{http, HttpResponse, Responder}; use my_codegen::get; -pub use crate::api::v1::admin::get_admin_check_login; - use crate::PAGES; mod campaigns; @@ -49,7 +47,10 @@ pub fn services(cfg: &mut actix_web::web::ServiceConfig) { campaigns::services(cfg); } -#[get(path = "PAGES.panel.home", wrap = "get_admin_check_login()")] +#[get( + path = "PAGES.panel.home", + wrap = "crate::pages::get_page_check_login()" +)] pub async fn home() -> impl Responder { HttpResponse::Found() .insert_header((http::header::LOCATION, PAGES.panel.campaigns.home))