diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 000000000..13566b81b
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/actix-extras.iml b/.idea/actix-extras.iml
new file mode 100644
index 000000000..cbb03d3f1
--- /dev/null
+++ b/.idea/actix-extras.iml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 000000000..64e1ffd8a
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 000000000..35eb1ddfb
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/actix-identity/CHANGES.md b/actix-identity/CHANGES.md
index c06efddc4..6b0b09bf4 100644
--- a/actix-identity/CHANGES.md
+++ b/actix-identity/CHANGES.md
@@ -2,6 +2,10 @@
## Unreleased
+## 0.7.0
+
+- Updated the usage of HashMap with serde Map to be compatible with `actix-session@0.9.0`.
+
## 0.6.0
- Add `error` module.
diff --git a/actix-identity/Cargo.toml b/actix-identity/Cargo.toml
index cadff8f23..4667a20db 100644
--- a/actix-identity/Cargo.toml
+++ b/actix-identity/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "actix-identity"
-version = "0.6.0"
+version = "0.7.0"
authors = [
"Nikolay Kim ",
"Luca Palmieri ",
@@ -19,19 +19,20 @@ all-features = true
[dependencies]
actix-service = "2"
-actix-session = "0.8"
+actix-session = "0.9"
actix-utils = "3"
actix-web = { version = "4", default-features = false, features = ["cookies", "secure-cookies"] }
derive_more = "0.99.7"
futures-core = "0.3.7"
serde = { version = "1", features = ["derive"] }
+serde_json = "1.0.108"
tracing = { version = "0.1.30", default-features = false, features = ["log"] }
[dev-dependencies]
actix-http = "3"
actix-web = { version = "4", default-features = false, features = ["macros", "cookies", "secure-cookies"] }
-actix-session = { version = "0.8", features = ["redis-rs-session", "cookie-session"] }
+actix-session = { version = "0.9", features = ["redis-rs-session", "cookie-session"] }
env_logger = "0.10"
reqwest = { version = "0.11", default-features = false, features = ["cookies", "json"] }
diff --git a/actix-identity/src/identity.rs b/actix-identity/src/identity.rs
index 9a75ede72..735c329ca 100644
--- a/actix-identity/src/identity.rs
+++ b/actix-identity/src/identity.rs
@@ -6,6 +6,7 @@ use actix_web::{
http::StatusCode,
Error, FromRequest, HttpMessage, HttpRequest, HttpResponse,
};
+use serde_json::Value;
use crate::{
config::LogoutBehaviour,
@@ -153,13 +154,17 @@ impl Identity {
/// ```
pub fn login(ext: &Extensions, id: String) -> Result {
let inner = IdentityInner::extract(ext);
- inner.session.insert(ID_KEY, id)?;
+ inner.session.insert(ID_KEY, Value::from(id));
let now = OffsetDateTime::now_utc().unix_timestamp();
if inner.is_login_deadline_enabled {
- inner.session.insert(LOGIN_UNIX_TIMESTAMP_KEY, now)?;
+ inner
+ .session
+ .insert(LOGIN_UNIX_TIMESTAMP_KEY, Value::from(now));
}
if inner.is_visit_deadline_enabled {
- inner.session.insert(LAST_VISIT_UNIX_TIMESTAMP_KEY, now)?;
+ inner
+ .session
+ .insert(LAST_VISIT_UNIX_TIMESTAMP_KEY, Value::from(now));
}
inner.session.renew();
Ok(Self(inner))
@@ -230,7 +235,9 @@ impl Identity {
pub(crate) fn set_last_visited_at(&self) -> Result<(), LoginError> {
let now = OffsetDateTime::now_utc().unix_timestamp();
- self.0.session.insert(LAST_VISIT_UNIX_TIMESTAMP_KEY, now)?;
+ self.0
+ .session
+ .insert(LAST_VISIT_UNIX_TIMESTAMP_KEY, Value::from(now));
Ok(())
}
}
diff --git a/actix-identity/tests/integration/test_app.rs b/actix-identity/tests/integration/test_app.rs
index 89ba665ed..de288d369 100644
--- a/actix-identity/tests/integration/test_app.rs
+++ b/actix-identity/tests/integration/test_app.rs
@@ -4,6 +4,7 @@ use actix_identity::{config::IdentityMiddlewareBuilder, Identity, IdentityMiddle
use actix_session::{Session, SessionStatus};
use actix_web::{web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer};
use serde::{Deserialize, Serialize};
+use serde_json::Value;
use crate::fixtures::session_middleware;
@@ -136,7 +137,7 @@ async fn increment(session: Session, user: Option) -> HttpResponse {
.get::("counter")
.unwrap_or(Some(0))
.map_or(1, |inner| inner + 1);
- session.insert("counter", counter).unwrap();
+ session.insert("counter", Value::from(counter));
HttpResponse::Ok().json(&EndpointResponse {
user_id,
diff --git a/actix-session/CHANGES.md b/actix-session/CHANGES.md
index cf840a947..cece30df9 100644
--- a/actix-session/CHANGES.md
+++ b/actix-session/CHANGES.md
@@ -2,6 +2,11 @@
## Unreleased
+## 0.9.0
+
+- Replace the usages of `HashMap` with serde `Map`.
+- Fix double serialization when inserting values into the session.
+
## 0.8.0
- Set secure attribute when adding a session removal cookie.
diff --git a/actix-session/Cargo.toml b/actix-session/Cargo.toml
index 761bef971..ebe8c038c 100644
--- a/actix-session/Cargo.toml
+++ b/actix-session/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "actix-session"
-version = "0.8.0"
+version = "0.9.0"
authors = [
"Nikolay Kim ",
"Luca Palmieri ",
diff --git a/actix-session/examples/authentication.rs b/actix-session/examples/authentication.rs
index 400971051..d0867e21d 100644
--- a/actix-session/examples/authentication.rs
+++ b/actix-session/examples/authentication.rs
@@ -5,6 +5,7 @@ use actix_web::{
middleware, web, App, Error, HttpResponse, HttpServer, Responder,
};
use serde::{Deserialize, Serialize};
+use serde_json::Value;
#[derive(Deserialize)]
struct Credentials {
@@ -54,7 +55,7 @@ async fn login(
let credentials = credentials.into_inner();
match User::authenticate(credentials) {
- Ok(user) => session.insert("user_id", user.id).unwrap(),
+ Ok(user) => session.insert("user_id", Value::from(user.id)),
Err(err) => return Err(InternalError::from_response("", err).into()),
};
diff --git a/actix-session/examples/basic.rs b/actix-session/examples/basic.rs
index f1f08ae66..9e8e470d5 100644
--- a/actix-session/examples/basic.rs
+++ b/actix-session/examples/basic.rs
@@ -1,5 +1,6 @@
use actix_session::{storage::RedisActorSessionStore, Session, SessionMiddleware};
use actix_web::{cookie::Key, middleware, web, App, Error, HttpRequest, HttpServer, Responder};
+use serde_json::Value;
/// simple handler
async fn index(req: HttpRequest, session: Session) -> Result {
@@ -8,9 +9,9 @@ async fn index(req: HttpRequest, session: Session) -> Result("counter")? {
println!("SESSION value: {count}");
- session.insert("counter", count + 1)?;
+ session.insert("counter", Value::from(count + 1));
} else {
- session.insert("counter", 1)?;
+ session.insert("counter", Value::from(1));
}
Ok("Welcome!")
diff --git a/actix-session/src/lib.rs b/actix-session/src/lib.rs
index fbacce290..e27748960 100644
--- a/actix-session/src/lib.rs
+++ b/actix-session/src/lib.rs
@@ -69,6 +69,7 @@
//!
//! ```no_run
//! use actix_web::Error;
+//! use serde_json::Value;
//! use actix_session::Session;
//!
//! fn index(session: Session) -> Result<&'static str, Error> {
@@ -76,9 +77,9 @@
//! if let Some(count) = session.get::("counter")? {
//! println!("SESSION value: {}", count);
//! // modify the session state
-//! session.insert("counter", count + 1)?;
+//! session.insert("counter", Value::from(count + 1));
//! } else {
-//! session.insert("counter", 1)?;
+//! session.insert("counter", Value::from(1));
//! }
//!
//! Ok("Welcome!")
@@ -207,7 +208,7 @@ pub mod test_helpers {
App, HttpResponse, Result,
};
use serde::{Deserialize, Serialize};
- use serde_json::json;
+ use serde_json::{json, Value};
use crate::{
config::{CookieContentSecurity, PersistentSession, TtlExtensionPolicy},
@@ -238,7 +239,7 @@ pub mod test_helpers {
.build(),
)
.service(web::resource("/").to(|ses: Session| async move {
- let _ = ses.insert("counter", 100);
+ ses.insert("counter", Value::from(100));
"test"
}))
.service(web::resource("/test/").to(|ses: Session| async move {
@@ -286,7 +287,7 @@ pub mod test_helpers {
.build(),
)
.service(web::resource("/").to(|ses: Session| async move {
- let _ = ses.insert("counter", 100);
+ ses.insert("counter", Value::from(100));
"test"
}))
.service(web::resource("/test/").to(|| async move { "no-changes-in-session" })),
@@ -328,7 +329,7 @@ pub mod test_helpers {
.build(),
)
.service(web::resource("/").to(|ses: Session| async move {
- let _ = ses.insert("counter", 100);
+ ses.insert("counter", Value::from(100));
"test"
}))
.service(web::resource("/test/").to(|| async move { "no-changes-in-session" })),
@@ -674,7 +675,7 @@ pub mod test_helpers {
.get::("counter")
.unwrap_or(Some(0))
.map_or(1, |inner| inner + 1);
- session.insert("counter", counter)?;
+ session.insert("counter", Value::from(counter));
Ok(HttpResponse::Ok().json(&IndexResponse { user_id, counter }))
}
@@ -693,7 +694,7 @@ pub mod test_helpers {
async fn login(user_id: web::Json, session: Session) -> Result {
let id = user_id.into_inner().user_id;
- session.insert("user_id", &id)?;
+ session.insert("user_id", Value::from(id.clone()));
session.renew();
let counter: i32 = session
diff --git a/actix-session/src/middleware.rs b/actix-session/src/middleware.rs
index 9bab74bf3..d640f6528 100644
--- a/actix-session/src/middleware.rs
+++ b/actix-session/src/middleware.rs
@@ -1,5 +1,5 @@
-use std::{collections::HashMap, convert::TryInto, fmt, future::Future, pin::Pin, rc::Rc};
-
+use std::{ convert::TryInto, fmt, future::Future, pin::Pin, rc::Rc};
+use serde_json::{Map,Value};
use actix_utils::future::{ready, Ready};
use actix_web::{
body::MessageBody,
@@ -360,7 +360,7 @@ fn extract_session_key(req: &ServiceRequest, config: &CookieConfiguration) -> Op
async fn load_session_state(
session_key: Option,
storage_backend: &Store,
-) -> Result<(Option, HashMap), actix_web::Error> {
+) -> Result<(Option, Map), actix_web::Error> {
if let Some(session_key) = session_key {
match storage_backend.load(&session_key).await {
Ok(state) => {
@@ -378,7 +378,7 @@ async fn load_session_state(
empty session."
);
- Ok((None, HashMap::new()))
+ Ok((None, Map::new()))
}
}
@@ -390,14 +390,14 @@ async fn load_session_state(
"Invalid session state, creating a new empty session."
);
- Ok((Some(session_key), HashMap::new()))
+ Ok((Some(session_key), Map::new()))
}
LoadError::Other(err) => Err(e500(err)),
},
}
} else {
- Ok((None, HashMap::new()))
+ Ok((None, Map::new()))
}
}
diff --git a/actix-session/src/session.rs b/actix-session/src/session.rs
index 1cd20cd42..f76f90f51 100644
--- a/actix-session/src/session.rs
+++ b/actix-session/src/session.rs
@@ -1,11 +1,3 @@
-use std::{
- cell::{Ref, RefCell},
- collections::HashMap,
- error::Error as StdError,
- mem,
- rc::Rc,
-};
-
use actix_utils::future::{ready, Ready};
use actix_web::{
body::BoxBody,
@@ -15,7 +7,14 @@ use actix_web::{
};
use anyhow::Context;
use derive_more::{Display, From};
-use serde::{de::DeserializeOwned, Serialize};
+use serde::de::DeserializeOwned;
+use serde_json::{Map, Value};
+use std::{
+ cell::{Ref, RefCell},
+ error::Error as StdError,
+ mem,
+ rc::Rc,
+};
/// The primary interface to access and modify session state.
///
@@ -23,14 +22,15 @@ use serde::{de::DeserializeOwned, Serialize};
/// request handlers and it will be automatically extracted from the incoming request.
///
/// ```
+/// use serde_json::Value;
/// use actix_session::Session;
///
/// async fn index(session: Session) -> actix_web::Result<&'static str> {
/// // access session data
/// if let Some(count) = session.get::("counter")? {
-/// session.insert("counter", count + 1)?;
+/// session.insert("counter", Value::from(count + 1));
/// } else {
-/// session.insert("counter", 1)?;
+/// session.insert("counter", Value::from(1));
/// }
///
/// Ok("Welcome!")
@@ -70,7 +70,7 @@ pub enum SessionStatus {
#[derive(Default)]
struct SessionInner {
- state: HashMap,
+ state: Map,
status: SessionStatus,
}
@@ -79,9 +79,9 @@ impl Session {
///
/// It returns an error if it fails to deserialize as `T` the JSON value associated with `key`.
pub fn get(&self, key: &str) -> Result