use crate::data::current_user::CurrentUser; use crate::data::from_request_redirect::FromRequestRedirect; use crate::data::login_redirect::{get_2fa_url, LoginRedirect}; use actix_web::dev::Payload; use actix_web::{FromRequest, HttpRequest}; use std::future::Future; use std::pin::Pin; pub struct CriticalRoute; impl FromRequest for CriticalRoute { type Error = FromRequestRedirect; type Future = Pin>>>; fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future { let req = req.clone(); Box::pin(async move { let current_user = CurrentUser::from_request(&req, &mut Payload::None) .await .expect("Failed to extract user identity!"); if current_user.should_request_2fa_for_critical_functions() { let uri = get_2fa_url(&LoginRedirect::from_req(&req), true); return Err(FromRequestRedirect::new(uri)); } Ok(Self) }) } }