domain-model: move domain::model module to separate crate

This commit is contained in:
Simon Broeng Jensen
2025-02-05 09:11:27 +01:00
committed by nitnelave
parent 3c0359eb8a
commit d854ace89f
39 changed files with 125 additions and 42 deletions
Generated
+20
View File
@@ -2536,6 +2536,7 @@ dependencies = [
"lettre", "lettre",
"lldap_auth", "lldap_auth",
"lldap_domain", "lldap_domain",
"lldap_domain_model",
"lldap_validation", "lldap_validation",
"log", "log",
"mockall", "mockall",
@@ -2644,6 +2645,25 @@ dependencies = [
"uuid 1.11.0", "uuid 1.11.0",
] ]
[[package]]
name = "lldap_domain_model"
version = "0.1.0"
dependencies = [
"base64 0.21.7",
"bincode",
"chrono",
"derive_more 1.0.0",
"lldap_auth",
"lldap_domain",
"orion",
"pretty_assertions",
"sea-orm",
"serde",
"serde_bytes",
"thiserror",
"uuid 1.11.0",
]
[[package]] [[package]]
name = "lldap_migration_tool" name = "lldap_migration_tool"
version = "0.4.2" version = "0.4.2"
+1
View File
@@ -2,6 +2,7 @@
members = [ members = [
"crates/auth", "crates/auth",
"crates/domain", "crates/domain",
"crates/domain-model",
"crates/validation", "crates/validation",
"server", "server",
"app", "app",
+50
View File
@@ -0,0 +1,50 @@
[package]
authors = ["Valentin Tolmer <valentin@tolmer.fr>"]
name = "lldap_domain_model"
version = "0.1.0"
edition = "2021"
[features]
test = []
[dependencies]
base64 = "0.21"
bincode = "1.3"
orion = "0.17"
serde = "1"
serde_bytes = "0.11"
thiserror = "1"
[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.sea-orm]
version = "0.12"
default-features = false
features = [
"macros",
"with-chrono",
"with-uuid",
"sqlx-all",
"runtime-actix-rustls",
]
[dependencies.uuid]
features = ["v1", "v3"]
version = "1"
+2
View File
@@ -0,0 +1,2 @@
pub mod error;
pub mod model;
@@ -1,4 +1,4 @@
use crate::domain::error::DomainError; use crate::error::DomainError;
use lldap_domain::{ use lldap_domain::{
schema::AttributeList, schema::AttributeList,
types::{Attribute, AttributeName, AttributeType, AttributeValue, Cardinality, Serialized}, types::{Attribute, AttributeName, AttributeType, AttributeValue, Cardinality, Serialized},
@@ -6,7 +6,7 @@ use lldap_domain::{
// Value must be a serialized attribute value of the type denoted by typ, // Value must be a serialized attribute value of the type denoted by typ,
// and either a singleton or unbounded list, depending on is_list. // and either a singleton or unbounded list, depending on is_list.
pub(crate) fn deserialize_attribute_value( pub fn deserialize_attribute_value(
value: &Serialized, value: &Serialized,
typ: AttributeType, typ: AttributeType,
is_list: bool, is_list: bool,
@@ -39,7 +39,7 @@ pub(crate) fn deserialize_attribute_value(
} }
} }
pub(crate) fn deserialize_attribute( pub fn deserialize_attribute(
name: AttributeName, name: AttributeName,
value: &Serialized, value: &Serialized,
schema: &AttributeList, schema: &AttributeList,
@@ -1,6 +1,6 @@
pub mod prelude; pub mod prelude;
pub(crate) mod deserialize; pub mod deserialize;
pub mod groups; pub mod groups;
pub mod jwt_refresh_storage; pub mod jwt_refresh_storage;
pub mod jwt_storage; pub mod jwt_storage;
+3
View File
@@ -91,6 +91,9 @@ path = "../crates/domain"
path = "../crates/domain" path = "../crates/domain"
features = ["test"] features = ["test"]
[dependencies.lldap_domain_model]
path = "../crates/domain-model"
[dependencies.lldap_validation] [dependencies.lldap_validation]
path = "../crates/validation" path = "../crates/validation"
+1 -1
View File
@@ -1,4 +1,3 @@
use crate::domain::{error::Result, model::UserColumn};
use async_trait::async_trait; use async_trait::async_trait;
use lldap_domain::{ use lldap_domain::{
requests::{ requests::{
@@ -11,6 +10,7 @@ use lldap_domain::{
User, UserAndGroups, UserId, Uuid, User, UserAndGroups, UserId, Uuid,
}, },
}; };
use lldap_domain_model::{error::Result, model::UserColumn};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::collections::HashSet; use std::collections::HashSet;
+1 -1
View File
@@ -16,12 +16,12 @@ use crate::domain::{
LdapInfo, UserFieldType, LdapInfo, UserFieldType,
}, },
}, },
model::UserColumn,
schema::PublicSchema, schema::PublicSchema,
}; };
use lldap_domain::types::{ use lldap_domain::types::{
AttributeName, AttributeType, GroupDetails, LdapObjectClass, User, UserAndGroups, UserId, AttributeName, AttributeType, GroupDetails, LdapObjectClass, User, UserAndGroups, UserId,
}; };
use lldap_domain_model::model::UserColumn;
pub fn get_user_attribute( pub fn get_user_attribute(
user: &User, user: &User,
+1 -1
View File
@@ -7,7 +7,6 @@ use tracing::{debug, instrument, warn};
use crate::domain::{ use crate::domain::{
handler::SubStringFilter, handler::SubStringFilter,
ldap::error::{LdapError, LdapResult}, ldap::error::{LdapError, LdapResult},
model::UserColumn,
schema::PublicSchema, schema::PublicSchema,
}; };
use lldap_domain::types::{ use lldap_domain::types::{
@@ -29,6 +28,7 @@ impl From<LdapSubstringFilter> for SubStringFilter {
} }
} }
} }
use lldap_domain_model::model::UserColumn;
fn make_dn_pair<I>(mut iter: I) -> LdapResult<(String, String)> fn make_dn_pair<I>(mut iter: I) -> LdapResult<(String, String)>
where where
-2
View File
@@ -1,8 +1,6 @@
pub mod deserialize; pub mod deserialize;
pub mod error;
pub mod handler; pub mod handler;
pub mod ldap; pub mod ldap;
pub mod model;
pub mod opaque_handler; pub mod opaque_handler;
pub mod schema; pub mod schema;
pub mod sql_backend_handler; pub mod sql_backend_handler;
+1 -1
View File
@@ -1,6 +1,6 @@
use crate::domain::error::Result;
use async_trait::async_trait; use async_trait::async_trait;
use lldap_domain::types::UserId; use lldap_domain::types::UserId;
use lldap_domain_model::error::Result;
pub use lldap_auth::{login, registration}; pub use lldap_auth::{login, registration};
@@ -1,8 +1,6 @@
use crate::{ use crate::{
domain::{ domain::{
error::{DomainError, Result},
handler::{GroupBackendHandler, GroupListerBackendHandler, GroupRequestFilter}, handler::{GroupBackendHandler, GroupListerBackendHandler, GroupRequestFilter},
model::{self, deserialize, GroupColumn, MembershipColumn},
sql_backend_handler::SqlBackendHandler, sql_backend_handler::SqlBackendHandler,
}, },
infra::access_control::UserReadableBackendHandler, infra::access_control::UserReadableBackendHandler,
@@ -12,6 +10,10 @@ use lldap_domain::{
requests::{CreateGroupRequest, UpdateGroupRequest}, requests::{CreateGroupRequest, UpdateGroupRequest},
types::{AttributeName, Group, GroupDetails, GroupId, Serialized, Uuid}, types::{AttributeName, Group, GroupDetails, GroupId, Serialized, Uuid},
}; };
use lldap_domain_model::{
error::{DomainError, Result},
model::{self, deserialize, GroupColumn, MembershipColumn},
};
use sea_orm::{ use sea_orm::{
sea_query::{Alias, Cond, Expr, Func, IntoCondition, OnConflict, SimpleExpr}, sea_query::{Alias, Cond, Expr, Func, IntoCondition, OnConflict, SimpleExpr},
ActiveModelTrait, ColumnTrait, DatabaseTransaction, EntityTrait, QueryFilter, QueryOrder, ActiveModelTrait, ColumnTrait, DatabaseTransaction, EntityTrait, QueryFilter, QueryOrder,
+4 -2
View File
@@ -1,7 +1,5 @@
use super::{ use super::{
error::{DomainError, Result},
handler::{BindRequest, LoginHandler}, handler::{BindRequest, LoginHandler},
model::{self, UserColumn},
opaque_handler::{login, registration, OpaqueHandler}, opaque_handler::{login, registration, OpaqueHandler},
sql_backend_handler::SqlBackendHandler, sql_backend_handler::SqlBackendHandler,
}; };
@@ -9,6 +7,10 @@ use async_trait::async_trait;
use base64::Engine; use base64::Engine;
use lldap_auth::opaque; use lldap_auth::opaque;
use lldap_domain::types::UserId; use lldap_domain::types::UserId;
use lldap_domain_model::{
error::{DomainError, Result},
model::{self, UserColumn},
};
use sea_orm::{ActiveModelTrait, ActiveValue, EntityTrait, QuerySelect}; use sea_orm::{ActiveModelTrait, ActiveValue, EntityTrait, QuerySelect};
use secstr::SecUtf8; use secstr::SecUtf8;
use tracing::{debug, info, instrument, warn}; use tracing::{debug, info, instrument, warn};
@@ -1,7 +1,5 @@
use crate::domain::{ use crate::domain::{
error::{DomainError, Result},
handler::{ReadSchemaBackendHandler, SchemaBackendHandler}, handler::{ReadSchemaBackendHandler, SchemaBackendHandler},
model,
sql_backend_handler::SqlBackendHandler, sql_backend_handler::SqlBackendHandler,
}; };
use async_trait::async_trait; use async_trait::async_trait;
@@ -10,6 +8,10 @@ use lldap_domain::{
schema::{AttributeList, AttributeSchema, Schema}, schema::{AttributeList, AttributeSchema, Schema},
types::{AttributeName, LdapObjectClass}, types::{AttributeName, LdapObjectClass},
}; };
use lldap_domain_model::{
error::{DomainError, Result},
model,
};
use sea_orm::{ use sea_orm::{
ActiveModelTrait, DatabaseTransaction, EntityTrait, QueryOrder, Set, TransactionTrait, ActiveModelTrait, DatabaseTransaction, EntityTrait, QueryOrder, Set, TransactionTrait,
}; };
@@ -1,9 +1,7 @@
use crate::domain::{ use crate::domain::{
error::{DomainError, Result},
handler::{ handler::{
ReadSchemaBackendHandler, UserBackendHandler, UserListerBackendHandler, UserRequestFilter, ReadSchemaBackendHandler, UserBackendHandler, UserListerBackendHandler, UserRequestFilter,
}, },
model::{self, deserialize, GroupColumn, UserColumn},
sql_backend_handler::SqlBackendHandler, sql_backend_handler::SqlBackendHandler,
}; };
use async_trait::async_trait; use async_trait::async_trait;
@@ -11,6 +9,10 @@ use lldap_domain::{
requests::{CreateUserRequest, UpdateUserRequest}, requests::{CreateUserRequest, UpdateUserRequest},
types::{AttributeName, GroupDetails, GroupId, Serialized, User, UserAndGroups, UserId, Uuid}, types::{AttributeName, GroupDetails, GroupId, Serialized, User, UserAndGroups, UserId, Uuid},
}; };
use lldap_domain_model::{
error::{DomainError, Result},
model::{self, deserialize, GroupColumn, UserColumn},
};
use sea_orm::{ use sea_orm::{
sea_query::{ sea_query::{
query::OnConflict, Alias, Cond, Expr, Func, IntoColumnRef, IntoCondition, SimpleExpr, query::OnConflict, Alias, Cond, Expr, Func, IntoColumnRef, IntoCondition, SimpleExpr,
@@ -414,10 +416,9 @@ impl UserBackendHandler for SqlBackendHandler {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use crate::domain::{ use crate::domain::{handler::SubStringFilter, sql_backend_handler::tests::*};
handler::SubStringFilter, model::UserColumn, sql_backend_handler::tests::*,
};
use lldap_domain::types::{Attribute, JpegPhoto}; use lldap_domain::types::{Attribute, JpegPhoto};
use lldap_domain_model::model::UserColumn;
use pretty_assertions::{assert_eq, assert_ne}; use pretty_assertions::{assert_eq, assert_ne};
#[tokio::test] #[tokio::test]
+1 -1
View File
@@ -4,7 +4,6 @@ use async_trait::async_trait;
use tracing::info; use tracing::info;
use crate::domain::{ use crate::domain::{
error::Result,
handler::{ handler::{
BackendHandler, GroupBackendHandler, GroupListerBackendHandler, GroupRequestFilter, BackendHandler, GroupBackendHandler, GroupListerBackendHandler, GroupRequestFilter,
ReadSchemaBackendHandler, SchemaBackendHandler, UserBackendHandler, ReadSchemaBackendHandler, SchemaBackendHandler, UserBackendHandler,
@@ -23,6 +22,7 @@ use lldap_domain::{
UserAndGroups, UserId, UserAndGroups, UserId,
}, },
}; };
use lldap_domain_model::error::Result;
#[derive(Clone, Copy, PartialEq, Eq, Debug)] #[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum Permission { pub enum Permission {
+1 -2
View File
@@ -23,12 +23,11 @@ use tracing::{debug, info, instrument, warn};
use lldap_auth::{login, password_reset, registration, JWTClaims}; use lldap_auth::{login, password_reset, registration, JWTClaims};
use lldap_domain::types::{GroupDetails, GroupName, UserId}; use lldap_domain::types::{GroupDetails, GroupName, UserId};
use lldap_domain_model::{error::DomainError, model::UserColumn};
use crate::{ use crate::{
domain::{ domain::{
error::DomainError,
handler::{BackendHandler, BindRequest, LoginHandler, UserRequestFilter}, handler::{BackendHandler, BindRequest, LoginHandler, UserRequestFilter},
model::UserColumn,
opaque_handler::OpaqueHandler, opaque_handler::OpaqueHandler,
}, },
infra::{ infra::{
+4 -4
View File
@@ -1,9 +1,9 @@
use crate::domain::{ use crate::domain::sql_tables::DbConnection;
model::{self, JwtRefreshStorageColumn, JwtStorageColumn, PasswordResetTokensColumn},
sql_tables::DbConnection,
};
use actix::prelude::{Actor, AsyncContext, Context}; use actix::prelude::{Actor, AsyncContext, Context};
use cron::Schedule; use cron::Schedule;
use lldap_domain_model::model::{
self, JwtRefreshStorageColumn, JwtStorageColumn, PasswordResetTokensColumn,
};
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter}; use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
use std::{str::FromStr, time::Duration}; use std::{str::FromStr, time::Duration};
use tracing::{error, info, instrument}; use tracing::{error, info, instrument};
+1 -1
View File
@@ -5,7 +5,6 @@ use crate::{
deserialize::deserialize_attribute_value, deserialize::deserialize_attribute_value,
handler::{BackendHandler, ReadSchemaBackendHandler}, handler::{BackendHandler, ReadSchemaBackendHandler},
ldap::utils::{map_user_field, UserFieldType}, ldap::utils::{map_user_field, UserFieldType},
model::UserColumn,
schema::PublicSchema, schema::PublicSchema,
}, },
infra::{ infra::{
@@ -19,6 +18,7 @@ use juniper::{graphql_object, FieldResult, GraphQLInputObject};
use lldap_domain::types::{ use lldap_domain::types::{
AttributeType, Cardinality, GroupDetails, GroupId, LdapObjectClass, UserId, AttributeType, Cardinality, GroupDetails, GroupId, LdapObjectClass, UserId,
}; };
use lldap_domain_model::model::UserColumn;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tracing::{debug, debug_span, Instrument, Span}; use tracing::{debug, debug_span, Instrument, Span};
+7 -5
View File
@@ -926,16 +926,18 @@ mod tests {
use super::*; use super::*;
use crate::{ use crate::{
domain::handler::*, domain::handler::*,
domain::model::UserColumn,
infra::test_utils::{setup_default_schema, MockTestBackendHandler}, infra::test_utils::{setup_default_schema, MockTestBackendHandler},
}; };
use chrono::TimeZone; use chrono::TimeZone;
use ldap3_proto::proto::{ use ldap3_proto::proto::{
LdapDerefAliases, LdapSearchScope, LdapSubstringFilter, LdapWhoamiRequest, LdapDerefAliases, LdapSearchScope, LdapSubstringFilter, LdapWhoamiRequest,
}; };
use lldap_domain::schema::{AttributeList, AttributeSchema, Schema}; use lldap_domain::{
use lldap_domain::types::*; schema::{AttributeList, AttributeSchema, Schema},
use lldap_domain::uuid; types::*,
uuid,
};
use lldap_domain_model::model::UserColumn;
use mockall::predicate::eq; use mockall::predicate::eq;
use pretty_assertions::assert_eq; use pretty_assertions::assert_eq;
use std::collections::HashSet; use std::collections::HashSet;
@@ -1854,7 +1856,7 @@ mod tests {
])))) ]))))
.times(1) .times(1)
.return_once(|_| { .return_once(|_| {
Err(crate::domain::error::DomainError::InternalError( Err(lldap_domain_model::error::DomainError::InternalError(
"Error getting groups".to_string(), "Error getting groups".to_string(),
)) ))
}); });
+5 -5
View File
@@ -1,12 +1,12 @@
use super::tcp_backend_handler::TcpBackendHandler; use super::tcp_backend_handler::TcpBackendHandler;
use crate::domain::{ use crate::domain::sql_backend_handler::SqlBackendHandler;
error::*,
model::{self, JwtRefreshStorageColumn, JwtStorageColumn, PasswordResetTokensColumn},
sql_backend_handler::SqlBackendHandler,
};
use async_trait::async_trait; use async_trait::async_trait;
use chrono::NaiveDateTime; use chrono::NaiveDateTime;
use lldap_domain::types::UserId; use lldap_domain::types::UserId;
use lldap_domain_model::{
error::*,
model::{self, JwtRefreshStorageColumn, JwtStorageColumn, PasswordResetTokensColumn},
};
use sea_orm::{ use sea_orm::{
sea_query::{Cond, Expr}, sea_query::{Cond, Expr},
ActiveModelTrait, ColumnTrait, EntityTrait, IntoActiveModel, QueryFilter, QuerySelect, ActiveModelTrait, ColumnTrait, EntityTrait, IntoActiveModel, QueryFilter, QuerySelect,
+1 -1
View File
@@ -2,8 +2,8 @@ use async_trait::async_trait;
use chrono::NaiveDateTime; use chrono::NaiveDateTime;
use std::collections::HashSet; use std::collections::HashSet;
use crate::domain::error::Result;
use lldap_domain::types::UserId; use lldap_domain::types::UserId;
use lldap_domain_model::error::Result;
#[async_trait] #[async_trait]
pub trait TcpBackendHandler: Sync { pub trait TcpBackendHandler: Sync {
+1 -1
View File
@@ -1,6 +1,5 @@
use crate::{ use crate::{
domain::{ domain::{
error::DomainError,
handler::{BackendHandler, LoginHandler}, handler::{BackendHandler, LoginHandler},
opaque_handler::OpaqueHandler, opaque_handler::OpaqueHandler,
}, },
@@ -19,6 +18,7 @@ use actix_service::map_config;
use actix_web::{dev::AppConfig, guard, web, App, HttpResponse, Responder}; use actix_web::{dev::AppConfig, guard, web, App, HttpResponse, Responder};
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use hmac::Hmac; use hmac::Hmac;
use lldap_domain_model::error::DomainError;
use sha2::Sha512; use sha2::Sha512;
use std::collections::HashSet; use std::collections::HashSet;
use std::path::PathBuf; use std::path::PathBuf;
+2 -1
View File
@@ -1,4 +1,4 @@
use crate::domain::{error::Result, handler::*, opaque_handler::*}; use crate::domain::{handler::*, opaque_handler::*};
use lldap_domain::{ use lldap_domain::{
requests::{ requests::{
CreateAttributeRequest, CreateGroupRequest, CreateUserRequest, UpdateGroupRequest, CreateAttributeRequest, CreateGroupRequest, CreateUserRequest, UpdateGroupRequest,
@@ -7,6 +7,7 @@ use lldap_domain::{
schema::{AttributeList, AttributeSchema, Schema}, schema::{AttributeList, AttributeSchema, Schema},
types::*, types::*,
}; };
use lldap_domain_model::error::Result;
use async_trait::async_trait; use async_trait::async_trait;
use std::collections::HashSet; use std::collections::HashSet;