diff --git a/src/api/v1/account/delete.rs b/src/api/v1/account/delete.rs index 7ebeb188..f4873e55 100644 --- a/src/api/v1/account/delete.rs +++ b/src/api/v1/account/delete.rs @@ -24,7 +24,7 @@ use crate::AppData; #[my_codegen::post( path = "crate::V1_API_ROUTES.account.delete", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] pub async fn delete_account( id: Identity, diff --git a/src/api/v1/account/email.rs b/src/api/v1/account/email.rs index 98f716d0..80086b14 100644 --- a/src/api/v1/account/email.rs +++ b/src/api/v1/account/email.rs @@ -55,7 +55,7 @@ pub async fn email_exists( /// update email #[my_codegen::post( path = "crate::V1_API_ROUTES.account.update_email", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] async fn set_email( id: Identity, diff --git a/src/api/v1/account/password.rs b/src/api/v1/account/password.rs index b0b37ab7..505e9cbb 100644 --- a/src/api/v1/account/password.rs +++ b/src/api/v1/account/password.rs @@ -70,7 +70,7 @@ async fn update_password_runner( #[my_codegen::post( path = "crate::V1_API_ROUTES.account.update_password", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] async fn update_user_password( id: Identity, diff --git a/src/api/v1/account/secret.rs b/src/api/v1/account/secret.rs index b7b9f2b1..781bbeaa 100644 --- a/src/api/v1/account/secret.rs +++ b/src/api/v1/account/secret.rs @@ -31,7 +31,7 @@ pub struct Secret { #[my_codegen::get( path = "crate::V1_API_ROUTES.account.get_secret", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] async fn get_secret(id: Identity, data: AppData) -> ServiceResult { let username = id.identity().unwrap(); @@ -49,7 +49,7 @@ async fn get_secret(id: Identity, data: AppData) -> ServiceResult) -> String { + if let Some(redirect_to) = src { + format!( + "{}?redirect_to={}", + self.login, + urlencoding::encode(redirect_to) + ) + } else { + self.login.to_string() + } + } + } } pub mod runners { @@ -214,14 +230,26 @@ async fn register( async fn login( id: Identity, payload: web::Json, + path: web::Path, data: AppData, ) -> ServiceResult { let username = runners::login_runner(payload.into_inner(), &data).await?; id.remember(username); - Ok(HttpResponse::Ok()) + // Ok(HttpResponse::Ok()) + + if let Some(redirect_to) = &path.redirect_to { + Ok(HttpResponse::Found() + .insert_header((header::LOCATION, redirect_to)) + .finish()) + } else { + Ok(HttpResponse::Ok().finish()) + } } -#[my_codegen::get(path = "crate::V1_API_ROUTES.auth.logout", wrap = "crate::CheckLogin")] +#[my_codegen::get( + path = "crate::V1_API_ROUTES.auth.logout", + wrap = "crate::api::v1::get_middleware()" +)] async fn signout(id: Identity) -> impl Responder { if id.identity().is_some() { id.forget(); diff --git a/src/api/v1/mcaptcha/create.rs b/src/api/v1/mcaptcha/create.rs index 066e3fad..455c6161 100644 --- a/src/api/v1/mcaptcha/create.rs +++ b/src/api/v1/mcaptcha/create.rs @@ -42,7 +42,7 @@ pub struct MCaptchaDetails { // so that the whole thing can be added/udpaed in a single stroke #[my_codegen::post( path = "crate::V1_API_ROUTES.captcha.create", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] pub async fn create( payload: web::Json, diff --git a/src/api/v1/mcaptcha/delete.rs b/src/api/v1/mcaptcha/delete.rs index 051d882a..634dbe24 100644 --- a/src/api/v1/mcaptcha/delete.rs +++ b/src/api/v1/mcaptcha/delete.rs @@ -30,7 +30,7 @@ pub struct DeleteCaptcha { #[my_codegen::post( path = "crate::V1_API_ROUTES.captcha.delete", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] async fn delete( payload: web::Json, diff --git a/src/api/v1/mcaptcha/easy.rs b/src/api/v1/mcaptcha/easy.rs index 676bbcbf..273ef983 100644 --- a/src/api/v1/mcaptcha/easy.rs +++ b/src/api/v1/mcaptcha/easy.rs @@ -96,7 +96,7 @@ impl TrafficPattern { #[my_codegen::post( path = "crate::V1_API_ROUTES.captcha.easy.create", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] async fn create( payload: web::Json, @@ -149,7 +149,7 @@ pub struct UpdateTrafficPattern { #[my_codegen::post( path = "crate::V1_API_ROUTES.captcha.easy.update", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] async fn update( payload: web::Json, diff --git a/src/api/v1/mcaptcha/get.rs b/src/api/v1/mcaptcha/get.rs index d5959d36..3319123c 100644 --- a/src/api/v1/mcaptcha/get.rs +++ b/src/api/v1/mcaptcha/get.rs @@ -25,7 +25,7 @@ use crate::AppData; #[my_codegen::post( path = "crate::V1_API_ROUTES.captcha.get", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] pub async fn get_captcha( payload: web::Json, diff --git a/src/api/v1/mcaptcha/stats.rs b/src/api/v1/mcaptcha/stats.rs index 3a90f22d..e84fbe7f 100644 --- a/src/api/v1/mcaptcha/stats.rs +++ b/src/api/v1/mcaptcha/stats.rs @@ -42,7 +42,7 @@ pub struct StatsPayload { #[my_codegen::post( path = "crate::V1_API_ROUTES.captcha.stats.get", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] pub async fn get( payload: web::Json, diff --git a/src/api/v1/mcaptcha/update.rs b/src/api/v1/mcaptcha/update.rs index 34ec09ea..a818edaf 100644 --- a/src/api/v1/mcaptcha/update.rs +++ b/src/api/v1/mcaptcha/update.rs @@ -29,7 +29,7 @@ use crate::AppData; #[my_codegen::post( path = "crate::V1_API_ROUTES.captcha.update_key", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] pub async fn update_key( payload: web::Json, @@ -79,7 +79,7 @@ pub struct UpdateCaptcha { #[my_codegen::post( path = "crate::V1_API_ROUTES.captcha.update", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] pub async fn update_captcha( payload: web::Json, diff --git a/src/api/v1/mod.rs b/src/api/v1/mod.rs index b59408fc..db6f9ccf 100644 --- a/src/api/v1/mod.rs +++ b/src/api/v1/mod.rs @@ -15,7 +15,9 @@ * along with this program. If not, see . */ +use actix_auth_middleware::Authentication; use actix_web::web::ServiceConfig; +use serde::Deserialize; pub mod account; pub mod auth; @@ -36,5 +38,14 @@ pub fn services(cfg: &mut ServiceConfig) { notifications::services(cfg); } +#[derive(Deserialize)] +pub struct RedirectQuery { + pub redirect_to: Option, +} + +pub fn get_middleware() -> Authentication { + Authentication::with_identity(ROUTES) +} + #[cfg(test)] mod tests; diff --git a/src/api/v1/notifications/add.rs b/src/api/v1/notifications/add.rs index 2c46a90b..ec035d40 100644 --- a/src/api/v1/notifications/add.rs +++ b/src/api/v1/notifications/add.rs @@ -32,7 +32,7 @@ pub struct AddNotification { /// route handler that adds a notification message #[my_codegen::post( path = "crate::V1_API_ROUTES.notifications.add", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] pub async fn add_notification( payload: web::Json, diff --git a/src/api/v1/notifications/get.rs b/src/api/v1/notifications/get.rs index 957a0d04..ce5e72f2 100644 --- a/src/api/v1/notifications/get.rs +++ b/src/api/v1/notifications/get.rs @@ -55,7 +55,7 @@ impl From for NotificationResp { /// route handler that gets all unread notifications #[my_codegen::get( path = "crate::V1_API_ROUTES.notifications.get", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] pub async fn get_notification( data: AppData, diff --git a/src/api/v1/notifications/mark_read.rs b/src/api/v1/notifications/mark_read.rs index d12e9e7c..f51f5e31 100644 --- a/src/api/v1/notifications/mark_read.rs +++ b/src/api/v1/notifications/mark_read.rs @@ -39,7 +39,7 @@ pub struct NotificationResp { /// route handler that marks a notification read #[my_codegen::post( path = "crate::V1_API_ROUTES.notifications.mark_read", - wrap = "crate::CheckLogin" + wrap = "crate::api::v1::get_middleware()" )] pub async fn mark_read( data: AppData, diff --git a/src/api/v1/routes.rs b/src/api/v1/routes.rs index f3476119..0159b91d 100644 --- a/src/api/v1/routes.rs +++ b/src/api/v1/routes.rs @@ -14,6 +14,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ +use actix_auth_middleware::GetLoginRoute; use super::account::routes::Account; use super::auth::routes::Auth; @@ -45,3 +46,9 @@ impl Routes { } } } + +impl GetLoginRoute for Routes { + fn get_login_route(&self, src: Option<&str>) -> String { + self.auth.get_login_route(src) + } +}