Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ derive_builder = { version = "0.20" }
dyn-clone = { version = "1.0" }
eyre = { version = "0.6" }
fernet = { version = "0.2", default-features = false, features = ["rustcrypto"] }
# futures = { version = "0.3" }
futures-util = { version = "0.3" }
itertools = { version = "0.14" }
mockall_double = { version = "0.3" }
Expand Down
394 changes: 219 additions & 175 deletions src/assignment/backend/sql/assignment/list.rs

Large diffs are not rendered by default.

40 changes: 25 additions & 15 deletions src/identity/backends/sql/authenticate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ mod tests {
let db = MockDatabase::new(DatabaseBackend::Postgres).into_connection();
let config = Config::default();
assert!(
!should_lock(&config, &db, &get_local_user_mock())
!should_lock(&config, &db, &get_local_user_mock("user_id"))
.await
.unwrap(),
"Default config does not request any validation and user is not considered locked"
Expand Down Expand Up @@ -233,7 +233,7 @@ mod tests {
#[tokio::test]
async fn test_should_lock_no_failed_auth_at() {
let db = MockDatabase::new(DatabaseBackend::Postgres)
.append_query_results([vec![get_local_user_mock()]])
.append_query_results([vec![get_local_user_mock("user_id")]])
.into_connection();
let mut config = Config::default();
config.security_compliance.lockout_failure_attempts = Some(5);
Expand Down Expand Up @@ -273,7 +273,7 @@ mod tests {
#[tokio::test]
async fn test_should_lock_expired() {
let db = MockDatabase::new(DatabaseBackend::Postgres)
.append_query_results([vec![get_local_user_mock()]])
.append_query_results([vec![get_local_user_mock("user_id")]])
.into_connection();
let mut config = Config::default();
config.security_compliance.lockout_failure_attempts = Some(5);
Expand Down Expand Up @@ -378,7 +378,7 @@ mod tests {
password_hash: String,
) -> (db_local_user::Model, db_password::Model) {
(
get_local_user_mock(),
get_local_user_mock("user_id"),
db_password::ModelBuilder::default()
.password_hash(password_hash)
.build()
Expand All @@ -397,6 +397,7 @@ mod tests {
.unwrap(),
)]])
.append_query_results([user_option::tests::get_user_options_mock(
"user_id",
&UserOptions::default(),
)])
.append_query_results([vec![user::tests::get_user_mock("user_id")]])
Expand Down Expand Up @@ -465,6 +466,7 @@ mod tests {
.unwrap(),
)]])
.append_query_results([user_option::tests::get_user_options_mock(
"user_id",
&UserOptions::default(),
)])
.into_connection();
Expand Down Expand Up @@ -515,10 +517,13 @@ mod tests {
.build()
.unwrap(),
)]])
.append_query_results([user_option::tests::get_user_options_mock(&UserOptions {
ignore_lockout_failure_attempts: Some(true),
..Default::default()
})])
.append_query_results([user_option::tests::get_user_options_mock(
"user_id",
&UserOptions {
ignore_lockout_failure_attempts: Some(true),
..Default::default()
},
)])
.append_query_results([vec![user::tests::get_user_mock("user_id")]])
.append_query_results([vec![user::tests::get_user_mock("user_id")]])
.into_connection();
Expand All @@ -544,13 +549,14 @@ mod tests {
let config = Config::default();
let db = MockDatabase::new(DatabaseBackend::Postgres)
.append_query_results([vec![(
get_local_user_mock(),
get_local_user_mock("user_id"),
db_password::ModelBuilder::default()
.password_hash("wrong_password")
.build()
.unwrap(),
)]])
.append_query_results([user_option::tests::get_user_options_mock(
"user_id",
&UserOptions::default(),
)])
.into_connection();
Expand Down Expand Up @@ -582,7 +588,7 @@ mod tests {
let password = String::from("foo_pass");
let db = MockDatabase::new(DatabaseBackend::Postgres)
.append_query_results([vec![(
get_local_user_mock(),
get_local_user_mock("user_id"),
db_password::ModelBuilder::default()
.password_hash(
password_hashing::hash_password(&config, &password)
Expand All @@ -594,6 +600,7 @@ mod tests {
.unwrap(),
)]])
.append_query_results([user_option::tests::get_user_options_mock(
"user_id",
&UserOptions::default(),
)])
.into_connection();
Expand Down Expand Up @@ -626,7 +633,7 @@ mod tests {
let password = String::from("foo_pass");
let db = MockDatabase::new(DatabaseBackend::Postgres)
.append_query_results([vec![(
get_local_user_mock(),
get_local_user_mock("user_id"),
db_password::ModelBuilder::expired()
.password_hash(
password_hashing::hash_password(&config, &password)
Expand All @@ -636,10 +643,13 @@ mod tests {
.build()
.unwrap(),
)]])
.append_query_results([user_option::tests::get_user_options_mock(&UserOptions {
ignore_password_expiry: Some(true),
..Default::default()
})])
.append_query_results([user_option::tests::get_user_options_mock(
"user_id",
&UserOptions {
ignore_password_expiry: Some(true),
..Default::default()
},
)])
.append_query_results([vec![user::tests::get_user_mock("user_id")]])
.append_query_results([vec![user::tests::get_user_mock("user_id")]])
.into_connection();
Expand Down
16 changes: 16 additions & 0 deletions src/identity/backends/sql/federated_user.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,19 @@ impl UserResponseBuilder {
self
}
}

#[cfg(test)]
pub(crate) mod tests {
use crate::db::entity::federated_user as db_federated_user;

pub fn get_federated_user_mock<UID: Into<String>>(user_id: UID) -> db_federated_user::Model {
db_federated_user::Model {
id: 1,
user_id: user_id.into(),
idp_id: "idp_id".into(),
protocol_id: "protocol_id".into(),
unique_id: "uid".into(),
display_name: Some("foo".into()),
}
}
}
6 changes: 3 additions & 3 deletions src/identity/backends/sql/local_user.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@ impl UserResponseBuilder {
}

#[cfg(test)]
pub(super) mod tests {
pub(crate) mod tests {
use chrono::Utc;

use crate::db::entity::{local_user as db_local_user, password as db_password};

pub fn get_local_user_mock() -> db_local_user::Model {
pub fn get_local_user_mock<UID: Into<String>>(user_id: UID) -> db_local_user::Model {
db_local_user::Model {
id: 1,
user_id: "user_id".into(),
user_id: user_id.into(),
domain_id: "foo_domain".into(),
name: "foo_domain".into(),
failed_auth_count: Some(0),
Expand Down
2 changes: 1 addition & 1 deletion src/identity/backends/sql/local_user/load.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ pub async fn load_local_user_with_passwords<S1: AsRef<str>, S2: AsRef<str>, S3:
///
/// Returns vector of optional vectors with passwords in the same order as
/// requested keeping None in place where local_user was empty.
pub async fn load_local_users_passwords<L: IntoIterator<Item = Option<i32>>>(
pub async fn load_local_users_passwords<L: IntoIterator<Item = Option<i32>> + std::fmt::Debug>(
db: &DatabaseConnection,
user_ids: L,
) -> Result<Vec<Option<Vec<password::Model>>>, IdentityDatabaseError> {
Expand Down
13 changes: 13 additions & 0 deletions src/identity/backends/sql/nonlocal_user.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,16 @@ impl UserResponseBuilder {
self
}
}

#[cfg(test)]
pub(crate) mod tests {
use crate::db::entity::nonlocal_user as db_nonlocal_user;

pub fn get_nonlocal_user_mock<UID: Into<String>>(user_id: UID) -> db_nonlocal_user::Model {
db_nonlocal_user::Model {
user_id: user_id.into(),
domain_id: "foo_domain".into(),
name: "foo".into(),
}
}
}
Loading
Loading