From 9617bf08b07d3b9ac86e5cb884d32b267860605d Mon Sep 17 00:00:00 2001 From: eraden Date: Sun, 28 Jan 2024 20:03:35 +0100 Subject: [PATCH] Fix paths, experiment with instance lookup --- .../jet-api/src/extractors/require_instance.rs | 8 +++++++- crates/jet-api/src/http/api/authentication.rs | 17 +++++++++++------ .../src/http/api/authentication/sign_out.rs | 2 ++ .../src/http/api/authentication/social_auth.rs | 4 +++- crates/jet-api/src/http/api/config.rs | 1 + crates/jet-api/src/http/api/mod.rs | 4 ++-- crates/jet-api/src/http/api/users.rs | 7 ++++++- crates/jet-api/src/main.rs | 2 ++ 8 files changed, 34 insertions(+), 11 deletions(-) diff --git a/crates/jet-api/src/extractors/require_instance.rs b/crates/jet-api/src/extractors/require_instance.rs index aaea0ac..2b4211c 100644 --- a/crates/jet-api/src/extractors/require_instance.rs +++ b/crates/jet-api/src/extractors/require_instance.rs @@ -1,7 +1,8 @@ -use actix_web::{web::Data, FromRequest}; +use actix_web::{guard::Guard, web::Data, FromRequest}; use derive_more::*; use futures_util::{future::LocalBoxFuture, FutureExt}; use sea_orm::DatabaseConnection; +use tracing::warn; #[derive(Debug, Display)] #[display(fmt = "{{\"error\":\"Instance is not configured\"}}")] @@ -27,10 +28,12 @@ impl FromRequest for RequireInstance { let db = req.app_data::>().cloned(); async move { let Some(db) = db else { + warn!("Failed to fetch database connection fot required instance configured"); return Err(NoInstance); }; use sea_orm::EntityTrait; let Ok(Some(instance)) = entities::prelude::Instances::find().one(&**db).await else { + warn!("No instance found"); return Err(NoInstance); }; Ok(Self(instance)) @@ -53,13 +56,16 @@ impl FromRequest for RequireInstanceConfigured { let db = req.app_data::>().cloned(); async move { let Some(db) = db else { + warn!("Failed to fetch database connection fot required instance configured"); return Err(NoInstance); }; use sea_orm::EntityTrait; let Ok(Some(instance)) = entities::prelude::Instances::find().one(&**db).await else { + warn!("No instance found"); return Err(NoInstance); }; if !instance.is_setup_done { + warn!("Instance is not configured"); return Err(NoInstance); } return Ok(Self(instance)); diff --git a/crates/jet-api/src/http/api/authentication.rs b/crates/jet-api/src/http/api/authentication.rs index 80df359..f4eeeea 100644 --- a/crates/jet-api/src/http/api/authentication.rs +++ b/crates/jet-api/src/http/api/authentication.rs @@ -3,6 +3,7 @@ use crate::session::AppClaims; use actix_jwt_session::{ Duration, Hashing, JwtTtl, RefreshTtl, SessionStorage, JWT_HEADER_NAME, REFRESH_HEADER_NAME, }; +use actix_web::web::scope; use actix_web::web::{Data, ServiceConfig}; use actix_web::{HttpRequest, HttpResponse}; use entities::prelude::Users; @@ -25,12 +26,16 @@ pub struct AuthResponseBody { } pub fn configure(http_client: reqwest::Client, config: &mut ServiceConfig) { - config - .service(email_check::email_check) - .service(sign_in::sign_in) - .service(sign_up::sign_up) - .service(sign_out::sign_out); - social_auth::configure(http_client, config); + config.service( + scope("") + .service(email_check::email_check) + .service(sign_in::sign_in) + .service(sign_up::sign_up) + .service(sign_out::sign_out) + .configure(|c| { + social_auth::configure(http_client, c); + }), + ); } #[derive(Debug, Clone, Copy, derive_more::Display)] diff --git a/crates/jet-api/src/http/api/authentication/sign_out.rs b/crates/jet-api/src/http/api/authentication/sign_out.rs index b9e7437..3c0b936 100644 --- a/crates/jet-api/src/http/api/authentication/sign_out.rs +++ b/crates/jet-api/src/http/api/authentication/sign_out.rs @@ -7,6 +7,7 @@ use sea_orm::prelude::*; use sea_orm::Set; use serde_json::json; +use crate::extractors::RequireInstanceConfigured; use crate::models::{Error, JsonError}; use crate::session::AppClaims; use crate::utils::extract_req_ip; @@ -14,6 +15,7 @@ use crate::utils::extract_req_ip; #[post("/sign-out")] pub async fn sign_out( req: HttpRequest, + _: RequireInstanceConfigured, db: Data, claims: Authenticated, session: Data, diff --git a/crates/jet-api/src/http/api/authentication/social_auth.rs b/crates/jet-api/src/http/api/authentication/social_auth.rs index 95f8861..3921c65 100644 --- a/crates/jet-api/src/http/api/authentication/social_auth.rs +++ b/crates/jet-api/src/http/api/authentication/social_auth.rs @@ -35,6 +35,7 @@ use sea_orm::{ use tracing::{debug, error, warn}; use crate::{ + extractors::RequireInstanceConfigured, http::OAuthError, models::{Error, JsonError}, }; @@ -57,7 +58,7 @@ macro_rules! init_flow_service { ($provider: expr, $flow: expr) => { web::resource(std::concat!("/auth/", $provider)).get({ let flow = $flow.clone(); - move || { + move |_: RequireInstanceConfigured| { let flow = flow.clone(); async move { let flow = flow.clone(); @@ -77,6 +78,7 @@ macro_rules! flow_callback { ($provider: expr, $flow: expr) => {{ web::resource(std::concat!("/auth/", $provider, "/callback")).get( move |req: HttpRequest, + _: RequireInstanceConfigured, db: Data, event_bus: Data, session: Data| { diff --git a/crates/jet-api/src/http/api/config.rs b/crates/jet-api/src/http/api/config.rs index 21037dc..3051ae0 100644 --- a/crates/jet-api/src/http/api/config.rs +++ b/crates/jet-api/src/http/api/config.rs @@ -7,6 +7,7 @@ use actix_web::{ use crate::config::ApplicationConfig; pub fn configure(config: &mut ServiceConfig) { + // config.service(actix_web::web::resource("").guard(actix_web::guard::fn_guard(f))) config.service(configs); } diff --git a/crates/jet-api/src/http/api/mod.rs b/crates/jet-api/src/http/api/mod.rs index 6708b92..c55f8af 100644 --- a/crates/jet-api/src/http/api/mod.rs +++ b/crates/jet-api/src/http/api/mod.rs @@ -9,7 +9,7 @@ pub fn configure(http_client: reqwest::Client, config: &mut ServiceConfig) { config.service( scope("/api") .configure(config::configure) - .configure(users::configure), + .configure(users::configure) + .configure(|c| authentication::configure(http_client, c)), ); - authentication::configure(http_client, config); } diff --git a/crates/jet-api/src/http/api/users.rs b/crates/jet-api/src/http/api/users.rs index e6949e7..74fd9f7 100644 --- a/crates/jet-api/src/http/api/users.rs +++ b/crates/jet-api/src/http/api/users.rs @@ -1,3 +1,4 @@ +use crate::extractors::RequireInstanceConfigured; use crate::session::AppClaims; use actix_jwt_session::Authenticated; use actix_web::get; @@ -12,7 +13,11 @@ pub fn configure(config: &mut ServiceConfig) { } #[get("/me")] -async fn retrieve(session: Authenticated, db: Data) -> HttpResponse { +async fn retrieve( + _: RequireInstanceConfigured, + session: Authenticated, + db: Data, +) -> HttpResponse { match Users::find_by_id(session.account_id()).one(&**db).await { Ok(user) => HttpResponse::Ok().json(user), Err(_error) => HttpResponse::BadRequest().finish(), diff --git a/crates/jet-api/src/main.rs b/crates/jet-api/src/main.rs index 9936409..b914266 100644 --- a/crates/jet-api/src/main.rs +++ b/crates/jet-api/src/main.rs @@ -1,6 +1,7 @@ use std::env; use actix_jwt_session::*; +use actix_web::middleware::NormalizePath; use actix_web::{web::Data, App, HttpServer}; pub use jet_contract::event_bus::Client as EventBusClient; pub use jet_contract::{deadpool_redis, redis, RedisClient}; @@ -90,6 +91,7 @@ async fn main() { .app_data(Data::new(db.clone())) .app_data(application_config.clone()) .app_data(event_bus.clone()) + .wrap(NormalizePath::trim()) .wrap(factory.clone()) .wrap(actix_web::middleware::Logger::default()) .configure(|config| http::configure(http_client.clone(), config))