Add Filesystem
mail store and MultiDomain
trait
This commit is contained in:
parent
2afbede154
commit
72c1dbf016
2 changed files with 108 additions and 0 deletions
100
src/mailstore/filesystem.rs
Normal file
100
src/mailstore/filesystem.rs
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
use super::*;
|
||||||
|
use std::{fs, io, os::unix::fs::DirBuilderExt, path::PathBuf};
|
||||||
|
|
||||||
|
pub trait MultiDomain: MailStore {
|
||||||
|
type Error;
|
||||||
|
fn domains(&self) -> Result<Vec<String>, Self::Error>;
|
||||||
|
fn add_domain(&mut self, domain: &str) -> Result<(), Self::Error>;
|
||||||
|
fn remove_domain(&mut self, domain: &str) -> Result<(), Self::Error>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
|
||||||
|
pub struct Filesystem {
|
||||||
|
pub path: PathBuf,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MailStore for Filesystem {
|
||||||
|
fn users(&self) -> Vec<Mailuser> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serves_domain(&self, domain: &str) -> bool {
|
||||||
|
let mut path = self.path.clone();
|
||||||
|
path.push(domain);
|
||||||
|
path.exists()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn has_mailuser(&self, mailuser: &str) -> bool {
|
||||||
|
if let Some((user, host)) = mailuser.rsplit_once('@') {
|
||||||
|
let mut path = self.path.clone();
|
||||||
|
if host.contains('.') && !host.contains(|c: char| c.is_whitespace()) {
|
||||||
|
path.push(host);
|
||||||
|
path.push(user);
|
||||||
|
return path.exists();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_user_messages(&self, user: &str) -> Option<BTreeMap<String, Message>> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_message(&self, user: &str, title: &str) -> Option<Message> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn move_message(&mut self, user: &str, title: &str, folder: &str) {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_user(&mut self, user: &str) -> Result<(), ParseMailboxError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn remove_user(&mut self, user: &str) -> bool {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MultiDomain for Filesystem {
|
||||||
|
type Error = io::Error;
|
||||||
|
|
||||||
|
fn domains(&self) -> Result<Vec<String>, Self::Error> {
|
||||||
|
Ok(self
|
||||||
|
.path
|
||||||
|
.read_dir()?
|
||||||
|
.filter(|x| {
|
||||||
|
if let Ok(x) = x {
|
||||||
|
if let Ok(t) = x.file_type() {
|
||||||
|
return t.is_dir();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
})
|
||||||
|
.map(|x| x.unwrap().file_name().to_string_lossy().to_string())
|
||||||
|
.collect::<Vec<String>>())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_domain(&mut self, domain: &str) -> Result<(), Self::Error> {
|
||||||
|
let mut path = self.path.clone();
|
||||||
|
path.push(domain);
|
||||||
|
if !path.exists() {
|
||||||
|
fs::DirBuilder::new()
|
||||||
|
.recursive(true)
|
||||||
|
.mode(700)
|
||||||
|
.create(path)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn remove_domain(&mut self, domain: &str) -> Result<(), Self::Error> {
|
||||||
|
let mut path = self.path.clone();
|
||||||
|
path.push(domain);
|
||||||
|
if path.exists() {
|
||||||
|
fs::remove_dir_all(path)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,8 @@ use std::{
|
||||||
#[cfg(feature = "serde")]
|
#[cfg(feature = "serde")]
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
pub mod filesystem;
|
||||||
|
|
||||||
pub trait MailStore {
|
pub trait MailStore {
|
||||||
/// Retreives a list of all valid mailusers on this server
|
/// Retreives a list of all valid mailusers on this server
|
||||||
fn users(&self) -> Vec<Mailuser>;
|
fn users(&self) -> Vec<Mailuser>;
|
||||||
|
@ -19,6 +21,8 @@ pub trait MailStore {
|
||||||
/// Checks whether this server has a message with the given title for this user and if so
|
/// Checks whether this server has a message with the given title for this user and if so
|
||||||
/// returns the message
|
/// returns the message
|
||||||
fn get_message(&self, user: &str, title: &str) -> Option<Message>;
|
fn get_message(&self, user: &str, title: &str) -> Option<Message>;
|
||||||
|
/// Move a message to a new folder
|
||||||
|
fn move_message(&mut self, user: &str, title: &str, folder: &str);
|
||||||
/// Adds a new mailuser to the given domain
|
/// Adds a new mailuser to the given domain
|
||||||
fn add_user(&mut self, user: &str) -> Result<(), ParseMailboxError>;
|
fn add_user(&mut self, user: &str) -> Result<(), ParseMailboxError>;
|
||||||
/// Removes the given user if the account exists
|
/// Removes the given user if the account exists
|
||||||
|
@ -80,6 +84,10 @@ impl MailStore for Domain {
|
||||||
.cloned()
|
.cloned()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn move_message(&mut self, user: &str, title: &str, folder: &str) {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
fn add_user(&mut self, user: &str) -> Result<(), ParseMailboxError> {
|
fn add_user(&mut self, user: &str) -> Result<(), ParseMailboxError> {
|
||||||
if self.users.contains_key(user) {
|
if self.users.contains_key(user) {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
|
Loading…
Add table
Reference in a new issue