aboutsummaryrefslogtreecommitdiff
path: root/lockchain-files/src
diff options
context:
space:
mode:
Diffstat (limited to 'lockchain-files/src')
-rw-r--r--lockchain-files/src/config.rs34
-rw-r--r--lockchain-files/src/create.rs33
-rw-r--r--lockchain-files/src/fs/mod.rs15
-rw-r--r--lockchain-files/src/fs/primitive.rs9
-rw-r--r--lockchain-files/src/lib.rs19
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>> {