From 4491fbb6f25d0eebe21392e4d1f95b6cc2566d70 Mon Sep 17 00:00:00 2001 From: realaravinth Date: Wed, 13 Oct 2021 14:18:13 +0530 Subject: [PATCH] implement redirect to source on admin login endpoint --- src/api/v1/admin/auth.rs | 14 +++++++++++--- src/api/v1/admin/mod.rs | 2 +- src/api/v1/bench.rs | 9 +++------ src/api/v1/mod.rs | 6 ++++++ 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/api/v1/admin/auth.rs b/src/api/v1/admin/auth.rs index 0a35821..91ac7c4 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::get_random; +use super::{RedirectQuery, get_random}; use crate::errors::*; use crate::AppData; @@ -231,12 +231,20 @@ async fn register( async fn login( id: Identity, payload: web::Json, + path: web::Query, data: AppData, ) -> ServiceResult { let payload = payload.into_inner(); let username = runners::login_runner(&payload, &data).await?; + let path = path.into_inner(); id.remember(username); - 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().into()) + } } #[my_codegen::get( path = "crate::V1_API_ROUTES.admin.auth.logout", diff --git a/src/api/v1/admin/mod.rs b/src/api/v1/admin/mod.rs index 7123d0c..4d0cd0b 100644 --- a/src/api/v1/admin/mod.rs +++ b/src/api/v1/admin/mod.rs @@ -22,7 +22,7 @@ pub mod campaigns; #[cfg(test)] mod tests; -pub use super::{get_random, get_uuid}; +pub use super::{get_random, get_uuid, RedirectQuery}; pub fn services(cfg: &mut ServiceConfig) { auth::services(cfg); diff --git a/src/api/v1/bench.rs b/src/api/v1/bench.rs index 8a8f6cf..bfbdb05 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::get_uuid; +use super::{RedirectQuery, get_uuid}; use crate::errors::*; use crate::AppData; @@ -121,16 +121,13 @@ pub mod runners { } } -#[derive(Deserialize)] -pub struct Query { - pub redirect_to: Option, -} + #[my_codegen::get(path = "crate::V1_API_ROUTES.benches.register")] async fn register( data: AppData, id: Identity, - path: web::Query, + path: web::Query, ) -> ServiceResult { let uuid = runners::register_runner(&data).await?; id.remember(uuid.to_string()); diff --git a/src/api/v1/mod.rs b/src/api/v1/mod.rs index c131a7c..5b1ad1c 100644 --- a/src/api/v1/mod.rs +++ b/src/api/v1/mod.rs @@ -15,6 +15,7 @@ * along with this program. If not, see . */ use actix_web::web::ServiceConfig; +use serde::Deserialize; use uuid::Uuid; pub mod admin; @@ -45,3 +46,8 @@ pub fn get_random(len: usize) -> String { pub fn get_uuid() -> Uuid { Uuid::new_v4() } + +#[derive(Deserialize)] +pub struct RedirectQuery { + pub redirect_to: Option, +}