diff options
Diffstat (limited to 'lockchain-core/src/users/keystore.rs')
-rw-r--r-- | lockchain-core/src/users/keystore.rs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/lockchain-core/src/users/keystore.rs b/lockchain-core/src/users/keystore.rs new file mode 100644 index 0000000..71d7be2 --- /dev/null +++ b/lockchain-core/src/users/keystore.rs @@ -0,0 +1,65 @@ +//! A keystore is a specific implementation of a metadata store +//! +//! At it's core it provides three simple functions +//! +//! - Adding keys for a user +//! - Removing keys +//! - Retrieving keys + +use traits::{AutoEncoder, Base64AutoEncoder}; +use {crypto::Key, meta::MetaDomain}; + +use std::collections::HashMap; + +#[derive(Serialize, Deserialize)] +pub struct KeyStore { + keys: HashMap<String, Key>, +} + +impl KeyStore { + pub fn add_key(&mut self, user: &str, key: Key) { + self.keys.insert(user.into(), key); + } + + pub fn revoke_key(&mut self, user: &str) { + self.keys.remove(user); + } +} + +impl AutoEncoder for KeyStore {} + +impl From<MetaDomain> for KeyStore { + fn from(d: MetaDomain) -> Self { + Self { + keys: d + .all() + .iter() + .map(|(k, v)| { + ( + k.clone(), + match v { + ::Payload::Text(s) => Key::decode(&String::from_base64(s)).unwrap(), + _ => unreachable!(), + }, + ) + }) + .collect(), + } + } +} + +impl From<KeyStore> for MetaDomain { + fn from(ks: KeyStore) -> Self { + MetaDomain::new("keystore").fill( + ks.keys + .iter() + .map(|(name, key)| { + ( + name.clone(), + ::Payload::Text(key.encode().unwrap().to_base64()), + ) + }) + .collect(), + ) + } +} |