diff options
author | Katharina Fey <kookie@spacekookie.de> | 2017-12-12 21:49:05 +0100 |
---|---|---|
committer | Katharina Fey <kookie@spacekookie.de> | 2017-12-12 21:49:05 +0100 |
commit | 32f3e6eff7724acd687c2254d69b958294105b4b (patch) | |
tree | be7870f1071a4da2d53a212f9d8f0078344b0768 | |
parent | 155c62c922bbecdec8580bb9c8c0fd81d21dd4b8 (diff) |
Adding a function to load an existing vault
-rw-r--r-- | src/vault/mod.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/vault/mod.rs b/src/vault/mod.rs index 1595826..bd2712e 100644 --- a/src/vault/mod.rs +++ b/src/vault/mod.rs @@ -25,6 +25,8 @@ use std::fs; use std::fs::File; use std::io::prelude::*; +use serde_json; + /// This should be made pretty with actual Errors at some point pub enum ErrorType { VAULT_ALREADY_EXISTS, @@ -92,6 +94,60 @@ impl Vault { return Ok(me); } + pub fn load(name: &str, path: &str, password: &str) -> Vault { + + /* Construct the base path */ + let mut pathbuf = PathBuf::new(); + pathbuf.push(path); + pathbuf.push(format!("{}.vault", name)); + + /* Load the secret key */ + let mut key = String::new(); + { + pathbuf.push("primary.key"); + let key_path = pathbuf.as_os_str(); + let mut key_file = File::open(key_path).unwrap(); + key_file.read_to_string(&mut key).expect( + "Failed to load primary key file!", + ); + }; + + let crypto = CryptoEngine::load_existing(&key, password); + + /* Load all existing records */ + pathbuf.pop(); + pathbuf.push("records"); + let records = fs::read_dir(pathbuf.as_path()).unwrap(); + let mut record_map: HashMap<String, Record> = HashMap::new(); + + /* Decrypt and map all existing records */ + for entry in records { + let mut encrypted = String::new(); + let record = entry.unwrap(); + let mut file = File::open(record.path().as_os_str()).unwrap(); + file.read_to_string(&mut encrypted).unwrap(); + + /* Make the encrypted data a vector */ + let record_bytes = encrypted.as_bytes(); + let mut record_vector: Vec<u8> = Vec::new(); + for byte in record_bytes { + record_vector.push(*byte); + } + let decrypted = crypto.decrypt(&record_vector); + let a_record: Record = serde_json::from_str(&decrypted).unwrap(); + + let name = a_record.header.name.clone(); + record_map.insert(name, a_record); + } + + return Vault { + name: String::from(name), + path: PathBuf::new(), + crypto: crypto, + records: record_map, + }; + } + /**************************/ /// Create all relevant directories |