mirror of
https://github.com/lldap/lldap.git
synced 2026-07-25 17:58:44 +00:00
auth: move Permission and ValidationResults to auth crate
This commit is contained in:
committed by
nitnelave
parent
ca1c6ff645
commit
2a226963ee
@@ -14,6 +14,7 @@ opaque_server = []
|
|||||||
opaque_client = []
|
opaque_client = []
|
||||||
js = []
|
js = []
|
||||||
sea_orm = ["dep:sea-orm"]
|
sea_orm = ["dep:sea-orm"]
|
||||||
|
test = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rust-argon2 = "0.8"
|
rust-argon2 = "0.8"
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
use crate::types::UserId;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)]
|
||||||
|
pub enum Permission {
|
||||||
|
Admin,
|
||||||
|
PasswordManager,
|
||||||
|
Readonly,
|
||||||
|
Regular,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
|
pub struct ValidationResults {
|
||||||
|
pub user: UserId,
|
||||||
|
pub permission: Permission,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ValidationResults {
|
||||||
|
#[cfg(feature = "test")]
|
||||||
|
pub fn admin() -> Self {
|
||||||
|
Self {
|
||||||
|
user: UserId::new("admin"),
|
||||||
|
permission: Permission::Admin,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn is_admin(&self) -> bool {
|
||||||
|
self.permission == Permission::Admin
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn can_read_all(&self) -> bool {
|
||||||
|
self.permission == Permission::Admin
|
||||||
|
|| self.permission == Permission::Readonly
|
||||||
|
|| self.permission == Permission::PasswordManager
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn can_read(&self, user: &UserId) -> bool {
|
||||||
|
self.permission == Permission::Admin
|
||||||
|
|| self.permission == Permission::PasswordManager
|
||||||
|
|| self.permission == Permission::Readonly
|
||||||
|
|| &self.user == user
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn can_change_password(&self, user: &UserId, user_is_admin: bool) -> bool {
|
||||||
|
self.permission == Permission::Admin
|
||||||
|
|| (self.permission == Permission::PasswordManager && !user_is_admin)
|
||||||
|
|| &self.user == user
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn can_write(&self, user: &UserId) -> bool {
|
||||||
|
self.permission == Permission::Admin || &self.user == user
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
|
pub mod access_control;
|
||||||
pub mod opaque;
|
pub mod opaque;
|
||||||
|
|
||||||
/// The messages for the 3-step OPAQUE and simple login process.
|
/// The messages for the 3-step OPAQUE and simple login process.
|
||||||
|
|||||||
@@ -171,6 +171,10 @@ version = "*"
|
|||||||
default-features = false
|
default-features = false
|
||||||
features = ["sync", "tls-rustls"]
|
features = ["sync", "tls-rustls"]
|
||||||
|
|
||||||
|
[dev-dependencies.lldap_auth]
|
||||||
|
path = "../crates/auth"
|
||||||
|
features = ["test"]
|
||||||
|
|
||||||
[dev-dependencies.reqwest]
|
[dev-dependencies.reqwest]
|
||||||
version = "*"
|
version = "*"
|
||||||
default-features = false
|
default-features = false
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use tracing::info;
|
use lldap_auth::access_control::{Permission, ValidationResults};
|
||||||
|
|
||||||
use lldap_domain_handlers::handler::{
|
use lldap_domain_handlers::handler::{
|
||||||
BackendHandler, GroupBackendHandler, GroupListerBackendHandler, GroupRequestFilter,
|
BackendHandler, GroupBackendHandler, GroupListerBackendHandler, GroupRequestFilter,
|
||||||
ReadSchemaBackendHandler, SchemaBackendHandler, UserBackendHandler, UserListerBackendHandler,
|
ReadSchemaBackendHandler, SchemaBackendHandler, UserBackendHandler, UserListerBackendHandler,
|
||||||
UserRequestFilter,
|
UserRequestFilter,
|
||||||
};
|
};
|
||||||
|
use tracing::info;
|
||||||
|
|
||||||
use crate::domain::schema::PublicSchema;
|
use crate::domain::schema::PublicSchema;
|
||||||
use lldap_domain::{
|
use lldap_domain::{
|
||||||
@@ -23,62 +23,6 @@ use lldap_domain::{
|
|||||||
};
|
};
|
||||||
use lldap_domain_model::error::Result;
|
use lldap_domain_model::error::Result;
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
|
||||||
pub enum Permission {
|
|
||||||
Admin,
|
|
||||||
PasswordManager,
|
|
||||||
Readonly,
|
|
||||||
Regular,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
||||||
pub struct ValidationResults {
|
|
||||||
pub user: UserId,
|
|
||||||
pub permission: Permission,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ValidationResults {
|
|
||||||
#[cfg(test)]
|
|
||||||
pub fn admin() -> Self {
|
|
||||||
Self {
|
|
||||||
user: UserId::new("admin"),
|
|
||||||
permission: Permission::Admin,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[must_use]
|
|
||||||
pub fn is_admin(&self) -> bool {
|
|
||||||
self.permission == Permission::Admin
|
|
||||||
}
|
|
||||||
|
|
||||||
#[must_use]
|
|
||||||
pub fn can_read_all(&self) -> bool {
|
|
||||||
self.permission == Permission::Admin
|
|
||||||
|| self.permission == Permission::Readonly
|
|
||||||
|| self.permission == Permission::PasswordManager
|
|
||||||
}
|
|
||||||
|
|
||||||
#[must_use]
|
|
||||||
pub fn can_read(&self, user: &UserId) -> bool {
|
|
||||||
self.permission == Permission::Admin
|
|
||||||
|| self.permission == Permission::PasswordManager
|
|
||||||
|| self.permission == Permission::Readonly
|
|
||||||
|| &self.user == user
|
|
||||||
}
|
|
||||||
|
|
||||||
#[must_use]
|
|
||||||
pub fn can_change_password(&self, user: &UserId, user_is_admin: bool) -> bool {
|
|
||||||
self.permission == Permission::Admin
|
|
||||||
|| (self.permission == Permission::PasswordManager && !user_is_admin)
|
|
||||||
|| &self.user == user
|
|
||||||
}
|
|
||||||
|
|
||||||
#[must_use]
|
|
||||||
pub fn can_write(&self, user: &UserId) -> bool {
|
|
||||||
self.permission == Permission::Admin || &self.user == user
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
pub trait UserReadableBackendHandler: ReadSchemaBackendHandler {
|
pub trait UserReadableBackendHandler: ReadSchemaBackendHandler {
|
||||||
async fn get_user_details(&self, user_id: &UserId) -> Result<User>;
|
async fn get_user_details(&self, user_id: &UserId) -> Result<User>;
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ use std::{
|
|||||||
use time::ext::NumericalDuration;
|
use time::ext::NumericalDuration;
|
||||||
use tracing::{debug, info, instrument, warn};
|
use tracing::{debug, info, instrument, warn};
|
||||||
|
|
||||||
use lldap_auth::{login, password_reset, registration, JWTClaims};
|
use lldap_auth::{
|
||||||
|
access_control::ValidationResults, login, password_reset, registration, JWTClaims,
|
||||||
|
};
|
||||||
use lldap_domain::types::{GroupDetails, GroupName, UserId};
|
use lldap_domain::types::{GroupDetails, GroupName, UserId};
|
||||||
use lldap_domain_handlers::handler::{
|
use lldap_domain_handlers::handler::{
|
||||||
BackendHandler, BindRequest, LoginHandler, UserRequestFilter,
|
BackendHandler, BindRequest, LoginHandler, UserRequestFilter,
|
||||||
@@ -31,7 +33,7 @@ use lldap_domain_model::{error::DomainError, model::UserColumn};
|
|||||||
use crate::{
|
use crate::{
|
||||||
domain::opaque_handler::OpaqueHandler,
|
domain::opaque_handler::OpaqueHandler,
|
||||||
infra::{
|
infra::{
|
||||||
access_control::{ReadonlyBackendHandler, UserReadableBackendHandler, ValidationResults},
|
access_control::{ReadonlyBackendHandler, UserReadableBackendHandler},
|
||||||
tcp_backend_handler::*,
|
tcp_backend_handler::*,
|
||||||
tcp_server::{error_to_http_response, AppState, TcpError, TcpResult},
|
tcp_server::{error_to_http_response, AppState, TcpError, TcpResult},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use crate::infra::{
|
use crate::infra::{
|
||||||
access_control::{
|
access_control::{
|
||||||
AccessControlledBackendHandler, AdminBackendHandler, ReadonlyBackendHandler,
|
AccessControlledBackendHandler, AdminBackendHandler, ReadonlyBackendHandler,
|
||||||
UserReadableBackendHandler, UserWriteableBackendHandler, ValidationResults,
|
UserReadableBackendHandler, UserWriteableBackendHandler,
|
||||||
},
|
},
|
||||||
auth_service::check_if_token_is_valid,
|
auth_service::check_if_token_is_valid,
|
||||||
cli::ExportGraphQLSchemaOpts,
|
cli::ExportGraphQLSchemaOpts,
|
||||||
@@ -20,7 +20,7 @@ use juniper::{
|
|||||||
},
|
},
|
||||||
EmptySubscription, FieldError, RootNode, ScalarValue,
|
EmptySubscription, FieldError, RootNode, ScalarValue,
|
||||||
};
|
};
|
||||||
use lldap_domain::types::UserId;
|
use lldap_auth::{access_control::ValidationResults, types::UserId};
|
||||||
use lldap_domain_handlers::handler::BackendHandler;
|
use lldap_domain_handlers::handler::BackendHandler;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
|
|||||||
@@ -783,15 +783,12 @@ fn deserialize_attribute(
|
|||||||
mod tests {
|
mod tests {
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::infra::{
|
use crate::infra::{graphql::query::Query, test_utils::MockTestBackendHandler};
|
||||||
access_control::{Permission, ValidationResults},
|
|
||||||
graphql::query::Query,
|
|
||||||
test_utils::MockTestBackendHandler,
|
|
||||||
};
|
|
||||||
use juniper::{
|
use juniper::{
|
||||||
execute, graphql_value, DefaultScalarValue, EmptySubscription, GraphQLType, InputValue,
|
execute, graphql_value, DefaultScalarValue, EmptySubscription, GraphQLType, InputValue,
|
||||||
RootNode, Variables,
|
RootNode, Variables,
|
||||||
};
|
};
|
||||||
|
use lldap_auth::access_control::{Permission, ValidationResults};
|
||||||
use lldap_domain::types::{AttributeName, AttributeType};
|
use lldap_domain::types::{AttributeName, AttributeType};
|
||||||
use mockall::predicate::eq;
|
use mockall::predicate::eq;
|
||||||
use pretty_assertions::assert_eq;
|
use pretty_assertions::assert_eq;
|
||||||
|
|||||||
@@ -786,15 +786,13 @@ impl<Handler: BackendHandler> AttributeValue<Handler> {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::infra::{
|
use crate::infra::test_utils::{setup_default_schema, MockTestBackendHandler};
|
||||||
access_control::{Permission, ValidationResults},
|
|
||||||
test_utils::{setup_default_schema, MockTestBackendHandler},
|
|
||||||
};
|
|
||||||
use chrono::TimeZone;
|
use chrono::TimeZone;
|
||||||
use juniper::{
|
use juniper::{
|
||||||
execute, graphql_value, DefaultScalarValue, EmptyMutation, EmptySubscription, GraphQLType,
|
execute, graphql_value, DefaultScalarValue, EmptyMutation, EmptySubscription, GraphQLType,
|
||||||
RootNode, Variables,
|
RootNode, Variables,
|
||||||
};
|
};
|
||||||
|
use lldap_auth::access_control::{Permission, ValidationResults};
|
||||||
use lldap_domain::{
|
use lldap_domain::{
|
||||||
schema::{AttributeList, Schema},
|
schema::{AttributeList, Schema},
|
||||||
types::{AttributeName, AttributeType, LdapObjectClass},
|
types::{AttributeName, AttributeType, LdapObjectClass},
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
infra::access_control::{
|
infra::access_control::{
|
||||||
AccessControlledBackendHandler, AdminBackendHandler, UserAndGroupListerBackendHandler,
|
AccessControlledBackendHandler, AdminBackendHandler, UserAndGroupListerBackendHandler,
|
||||||
UserReadableBackendHandler, ValidationResults,
|
UserReadableBackendHandler,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
@@ -25,6 +25,7 @@ use ldap3_proto::proto::{
|
|||||||
LdapResult as LdapResultOp, LdapResultCode, LdapSearchRequest, LdapSearchResultEntry,
|
LdapResult as LdapResultOp, LdapResultCode, LdapSearchRequest, LdapSearchResultEntry,
|
||||||
LdapSearchScope, OID_PASSWORD_MODIFY, OID_WHOAMI,
|
LdapSearchScope, OID_PASSWORD_MODIFY, OID_WHOAMI,
|
||||||
};
|
};
|
||||||
|
use lldap_auth::access_control::ValidationResults;
|
||||||
use lldap_domain::{
|
use lldap_domain::{
|
||||||
requests::CreateUserRequest,
|
requests::CreateUserRequest,
|
||||||
types::{Attribute, AttributeName, AttributeType, Email, Group, UserAndGroups, UserId},
|
types::{Attribute, AttributeName, AttributeType, Email, Group, UserAndGroups, UserId},
|
||||||
|
|||||||
Reference in New Issue
Block a user