From 1089faaf932ad6c57d35766c7340ecf18cef5fd4 Mon Sep 17 00:00:00 2001 From: Luca Palmieri Date: Tue, 19 Jul 2022 01:31:31 +0100 Subject: [PATCH] [actix-identity] Fix visit deadline (#263) --- actix-identity/CHANGES.md | 4 +++- actix-identity/src/identity.rs | 17 +++++++++++++---- actix-identity/src/middleware.rs | 8 ++++++++ actix-identity/tests/integration/integration.rs | 17 +++++++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/actix-identity/CHANGES.md b/actix-identity/CHANGES.md index b1a0c5f31..6a2355a14 100644 --- a/actix-identity/CHANGES.md +++ b/actix-identity/CHANGES.md @@ -1,7 +1,9 @@ # Changes ## Unreleased - 2022-xx-xx - +- Fix visit deadline. [#263] + +[#263]: https://github.com/actix/actix-extras/pull/263 ## 0.5.1 - 2022-07-11 - Remove unnecessary dependencies. [#259] diff --git a/actix-identity/src/identity.rs b/actix-identity/src/identity.rs index 7a95a8d0b..0b6342736 100644 --- a/actix-identity/src/identity.rs +++ b/actix-identity/src/identity.rs @@ -152,10 +152,13 @@ impl Identity { pub fn login(ext: &Extensions, id: String) -> Result { let inner = IdentityInner::extract(ext); inner.session.insert(ID_KEY, id)?; - inner.session.insert( - LOGIN_UNIX_TIMESTAMP_KEY, - OffsetDateTime::now_utc().unix_timestamp(), - )?; + let now = OffsetDateTime::now_utc().unix_timestamp(); + if inner.is_login_deadline_enabled { + inner.session.insert(LOGIN_UNIX_TIMESTAMP_KEY, now)?; + } + if inner.is_visit_deadline_enabled { + inner.session.insert(LAST_VISIT_UNIX_TIMESTAMP_KEY, now)?; + } inner.session.renew(); Ok(Self(inner)) } @@ -220,6 +223,12 @@ impl Identity { .transpose() .map_err(anyhow::Error::from) } + + pub(crate) fn set_last_visited_at(&self) -> Result<(), anyhow::Error> { + let now = OffsetDateTime::now_utc().unix_timestamp(); + self.0.session.insert(LAST_VISIT_UNIX_TIMESTAMP_KEY, now)?; + Ok(()) + } } /// Extractor implementation for [`Identity`]. diff --git a/actix-identity/src/middleware.rs b/actix-identity/src/middleware.rs index d281f481c..893e623f6 100644 --- a/actix-identity/src/middleware.rs +++ b/actix-identity/src/middleware.rs @@ -162,6 +162,14 @@ fn enforce_policies(req: &ServiceRequest, configuration: &Configuration) { ) { identity.logout(); return; + } else { + if let Err(err) = identity.set_last_visited_at() { + tracing::warn!( + error.display = %err, + error.debug = ?err, + "Failed to set the last visited timestamp on `Identity` for an incoming request." + ); + } } } } diff --git a/actix-identity/tests/integration/integration.rs b/actix-identity/tests/integration/integration.rs index 71d6dc5ba..9753d4e2d 100644 --- a/actix-identity/tests/integration/integration.rs +++ b/actix-identity/tests/integration/integration.rs @@ -147,6 +147,23 @@ async fn login_deadline_does_not_log_users_out_before_their_time() { assert_eq!(body.user_id, Some(user_id)); } +#[actix_web::test] +async fn visit_deadline_does_not_log_users_out_before_their_time() { + // 1 hour + let visit_deadline = Duration::from_secs(60 * 60); + let app = TestApp::spawn_with_config( + IdentityMiddleware::builder().visit_deadline(Some(visit_deadline)), + ); + let user_id = user_id(); + + // Log-in + let body = app.post_login(user_id.clone()).await; + assert_eq!(body.user_id, Some(user_id.clone())); + + let body = app.get_current().await; + assert_eq!(body.user_id, Some(user_id)); +} + #[actix_web::test] async fn user_is_logged_out_when_visit_deadline_is_elapsed() { let visit_deadline = Duration::from_millis(10);