summaryrefslogtreecommitdiff
path: root/crates/directory/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/directory/src/lib.rs')
-rw-r--r--crates/directory/src/lib.rs57
1 files changed, 33 insertions, 24 deletions
diff --git a/crates/directory/src/lib.rs b/crates/directory/src/lib.rs
index 95e8d13c..4608d138 100644
--- a/crates/directory/src/lib.rs
+++ b/crates/directory/src/lib.rs
@@ -21,19 +21,33 @@
* for more details.
*/
+use core::cache::CachedDirectory;
use std::{borrow::Cow, fmt::Debug, sync::Arc};
use ahash::AHashMap;
-use backend::{imap::ImapError, internal::PrincipalField};
+use backend::{
+ imap::{ImapDirectory, ImapError},
+ internal::PrincipalField,
+ ldap::LdapDirectory,
+ memory::MemoryDirectory,
+ smtp::SmtpDirectory,
+ sql::SqlDirectory,
+};
use deadpool::managed::PoolError;
use ldap3::LdapError;
use mail_send::Credentials;
+use store::Store;
use utils::config::DynValue;
pub mod backend;
-pub mod cache;
-pub mod config;
-pub mod secret;
+pub mod core;
+
+pub struct Directory {
+ store: DirectoryInner,
+ catch_all: AddressMapping,
+ subaddressing: AddressMapping,
+ cache: Option<CachedDirectory>,
+}
#[derive(Debug, Default, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct Principal<T> {
@@ -44,7 +58,7 @@ pub struct Principal<T> {
#[serde(default)]
pub quota: u32,
pub name: String,
- #[serde(default, skip_serializing)]
+ #[serde(default)]
pub secrets: Vec<String>,
#[serde(default)]
pub emails: Vec<String>,
@@ -58,6 +72,7 @@ pub struct Principal<T> {
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum Type {
#[serde(rename = "individual")]
+ #[default]
Individual = 0,
#[serde(rename = "group")]
Group = 1,
@@ -69,7 +84,6 @@ pub enum Type {
Superuser = 4,
#[serde(rename = "list")]
List = 5,
- #[default]
#[serde(rename = "other")]
Other = 6,
}
@@ -89,19 +103,20 @@ pub enum DirectoryError {
#[derive(Debug, PartialEq, Eq)]
pub enum ManagementError {
MissingField(PrincipalField),
- NotUniqueField(PrincipalField),
+ AlreadyExists {
+ field: PrincipalField,
+ value: String,
+ },
NotFound(String),
}
-#[async_trait::async_trait]
-pub trait Directory: Sync + Send {
- async fn query(&self, by: QueryBy<'_>) -> Result<Option<Principal<u32>>>;
- async fn email_to_ids(&self, email: &str) -> Result<Vec<u32>>;
-
- async fn is_local_domain(&self, domain: &str) -> crate::Result<bool>;
- async fn rcpt(&self, address: &str) -> crate::Result<bool>;
- async fn vrfy(&self, address: &str) -> Result<Vec<String>>;
- async fn expn(&self, address: &str) -> Result<Vec<String>>;
+pub enum DirectoryInner {
+ Internal(Store),
+ Ldap(LdapDirectory),
+ Sql(SqlDirectory),
+ Imap(ImapDirectory),
+ Smtp(SmtpDirectory),
+ Memory(MemoryDirectory),
}
pub enum QueryBy<'x> {
@@ -124,7 +139,7 @@ impl<T: serde::Serialize + serde::de::DeserializeOwned> Principal<T> {
}
}
-impl Debug for dyn Directory {
+impl Debug for Directory {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Directory").finish()
}
@@ -144,12 +159,6 @@ impl Type {
}
#[derive(Debug, Default)]
-struct DirectoryOptions {
- catch_all: AddressMapping,
- subaddressing: AddressMapping,
-}
-
-#[derive(Debug, Default)]
pub enum AddressMapping {
Enable,
Custom {
@@ -162,7 +171,7 @@ pub enum AddressMapping {
#[derive(Default, Clone, Debug)]
pub struct Directories {
- pub directories: AHashMap<String, Arc<dyn Directory>>,
+ pub directories: AHashMap<String, Arc<Directory>>,
}
pub type Result<T> = std::result::Result<T, DirectoryError>;