summaryrefslogtreecommitdiff
path: root/crates/env/src/member/manager.rs
blob: a6a2b506085b4d9f5df1cdf7c1c13cc280d39f6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
use std::{
    fs,
    io::{Error, ErrorKind},
    path::PathBuf,
};

use cfg_file::config::ConfigFile;

use crate::{
    constants::{SERVER_FILE_MEMBER_INFO, SERVER_FILE_MEMBER_PUB},
    current::current_vault_path,
    member::Member,
    vault::config::MemberUuid,
};

pub struct VaultMemberManager;

const UUID_PARAM: &str = "{member_uuid}";

impl VaultMemberManager {
    /// Read member from configuration file
    pub async fn member(uuid: MemberUuid) -> Result<Member, std::io::Error> {
        if let Some(cfg_file) = Self::member_cfg(uuid)? {
            let member = Member::read_from(cfg_file).await?;
            return Ok(member);
        }

        Err(Error::new(ErrorKind::NotFound, "Member not found!"))
    }

    /// Register a member to vault
    pub async fn register_member_to_vault(member: Member) -> Result<(), std::io::Error> {
        // Ensure member not exist
        if let Some(_) = Self::member_cfg(member.uuid())? {
            return Err(Error::new(
                ErrorKind::DirectoryNotEmpty,
                format!("Member `{}` already registered!", member.id()),
            ));
        }

        // Wrtie config file to member dir
        let member_cfg_path = Self::member_cfg_path(member.uuid())?;
        Member::write_to(&member, member_cfg_path).await?;

        Ok(())
    }

    /// Remove member from vault
    pub fn remove_member_from_vault(uuid: MemberUuid) -> Result<(), std::io::Error> {
        // Ensure member exist
        if let Some(member_cfg_path) = Self::member_cfg(uuid)? {
            fs::remove_file(member_cfg_path)?;
        }

        Ok(())
    }

    /// Try to get the member's configuration file to determine if the member exists
    pub fn member_cfg(uuid: MemberUuid) -> Result<Option<PathBuf>, std::io::Error> {
        let cfg_file = Self::member_cfg_path(uuid)?;
        if cfg_file.exists() {
            Ok(Some(cfg_file))
        } else {
            Ok(None)
        }
    }

    /// Try to get the member's public key file to determine if the member has login permission
    pub fn member_key(uuid: MemberUuid) -> Result<Option<PathBuf>, std::io::Error> {
        let key_file = Self::member_key_path(uuid)?;
        if key_file.exists() {
            Ok(Some(key_file))
        } else {
            Ok(None)
        }
    }

    /// Get the member's configuration file path, but do not check if the file exists
    pub fn member_cfg_path(uuid: MemberUuid) -> Result<PathBuf, std::io::Error> {
        // Has vault
        let Some(vault) = current_vault_path() else {
            return Err(Error::new(ErrorKind::NotFound, "Vault not found!"));
        };

        let path =
            vault.join(SERVER_FILE_MEMBER_INFO.replace(UUID_PARAM, uuid.to_string().as_str()));
        Ok(path)
    }

    /// Get the member's public key file path, but do not check if the file exists
    pub fn member_key_path(uuid: MemberUuid) -> Result<PathBuf, std::io::Error> {
        // Has vault
        let Some(vault) = current_vault_path() else {
            return Err(Error::new(ErrorKind::NotFound, "Vault not found!"));
        };

        let path =
            vault.join(SERVER_FILE_MEMBER_PUB.replace(UUID_PARAM, uuid.to_string().as_str()));
        Ok(path)
    }
}

pub struct UserMemberManager;

impl UserMemberManager {}