From fc92b9452a87013a4ac5935ab1aafeacfd3ea901 Mon Sep 17 00:00:00 2001 From: Pierre Hubert Date: Tue, 5 Apr 2022 17:40:15 +0200 Subject: [PATCH] Easily get current signed in user in requests --- src/controllers/settings_controller.rs | 16 +++------- src/data/current_user.rs | 42 ++++++++++++++++++++++++++ src/data/mod.rs | 3 +- src/data/remote_ip.rs | 2 +- 4 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 src/data/current_user.rs diff --git a/src/controllers/settings_controller.rs b/src/controllers/settings_controller.rs index 379e409..e3bd398 100644 --- a/src/controllers/settings_controller.rs +++ b/src/controllers/settings_controller.rs @@ -1,5 +1,4 @@ use actix::Addr; -use actix_identity::Identity; use actix_web::{HttpResponse, Responder, web}; use askama::Template; @@ -7,8 +6,8 @@ use crate::actors::{bruteforce_actor, users_actor}; use crate::actors::bruteforce_actor::BruteForceActor; use crate::actors::users_actor::UsersActor; use crate::constants::{APP_NAME, MAX_FAILED_LOGIN_ATTEMPTS, MIN_PASS_LEN}; +use crate::data::current_user::CurrentUser; use crate::data::remote_ip::RemoteIP; -use crate::data::session_identity::SessionIdentity; use crate::data::user::User; #[derive(Template)] @@ -55,11 +54,8 @@ struct ChangePasswordPage { } /// Account details page -pub async fn account_settings_details_route(id: Identity, users: web::Data>) -> impl Responder { - let user: User = users.send( - users_actor::GetUserRequest(SessionIdentity(&id).user_id()) - ).await.unwrap().0.unwrap(); - +pub async fn account_settings_details_route(user: CurrentUser) -> impl Responder { + let user = user.into(); HttpResponse::Ok() .body(AccountDetailsPage { _parent: BaseSettingsPage::get("Account details", &user, None, None).await, @@ -78,7 +74,7 @@ pub struct PassChangeRequest { } /// Change password route -pub async fn change_password_route(id: Identity, +pub async fn change_password_route(user: CurrentUser, users: web::Data>, req: Option>, bruteforce: web::Data>, @@ -86,9 +82,7 @@ pub async fn change_password_route(id: Identity, let mut danger = None; let mut success = None; - let user: User = users.send( - users_actor::GetUserRequest(SessionIdentity(&id).user_id()) - ).await.unwrap().0.unwrap(); + let user: User = user.into(); let failed_attempts = bruteforce.send(bruteforce_actor::CountFailedAttempt { ip: remote_ip.into() }).await.unwrap(); if failed_attempts > MAX_FAILED_LOGIN_ATTEMPTS { diff --git a/src/data/current_user.rs b/src/data/current_user.rs new file mode 100644 index 0000000..7d424a4 --- /dev/null +++ b/src/data/current_user.rs @@ -0,0 +1,42 @@ +use std::future::Future; +use std::pin::Pin; + +use actix::Addr; +use actix_identity::Identity; +use actix_web::{Error, FromRequest, HttpRequest, web}; +use actix_web::dev::Payload; + +use crate::actors::users_actor; +use crate::actors::users_actor::UsersActor; +use crate::data::session_identity::SessionIdentity; +use crate::data::user::User; + +pub struct CurrentUser(User); + +impl From for User { + fn from(user: CurrentUser) -> Self { + user.0 + } +} + +impl FromRequest for CurrentUser { + type Error = Error; + type Future = Pin>>>; + + fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future { + let user_actor: &web::Data> = req.app_data().expect("UserActor undefined!"); + let user_actor: Addr = user_actor.as_ref().clone(); + let identity: Identity = Identity::from_request(req, payload).into_inner() + .expect("Failed to get identity!"); + let user_id = SessionIdentity(&identity).user_id(); + + + Box::pin(async move { + let user: User = user_actor.send( + users_actor::GetUserRequest(user_id) + ).await.unwrap().0.unwrap(); + + Ok(CurrentUser(user)) + }) + } +} \ No newline at end of file diff --git a/src/data/mod.rs b/src/data/mod.rs index 29d021e..98ff0e9 100644 --- a/src/data/mod.rs +++ b/src/data/mod.rs @@ -3,4 +3,5 @@ pub mod entity_manager; pub mod service; pub mod session_identity; pub mod user; -pub mod remote_ip; \ No newline at end of file +pub mod remote_ip; +pub mod current_user; \ No newline at end of file diff --git a/src/data/remote_ip.rs b/src/data/remote_ip.rs index 9826e90..1fd803f 100644 --- a/src/data/remote_ip.rs +++ b/src/data/remote_ip.rs @@ -18,7 +18,7 @@ impl From for IpAddr { impl FromRequest for RemoteIP { type Error = Error; - type Future = Ready>; + type Future = Ready>; #[inline] fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future {