diff options
Diffstat (limited to 'lockchain-files/src')
-rw-r--r-- | lockchain-files/src/config.rs | 34 | ||||
-rw-r--r-- | lockchain-files/src/create.rs | 33 | ||||
-rw-r--r-- | lockchain-files/src/fs/mod.rs | 15 | ||||
-rw-r--r-- | lockchain-files/src/fs/primitive.rs | 9 | ||||
-rw-r--r-- | lockchain-files/src/lib.rs | 19 |
5 files changed, 62 insertions, 48 deletions
diff --git a/lockchain-files/src/config.rs b/lockchain-files/src/config.rs index 6d67d7d..1d71605 100644 --- a/lockchain-files/src/config.rs +++ b/lockchain-files/src/config.rs @@ -8,10 +8,10 @@ use std::{ }; use semver::Version; -use toml; +use serde_yaml; use utils::FileToString; -use lcc::{errors::VaultError, Generator, VaultType}; +use lcc::{errors::VaultError, VaultType}; /// A set of errors around `lockchain-files` configs #[derive(Debug)] @@ -43,21 +43,27 @@ impl Error for ConfigError {} pub struct VaultConfig { /// A semver conforming version string pub version: String, - pub vault_type: VaultType, + pub vault_type: ConfigType, pub created_at: SystemTime, pub modified_at: SystemTime, } -impl VaultConfig { - pub fn new(gen: &Generator) -> Result<Self, VaultError> { - let vt = gen - .user_type - .as_ref() - .ok_or(VaultError::IncompleteGenerator)?; +#[derive(Debug, Serialize, Deserialize)] +pub enum ConfigType { + SoloUser, + Administrated, + Unmanaged, +} +impl VaultConfig { + pub fn new(vt: &VaultType) -> Result<Self, VaultError> { Ok(Self { version: "0.1".into(), - vault_type: vt.clone(), + vault_type: match vt { + &VaultType::SoloUser { .. } => ConfigType::SoloUser, + &VaultType::Administrated { .. } => ConfigType::Administrated, + _ => ConfigType::Unmanaged, + }, created_at: SystemTime::now(), modified_at: SystemTime::now(), }) @@ -65,9 +71,9 @@ impl VaultConfig { pub fn save(&self, vault: &PathBuf) -> Result<(), io::Error> { let mut cfg_path = vault.clone(); - cfg_path.push("config.toml"); + cfg_path.push("vault.cfg"); - let t = toml::to_string(self).unwrap(); + let t = serde_yaml::to_string(self).unwrap(); let mut f = OO::new().create(true).write(true).open(cfg_path)?; f.write_all(t.as_bytes())?; Ok(()) @@ -76,11 +82,11 @@ impl VaultConfig { /// Attempts to load a configuration – returning detailed errors pub fn load(vault: &PathBuf) -> Result<Self, ConfigError> { let mut cfg_path = vault.clone(); - cfg_path.push("config.toml"); + cfg_path.push("vault.cfg"); let cfg: VaultConfig = match File::open(cfg_path.as_path()) { Ok(mut f) => match f.get_string() { - Ok(s) => match toml::from_str(&s) { + Ok(s) => match serde_yaml::from_str(&s) { Ok(c) => c, Err(_) => return Err(ConfigError::ConfigCorrupted), }, diff --git a/lockchain-files/src/create.rs b/lockchain-files/src/create.rs index e35c449..af84a83 100644 --- a/lockchain-files/src/create.rs +++ b/lockchain-files/src/create.rs @@ -18,40 +18,47 @@ impl<T: Body> FileVault<T> { /// A small utility to create a new file vault pub(crate) fn create(gen: Generator) -> Result<Self, VaultError> { let (name, location) = Self::get_path(&gen)?; + let vault_type = gen + .user_type + .as_ref() + .ok_or(VaultError::IncompleteGenerator)?; let fs = Filesystem::new(location, name); fs.scaffold().map_err(|_| VaultError::FailedCreation)?; - let config = VaultConfig::new(&gen)?; + let config = VaultConfig::new(&vault_type)?; let mut users = UserStore::new(); /* At this point we'll have to create some user */ use self::VaultType::*; - match &config.vault_type { - SoloUser { username, secret } => users.add_user( - username.clone(), - Key::from_pw(KeyType::Aes256, &secret, &username), - ), - Administrated { secret } => users.add_user( - "Admin".into(), - Key::from_pw(KeyType::Aes256, &secret, "admin"), - ), + match vault_type { + SoloUser { username, secret } => users.add_user(username.clone(), secret.clone()), + Administrated { secret } => users.add_user("Admin".into(), secret.clone()), } let mut me = Self { config, fs, users, - ..Default::default() + records: HashMap::new(), + headers: HashMap::new(), + metadata: HashMap::new(), }; - /* Make sure to sync all made changes after the scaffold */ + /* Make sure to sync all changes made after scaffold */ me.sync(); Ok(me) } fn get_path(gen: &Generator) -> Result<(&str, &str), VaultError> { - Err(VaultError::IncompleteGenerator) + match gen { + &Generator { + name: Some(ref n), + location: Some(ref l), + .. + } => Ok((&n, &l)), + _ => Err(VaultError::IncompleteGenerator), + } } } diff --git a/lockchain-files/src/fs/mod.rs b/lockchain-files/src/fs/mod.rs index 7820925..9f2bfe2 100644 --- a/lockchain-files/src/fs/mod.rs +++ b/lockchain-files/src/fs/mod.rs @@ -9,21 +9,22 @@ //! which will return either `Ok(())` or the first error in the list //! of operations. -use lcc::traits::{Body, AutoEncoder}; +use lcc::traits::{AutoEncoder, Body}; use std::collections::HashMap; use std::error::Error; use std::io::{self, Write}; use std::{ - fs::{self, File, OpenOptions as OO}, + fs::{self, File, OpenOptions}, path::PathBuf, }; use utils::FileToString; use FileVault; -pub mod primitive; +mod primitive; use self::primitive::*; +use userstore::DiskMirror; #[derive(Debug)] pub struct Filesystem { @@ -87,8 +88,14 @@ impl Filesystem { pub fn sync_vault<T: Body>(&self, vault: &FileVault<T>) -> Result<(), io::Error> { vault.config.save(&self.root)?; + primitive::write_file( + FileType::Metadata, + &self.root, + "userstore", + vault.users.to_disk(), + )?; - unimplemented!() + Ok(()) } /// Respond to a sync request diff --git a/lockchain-files/src/fs/primitive.rs b/lockchain-files/src/fs/primitive.rs index d567a28..f97cd49 100644 --- a/lockchain-files/src/fs/primitive.rs +++ b/lockchain-files/src/fs/primitive.rs @@ -47,7 +47,12 @@ fn type_path(tt: FileType, root: &PathBuf) -> PathBuf { path } -pub(crate) fn write_file(tt: FileType, root: PathBuf, name: &str, contents: Vec<u8>) -> Result<()> { +pub(crate) fn write_file( + tt: FileType, + root: &PathBuf, + name: &str, + contents: Vec<u8>, +) -> Result<()> { let file_name = format!("{}.{}", name, file_ending!(&tt)); let mut path = type_path(tt, &root); path.push(file_name); @@ -58,7 +63,7 @@ pub(crate) fn write_file(tt: FileType, root: PathBuf, name: &str, contents: Vec< Ok(()) } -pub(crate) fn read_file(tt: FileType, root: PathBuf, name: &str) -> Result<Vec<u8>> { +pub(crate) fn read_file(tt: FileType, root: &PathBuf, name: &str) -> Result<Vec<u8>> { let file_name = format!("{}.{}", name, file_ending!(&tt)); let mut path = type_path(tt, &root); path.push(file_name); diff --git a/lockchain-files/src/lib.rs b/lockchain-files/src/lib.rs index 1c88964..8332448 100644 --- a/lockchain-files/src/lib.rs +++ b/lockchain-files/src/lib.rs @@ -8,10 +8,10 @@ extern crate lockchain_core as lcc; extern crate semver; -extern crate toml; #[macro_use] extern crate serde_derive; +extern crate serde_yaml; extern crate serde; use lcc::traits::{Body, LoadRecord, Vault}; @@ -21,7 +21,6 @@ use lcc::{ Generator, Header, MetaDomain, Payload, Record, VaultMetadata, }; use std::collections::HashMap; -use std::default::Default; mod config; mod create; @@ -74,18 +73,6 @@ pub struct FileVault<T: Body> { metadata: HashMap<String, MetaDomain>, } -impl<T: Body> Default for FileVault<T> { - #[allow(unconditional_recursion)] - fn default() -> Self { - Self { - records: HashMap::new(), - headers: HashMap::new(), - metadata: HashMap::new(), - ..Default::default() - } - } -} - impl<T: Body> LoadRecord<T> for FileVault<T> {} impl<T: Body> Vault<T> for FileVault<T> { @@ -159,13 +146,15 @@ impl<T: Body> Vault<T> for FileVault<T> { } fn sync(&mut self) { + self.fs.sync_vault(&self).unwrap(); + // self.fs // .sync::<Record<T>>(&self.records, FileType::Record) // .unwrap(); // self.fs // .sync::<MetaDomain>(&self.metadata, FileType::Metadata) // .unwrap(); - unimplemented!() + // unimplemented!() } fn get_record(&self, name: &str) -> Option<&Record<T>> { |