diff options
| author | 魏曹先生 <1992414357@qq.com> | 2025-09-21 16:18:51 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2025-09-21 16:18:51 +0800 |
| commit | a1a4c428827fa6d94eb809793076f497d7e2933d (patch) | |
| tree | 1965b05ef0a8f466bb7143e3e2dbe981cb1260d7 /crates/env | |
| parent | 31efcc0c32c04eba8711891cce3a015e00c8955e (diff) | |
Add MemberManager
Diffstat (limited to 'crates/env')
| -rw-r--r-- | crates/env/src/member/manager.rs | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/crates/env/src/member/manager.rs b/crates/env/src/member/manager.rs new file mode 100644 index 0000000..a6a2b50 --- /dev/null +++ b/crates/env/src/member/manager.rs @@ -0,0 +1,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 {} |
