rootftp 0.3.1

A simple FTP server tool that allows you to play with files. Multiple users can share their files with each other. You can also build custom plugins see examples for more info.
Documentation
use libunftp::auth::UserDetail;
use serde::{Deserialize, Serialize};
use std::fmt::Formatter;
use std::path::PathBuf;
use std::sync::Mutex;
use unftp_sbe_fs::Filesystem;
use unftp_sbe_fs::Meta;
use unftp_sbe_rooter::RooterVfs;
use unftp_sbe_rooter::UserWithRoot;

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct UserEntry {
    pub username: String,
    pub password: String,
    pub home_dir: Option<PathBuf>,
}
impl UserDetail for UserEntry {
    fn account_enabled(&self) -> bool {
        true
    }
}
impl std::fmt::Display for UserEntry {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f, "User(username: {:?}", self.username)
    }
}
impl UserWithRoot for UserEntry {
    fn user_root(&self) -> Option<PathBuf> {
        self.home_dir.clone()
    }
}
#[derive(Debug)]
pub struct SimpleAuthenticator {
    pub path: PathBuf,
    pub users: Mutex<Vec<UserEntry>>,
}

pub fn create_rooted_storage(
    base_dir: PathBuf,
) -> Box<dyn Fn() -> RooterVfs<Filesystem, UserEntry, Meta> + Send + Sync> {
    Box::new(move || {
        let fs =
            Filesystem::new(base_dir.clone()).unwrap_or_else(|e| panic!("Filesystem err:{}", e));
        RooterVfs::new(fs)
    })
}