From 50df8eda36ac409dbdf67279cfbcaf984b36c4f9 Mon Sep 17 00:00:00 2001 From: hole-thu Date: Fri, 5 May 2023 22:38:52 +0800 Subject: [PATCH] auth backend from host and default frontend/backend --- src/login.rs | 47 +++++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/src/login.rs b/src/login.rs index 58901cd..3d9390a 100644 --- a/src/login.rs +++ b/src/login.rs @@ -10,30 +10,48 @@ use rocket::State; use std::env; use url::Url; -pub struct RefHeader(pub String); +#[derive(Debug)] +pub struct FrontendAddr(pub String); #[rocket::async_trait] -impl<'r> FromRequest<'r> for RefHeader { +impl<'r> FromRequest<'r> for FrontendAddr { type Error = (); async fn from_request(request: &'r Request<'_>) -> Outcome { - match request.headers().get_one("Referer") { - Some(h) => Outcome::Success(RefHeader(h.to_string())), - None => Outcome::Forward(()), - } + Outcome::Success(Self( + request + .headers() + .get_one("Referer") + .map(|s| s.to_string()) + .unwrap_or_else(|| env::var("DEFAULT_FRONTEND").unwrap()), + )) + } +} + +#[derive(Debug)] +pub struct BackendAddr(pub String); + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for BackendAddr { + type Error = (); + async fn from_request(request: &'r Request<'_>) -> Outcome { + Outcome::Success(Self( + request + .headers() + .get_one("Host") + .map(|s| format!("https://{}", s)) + .unwrap_or_else(|| env::var("DEFAULT_BACKEND").unwrap()), + )) } } #[get("/?p=cs")] -pub fn cs_login(r: RefHeader) -> Redirect { +pub fn cs_login(r: FrontendAddr, h: BackendAddr) -> Redirect { let mast_url = env::var("MAST_BASE_URL").unwrap(); let mast_cli = env::var("MAST_CLIENT").unwrap(); let mast_scope = env::var("MAST_SCOPE").unwrap(); let jump_to_url = Url::parse(&r.0).unwrap(); - - let mut redirect_url = env::var("AUTH_BACKEND_URL") - .map(|url| Url::parse(&url).unwrap()) - .unwrap_or_else(|_| jump_to_url.clone()); + let mut redirect_url = Url::parse(&h.0).unwrap(); redirect_url.set_path("/_login/cs/auth"); redirect_url = Url::parse_with_params( @@ -145,16 +163,13 @@ pub async fn cs_auth( } #[get("/gh")] -pub fn gh_login(r: RefHeader) -> Redirect { +pub fn gh_login(r: FrontendAddr, h: BackendAddr) -> Redirect { let gh_url = "https://github.com/login/oauth/authorize"; let gh_cli = env::var("GH_CLIENT").unwrap(); let gh_scope = "user:email"; let jump_to_url = Url::parse(&r.0).unwrap(); - - let mut redirect_url = env::var("AUTH_BACKEND_URL") - .map(|url| Url::parse(&url).unwrap()) - .unwrap_or_else(|_| jump_to_url.clone()); + let mut redirect_url = Url::parse(&h.0).unwrap(); redirect_url.set_path("/_login/gh/auth"); redirect_url = Url::parse_with_params(