From ca1c6ff645d234126c854ce807dc46dba38389a9 Mon Sep 17 00:00:00 2001 From: Simon Broeng Jensen Date: Wed, 19 Feb 2025 23:48:05 +0100 Subject: [PATCH] domain-handlers: move backend handler traits to separate crate --- Cargo.lock | 19 +++++++++ Cargo.toml | 1 + crates/domain-handlers/Cargo.toml | 41 +++++++++++++++++++ .../domain-handlers/src}/handler.rs | 17 ++++++++ crates/domain-handlers/src/lib.rs | 1 + server/Cargo.toml | 3 ++ server/src/domain/ldap/group.rs | 2 +- server/src/domain/ldap/user.rs | 2 +- server/src/domain/ldap/utils.rs | 19 +-------- server/src/domain/mod.rs | 1 - server/src/domain/sql_backend_handler.rs | 19 ++++----- .../src/domain/sql_group_backend_handler.rs | 14 +++---- server/src/domain/sql_opaque_handler.rs | 2 +- .../src/domain/sql_schema_backend_handler.rs | 12 ++---- server/src/domain/sql_user_backend_handler.rs | 13 +++--- server/src/infra/access_control.rs | 13 +++--- server/src/infra/auth_service.rs | 8 ++-- server/src/infra/graphql/api.rs | 20 ++++----- server/src/infra/graphql/mutation.rs | 5 +-- server/src/infra/graphql/query.rs | 4 +- server/src/infra/ldap_handler.rs | 14 +++---- server/src/infra/ldap_server.rs | 6 +-- server/src/infra/tcp_server.rs | 6 +-- server/src/infra/test_utils.rs | 3 +- server/src/main.rs | 8 ++-- 25 files changed, 149 insertions(+), 104 deletions(-) create mode 100644 crates/domain-handlers/Cargo.toml rename {server/src/domain => crates/domain-handlers/src}/handler.rs (96%) create mode 100644 crates/domain-handlers/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 85ac84d..227f917 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2536,6 +2536,7 @@ dependencies = [ "lettre", "lldap_auth", "lldap_domain", + "lldap_domain_handlers", "lldap_domain_model", "lldap_validation", "log", @@ -2645,6 +2646,24 @@ dependencies = [ "uuid 1.11.0", ] +[[package]] +name = "lldap_domain_handlers" +version = "0.1.0" +dependencies = [ + "async-trait", + "base64 0.21.7", + "chrono", + "derive_more 1.0.0", + "ldap3_proto", + "lldap_auth", + "lldap_domain", + "lldap_domain_model", + "pretty_assertions", + "serde", + "serde_bytes", + "uuid 1.11.0", +] + [[package]] name = "lldap_domain_model" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 36c1ecf..ef30043 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ members = [ "crates/auth", "crates/domain", "crates/domain-model", + "crates/domain-handlers", "crates/validation", "server", "app", diff --git a/crates/domain-handlers/Cargo.toml b/crates/domain-handlers/Cargo.toml new file mode 100644 index 0000000..5b89df0 --- /dev/null +++ b/crates/domain-handlers/Cargo.toml @@ -0,0 +1,41 @@ +[package] +authors = ["Valentin Tolmer "] +name = "lldap_domain_handlers" +version = "0.1.0" +edition = "2021" + +[features] +test = [] + +[dependencies] +async-trait = "0.1" +base64 = "0.21" +ldap3_proto = "0.6.0" +serde = "1" +serde_bytes = "0.11" + +[dev-dependencies] +pretty_assertions = "1" + +[dependencies.chrono] +features = ["serde"] +version = "0.4" + +[dependencies.derive_more] +features = ["debug", "display", "from", "from_str"] +default-features = false +version = "1" + +[dependencies.lldap_auth] +path = "../auth" +features = ["opaque_server", "opaque_client", "sea_orm"] + +[dependencies.lldap_domain] +path = "../domain" + +[dependencies.lldap_domain_model] +path = "../domain-model" + +[dependencies.uuid] +features = ["v1", "v3"] +version = "1" diff --git a/server/src/domain/handler.rs b/crates/domain-handlers/src/handler.rs similarity index 96% rename from server/src/domain/handler.rs rename to crates/domain-handlers/src/handler.rs index 9b0cbff..bb350d2 100644 --- a/server/src/domain/handler.rs +++ b/crates/domain-handlers/src/handler.rs @@ -1,4 +1,5 @@ use async_trait::async_trait; +use ldap3_proto::proto::LdapSubstringFilter; use lldap_domain::{ requests::{ CreateAttributeRequest, CreateGroupRequest, CreateUserRequest, UpdateGroupRequest, @@ -51,6 +52,22 @@ impl SubStringFilter { } } +impl From for SubStringFilter { + fn from( + LdapSubstringFilter { + initial, + any, + final_, + }: LdapSubstringFilter, + ) -> Self { + Self { + initial, + any, + final_, + } + } +} + #[derive(PartialEq, Eq, Debug, Serialize, Deserialize, Clone)] pub enum UserRequestFilter { And(Vec), diff --git a/crates/domain-handlers/src/lib.rs b/crates/domain-handlers/src/lib.rs new file mode 100644 index 0000000..062ae9d --- /dev/null +++ b/crates/domain-handlers/src/lib.rs @@ -0,0 +1 @@ +pub mod handler; diff --git a/server/Cargo.toml b/server/Cargo.toml index 8105ea2..62e6114 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -94,6 +94,9 @@ features = ["test"] [dependencies.lldap_domain_model] path = "../crates/domain-model" +[dependencies.lldap_domain_handlers] +path = "../crates/domain-handlers" + [dependencies.lldap_validation] path = "../crates/validation" diff --git a/server/src/domain/ldap/group.rs b/server/src/domain/ldap/group.rs index 856f49b..8faf790 100644 --- a/server/src/domain/ldap/group.rs +++ b/server/src/domain/ldap/group.rs @@ -6,7 +6,6 @@ use tracing::{debug, instrument, warn}; use crate::domain::{ deserialize::deserialize_attribute_value, - handler::{GroupListerBackendHandler, GroupRequestFilter}, ldap::{ error::{LdapError, LdapResult}, utils::{ @@ -21,6 +20,7 @@ use crate::domain::{ use lldap_domain::types::{ AttributeName, AttributeType, Group, GroupId, LdapObjectClass, UserId, Uuid, }; +use lldap_domain_handlers::handler::{GroupListerBackendHandler, GroupRequestFilter}; pub fn get_group_attribute( group: &Group, diff --git a/server/src/domain/ldap/user.rs b/server/src/domain/ldap/user.rs index 300867f..32ec0ff 100644 --- a/server/src/domain/ldap/user.rs +++ b/server/src/domain/ldap/user.rs @@ -6,7 +6,6 @@ use tracing::{debug, instrument, warn}; use crate::domain::{ deserialize::deserialize_attribute_value, - handler::{UserListerBackendHandler, UserRequestFilter}, ldap::{ error::{LdapError, LdapResult}, utils::{ @@ -21,6 +20,7 @@ use crate::domain::{ use lldap_domain::types::{ AttributeName, AttributeType, GroupDetails, LdapObjectClass, User, UserAndGroups, UserId, }; +use lldap_domain_handlers::handler::{UserListerBackendHandler, UserRequestFilter}; use lldap_domain_model::model::UserColumn; pub fn get_user_attribute( diff --git a/server/src/domain/ldap/utils.rs b/server/src/domain/ldap/utils.rs index 55ac497..b32ff3b 100644 --- a/server/src/domain/ldap/utils.rs +++ b/server/src/domain/ldap/utils.rs @@ -1,33 +1,16 @@ use std::collections::BTreeMap; use chrono::TimeZone; -use ldap3_proto::{proto::LdapSubstringFilter, LdapResultCode}; +use ldap3_proto::LdapResultCode; use tracing::{debug, instrument, warn}; use crate::domain::{ - handler::SubStringFilter, ldap::error::{LdapError, LdapResult}, schema::PublicSchema, }; use lldap_domain::types::{ Attribute, AttributeName, AttributeType, AttributeValue, Cardinality, GroupName, UserId, }; - -impl From for SubStringFilter { - fn from( - LdapSubstringFilter { - initial, - any, - final_, - }: LdapSubstringFilter, - ) -> Self { - Self { - initial, - any, - final_, - } - } -} use lldap_domain_model::model::UserColumn; fn make_dn_pair(mut iter: I) -> LdapResult<(String, String)> diff --git a/server/src/domain/mod.rs b/server/src/domain/mod.rs index 3d5ea11..295731b 100644 --- a/server/src/domain/mod.rs +++ b/server/src/domain/mod.rs @@ -1,5 +1,4 @@ pub mod deserialize; -pub mod handler; pub mod ldap; pub mod opaque_handler; pub mod schema; diff --git a/server/src/domain/sql_backend_handler.rs b/server/src/domain/sql_backend_handler.rs index 71ce740..2c815dd 100644 --- a/server/src/domain/sql_backend_handler.rs +++ b/server/src/domain/sql_backend_handler.rs @@ -1,7 +1,8 @@ -use crate::domain::{handler::BackendHandler, sql_tables::DbConnection}; -use crate::infra::configuration::Configuration; +use crate::{domain::sql_tables::DbConnection, infra::configuration::Configuration}; use async_trait::async_trait; +use lldap_domain_handlers::handler::BackendHandler; + #[derive(Clone)] pub struct SqlBackendHandler { pub(crate) config: Configuration, @@ -20,21 +21,15 @@ impl BackendHandler for SqlBackendHandler {} #[cfg(test)] pub mod tests { use super::*; - use crate::{ - domain::{ - handler::{ - GroupBackendHandler, UserBackendHandler, UserListerBackendHandler, - UserRequestFilter, - }, - sql_tables::init_table, - }, - infra::configuration::ConfigurationBuilder, - }; + use crate::{domain::sql_tables::init_table, infra::configuration::ConfigurationBuilder}; use lldap_auth::{opaque, registration}; use lldap_domain::{ requests::{CreateGroupRequest, CreateUserRequest}, types::{Attribute as DomainAttribute, GroupId, UserId}, }; + use lldap_domain_handlers::handler::{ + GroupBackendHandler, UserBackendHandler, UserListerBackendHandler, UserRequestFilter, + }; use pretty_assertions::assert_eq; use sea_orm::Database; diff --git a/server/src/domain/sql_group_backend_handler.rs b/server/src/domain/sql_group_backend_handler.rs index f2d0ccc..2c7bbea 100644 --- a/server/src/domain/sql_group_backend_handler.rs +++ b/server/src/domain/sql_group_backend_handler.rs @@ -1,8 +1,5 @@ use crate::{ - domain::{ - handler::{GroupBackendHandler, GroupListerBackendHandler, GroupRequestFilter}, - sql_backend_handler::SqlBackendHandler, - }, + domain::sql_backend_handler::SqlBackendHandler, infra::access_control::UserReadableBackendHandler, }; use async_trait::async_trait; @@ -10,6 +7,9 @@ use lldap_domain::{ requests::{CreateGroupRequest, UpdateGroupRequest}, types::{AttributeName, Group, GroupDetails, GroupId, Serialized, Uuid}, }; +use lldap_domain_handlers::handler::{ + GroupBackendHandler, GroupListerBackendHandler, GroupRequestFilter, +}; use lldap_domain_model::{ error::{DomainError, Result}, model::{self, deserialize, GroupColumn, MembershipColumn}, @@ -336,14 +336,12 @@ impl SqlBackendHandler { #[cfg(test)] mod tests { use super::*; - use crate::domain::{ - handler::{SchemaBackendHandler, SubStringFilter}, - sql_backend_handler::tests::*, - }; + use crate::domain::sql_backend_handler::tests::*; use lldap_domain::{ requests::CreateAttributeRequest, types::{Attribute, AttributeType, GroupName, UserId}, }; + use lldap_domain_handlers::handler::{SchemaBackendHandler, SubStringFilter}; use pretty_assertions::assert_eq; async fn get_group_ids( diff --git a/server/src/domain/sql_opaque_handler.rs b/server/src/domain/sql_opaque_handler.rs index ee5487b..8e20a9d 100644 --- a/server/src/domain/sql_opaque_handler.rs +++ b/server/src/domain/sql_opaque_handler.rs @@ -1,5 +1,4 @@ use super::{ - handler::{BindRequest, LoginHandler}, opaque_handler::{login, registration, OpaqueHandler}, sql_backend_handler::SqlBackendHandler, }; @@ -7,6 +6,7 @@ use async_trait::async_trait; use base64::Engine; use lldap_auth::opaque; use lldap_domain::types::UserId; +use lldap_domain_handlers::handler::{BindRequest, LoginHandler}; use lldap_domain_model::{ error::{DomainError, Result}, model::{self, UserColumn}, diff --git a/server/src/domain/sql_schema_backend_handler.rs b/server/src/domain/sql_schema_backend_handler.rs index 84bc8d2..49ab3a6 100644 --- a/server/src/domain/sql_schema_backend_handler.rs +++ b/server/src/domain/sql_schema_backend_handler.rs @@ -1,13 +1,11 @@ -use crate::domain::{ - handler::{ReadSchemaBackendHandler, SchemaBackendHandler}, - sql_backend_handler::SqlBackendHandler, -}; +use crate::domain::sql_backend_handler::SqlBackendHandler; use async_trait::async_trait; use lldap_domain::{ requests::CreateAttributeRequest, schema::{AttributeList, AttributeSchema, Schema}, types::{AttributeName, LdapObjectClass}, }; +use lldap_domain_handlers::handler::{ReadSchemaBackendHandler, SchemaBackendHandler}; use lldap_domain_model::{ error::{DomainError, Result}, model, @@ -177,13 +175,11 @@ impl SqlBackendHandler { #[cfg(test)] mod tests { use super::*; - use crate::domain::{ - handler::{UserBackendHandler, UserRequestFilter}, - sql_backend_handler::tests::*, - }; + use crate::domain::sql_backend_handler::tests::*; use lldap_domain::requests::UpdateUserRequest; use lldap_domain::schema::AttributeList; use lldap_domain::types::{Attribute, AttributeType}; + use lldap_domain_handlers::handler::{UserBackendHandler, UserRequestFilter}; use pretty_assertions::assert_eq; #[tokio::test] diff --git a/server/src/domain/sql_user_backend_handler.rs b/server/src/domain/sql_user_backend_handler.rs index a07fee2..81d5dbe 100644 --- a/server/src/domain/sql_user_backend_handler.rs +++ b/server/src/domain/sql_user_backend_handler.rs @@ -1,14 +1,12 @@ -use crate::domain::{ - handler::{ - ReadSchemaBackendHandler, UserBackendHandler, UserListerBackendHandler, UserRequestFilter, - }, - sql_backend_handler::SqlBackendHandler, -}; +use crate::domain::sql_backend_handler::SqlBackendHandler; use async_trait::async_trait; use lldap_domain::{ requests::{CreateUserRequest, UpdateUserRequest}, types::{AttributeName, GroupDetails, GroupId, Serialized, User, UserAndGroups, UserId, Uuid}, }; +use lldap_domain_handlers::handler::{ + ReadSchemaBackendHandler, UserBackendHandler, UserListerBackendHandler, UserRequestFilter, +}; use lldap_domain_model::{ error::{DomainError, Result}, model::{self, deserialize, GroupColumn, UserColumn}, @@ -416,8 +414,9 @@ impl UserBackendHandler for SqlBackendHandler { #[cfg(test)] mod tests { use super::*; - use crate::domain::{handler::SubStringFilter, sql_backend_handler::tests::*}; + use crate::domain::sql_backend_handler::tests::*; use lldap_domain::types::{Attribute, JpegPhoto}; + use lldap_domain_handlers::handler::SubStringFilter; use lldap_domain_model::model::UserColumn; use pretty_assertions::{assert_eq, assert_ne}; diff --git a/server/src/infra/access_control.rs b/server/src/infra/access_control.rs index f1585a3..55d5979 100644 --- a/server/src/infra/access_control.rs +++ b/server/src/infra/access_control.rs @@ -3,14 +3,13 @@ use std::collections::HashSet; use async_trait::async_trait; use tracing::info; -use crate::domain::{ - handler::{ - BackendHandler, GroupBackendHandler, GroupListerBackendHandler, GroupRequestFilter, - ReadSchemaBackendHandler, SchemaBackendHandler, UserBackendHandler, - UserListerBackendHandler, UserRequestFilter, - }, - schema::PublicSchema, +use lldap_domain_handlers::handler::{ + BackendHandler, GroupBackendHandler, GroupListerBackendHandler, GroupRequestFilter, + ReadSchemaBackendHandler, SchemaBackendHandler, UserBackendHandler, UserListerBackendHandler, + UserRequestFilter, }; + +use crate::domain::schema::PublicSchema; use lldap_domain::{ requests::{ CreateAttributeRequest, CreateGroupRequest, CreateUserRequest, UpdateGroupRequest, diff --git a/server/src/infra/auth_service.rs b/server/src/infra/auth_service.rs index 921b002..08e79cf 100644 --- a/server/src/infra/auth_service.rs +++ b/server/src/infra/auth_service.rs @@ -23,13 +23,13 @@ use tracing::{debug, info, instrument, warn}; use lldap_auth::{login, password_reset, registration, JWTClaims}; use lldap_domain::types::{GroupDetails, GroupName, UserId}; +use lldap_domain_handlers::handler::{ + BackendHandler, BindRequest, LoginHandler, UserRequestFilter, +}; use lldap_domain_model::{error::DomainError, model::UserColumn}; use crate::{ - domain::{ - handler::{BackendHandler, BindRequest, LoginHandler, UserRequestFilter}, - opaque_handler::OpaqueHandler, - }, + domain::opaque_handler::OpaqueHandler, infra::{ access_control::{ReadonlyBackendHandler, UserReadableBackendHandler, ValidationResults}, tcp_backend_handler::*, diff --git a/server/src/infra/graphql/api.rs b/server/src/infra/graphql/api.rs index 27cd05b..e16bcb0 100644 --- a/server/src/infra/graphql/api.rs +++ b/server/src/infra/graphql/api.rs @@ -1,15 +1,12 @@ -use crate::{ - domain::handler::BackendHandler, - infra::{ - access_control::{ - AccessControlledBackendHandler, AdminBackendHandler, ReadonlyBackendHandler, - UserReadableBackendHandler, UserWriteableBackendHandler, ValidationResults, - }, - auth_service::check_if_token_is_valid, - cli::ExportGraphQLSchemaOpts, - graphql::{mutation::Mutation, query::Query}, - tcp_server::AppState, +use crate::infra::{ + access_control::{ + AccessControlledBackendHandler, AdminBackendHandler, ReadonlyBackendHandler, + UserReadableBackendHandler, UserWriteableBackendHandler, ValidationResults, }, + auth_service::check_if_token_is_valid, + cli::ExportGraphQLSchemaOpts, + graphql::{mutation::Mutation, query::Query}, + tcp_server::AppState, }; use actix_web::FromRequest; @@ -24,6 +21,7 @@ use juniper::{ EmptySubscription, FieldError, RootNode, ScalarValue, }; use lldap_domain::types::UserId; +use lldap_domain_handlers::handler::BackendHandler; use tracing::debug; pub struct Context { diff --git a/server/src/infra/graphql/mutation.rs b/server/src/infra/graphql/mutation.rs index 4c5a8a7..5dc19bb 100644 --- a/server/src/infra/graphql/mutation.rs +++ b/server/src/infra/graphql/mutation.rs @@ -1,9 +1,7 @@ use std::{collections::BTreeMap, sync::Arc}; use crate::{ - domain::{ - deserialize::deserialize_attribute_value, handler::BackendHandler, schema::PublicSchema, - }, + domain::{deserialize::deserialize_attribute_value, schema::PublicSchema}, infra::{ access_control::{ AdminBackendHandler, ReadonlyBackendHandler, UserReadableBackendHandler, @@ -25,6 +23,7 @@ use lldap_domain::{ LdapObjectClass, UserId, }, }; +use lldap_domain_handlers::handler::BackendHandler; use lldap_validation::attributes::{validate_attribute_name, ALLOWED_CHARACTERS_DESCRIPTION}; use tracing::{debug, debug_span, Instrument, Span}; diff --git a/server/src/infra/graphql/query.rs b/server/src/infra/graphql/query.rs index eb2059b..cd30ff3 100644 --- a/server/src/infra/graphql/query.rs +++ b/server/src/infra/graphql/query.rs @@ -3,7 +3,6 @@ use std::sync::Arc; use crate::{ domain::{ deserialize::deserialize_attribute_value, - handler::{BackendHandler, ReadSchemaBackendHandler}, ldap::utils::{map_user_field, UserFieldType}, schema::PublicSchema, }, @@ -18,11 +17,12 @@ use juniper::{graphql_object, FieldResult, GraphQLInputObject}; use lldap_domain::types::{ AttributeType, Cardinality, GroupDetails, GroupId, LdapObjectClass, UserId, }; +use lldap_domain_handlers::handler::{BackendHandler, ReadSchemaBackendHandler}; use lldap_domain_model::model::UserColumn; use serde::{Deserialize, Serialize}; use tracing::{debug, debug_span, Instrument, Span}; -type DomainRequestFilter = crate::domain::handler::UserRequestFilter; +type DomainRequestFilter = lldap_domain_handlers::handler::UserRequestFilter; type DomainUser = lldap_domain::types::User; type DomainGroup = lldap_domain::types::Group; type DomainUserAndGroups = lldap_domain::types::UserAndGroups; diff --git a/server/src/infra/ldap_handler.rs b/server/src/infra/ldap_handler.rs index 636986b..236282c 100644 --- a/server/src/infra/ldap_handler.rs +++ b/server/src/infra/ldap_handler.rs @@ -1,7 +1,6 @@ use crate::{ domain::{ deserialize, - handler::{BackendHandler, BindRequest, LoginHandler, ReadSchemaBackendHandler}, ldap::{ error::{LdapError, LdapResult}, group::{convert_groups_to_ldap_op, get_groups_list}, @@ -30,6 +29,9 @@ use lldap_domain::{ requests::CreateUserRequest, types::{Attribute, AttributeName, AttributeType, Email, Group, UserAndGroups, UserId}, }; +use lldap_domain_handlers::handler::{ + BackendHandler, BindRequest, LoginHandler, ReadSchemaBackendHandler, +}; use std::collections::HashMap; use tracing::{debug, instrument, warn}; @@ -924,10 +926,7 @@ impl LdapHandler