2017-01-25 18:51:41 +01:00
|
|
|
// Copyright 2015-2017 Parity Technologies (UK) Ltd.
|
2016-06-20 10:06:49 +02:00
|
|
|
// This file is part of Parity.
|
|
|
|
|
|
|
|
// Parity is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// Parity is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2016-08-11 18:31:28 +02:00
|
|
|
use std::path::{PathBuf};
|
2016-06-20 00:10:34 +02:00
|
|
|
use {SafeAccount, Error};
|
|
|
|
|
|
|
|
mod disk;
|
|
|
|
mod geth;
|
2016-12-09 10:45:34 +01:00
|
|
|
mod memory;
|
2016-06-20 00:10:34 +02:00
|
|
|
mod parity;
|
2017-01-30 11:44:09 +01:00
|
|
|
mod vault;
|
2016-06-20 00:10:34 +02:00
|
|
|
|
|
|
|
pub enum DirectoryType {
|
|
|
|
Testnet,
|
|
|
|
Main,
|
|
|
|
}
|
|
|
|
|
2017-01-30 11:44:09 +01:00
|
|
|
/// `VaultKeyDirectory::set_key` error
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub enum SetKeyError {
|
|
|
|
/// Error is fatal and directory is probably in inconsistent state
|
|
|
|
Fatal(Error),
|
|
|
|
/// Error is non fatal, directory is reverted to pre-operation state
|
|
|
|
NonFatalOld(Error),
|
|
|
|
/// Error is non fatal, directory is consistent with new key
|
|
|
|
NonFatalNew(Error),
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Vault key
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
|
|
pub struct VaultKey {
|
|
|
|
/// Vault password
|
|
|
|
pub password: String,
|
|
|
|
/// Number of iterations to produce a derived key from password
|
|
|
|
pub iterations: u32,
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Keys directory
|
2016-06-20 00:10:34 +02:00
|
|
|
pub trait KeyDirectory: Send + Sync {
|
2017-01-30 11:44:09 +01:00
|
|
|
/// Read keys from directory
|
2016-06-20 00:10:34 +02:00
|
|
|
fn load(&self) -> Result<Vec<SafeAccount>, Error>;
|
2017-01-30 11:44:09 +01:00
|
|
|
/// Insert new key to directory
|
2016-07-25 10:45:45 +02:00
|
|
|
fn insert(&self, account: SafeAccount) -> Result<SafeAccount, Error>;
|
2017-01-30 11:44:09 +01:00
|
|
|
//// Update key in directory
|
2016-12-09 09:31:58 +01:00
|
|
|
fn update(&self, account: SafeAccount) -> Result<SafeAccount, Error>;
|
2017-01-30 11:44:09 +01:00
|
|
|
/// Remove key from directory
|
2016-11-30 13:47:14 +01:00
|
|
|
fn remove(&self, account: &SafeAccount) -> Result<(), Error>;
|
2017-01-30 11:44:09 +01:00
|
|
|
/// Get directory filesystem path, if available
|
2016-08-11 18:31:28 +02:00
|
|
|
fn path(&self) -> Option<&PathBuf> { None }
|
2017-01-30 11:44:09 +01:00
|
|
|
/// Return vault provider, if available
|
|
|
|
fn as_vault_provider(&self) -> Option<&VaultKeyDirectoryProvider> { None }
|
2017-02-16 21:04:39 +01:00
|
|
|
/// Unique representation of directory account collection
|
|
|
|
fn unique_repr(&self) -> Result<u64, Error>;
|
2017-01-30 11:44:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Vaults provider
|
|
|
|
pub trait VaultKeyDirectoryProvider {
|
|
|
|
/// Create new vault with given key
|
|
|
|
fn create(&self, name: &str, key: VaultKey) -> Result<Box<VaultKeyDirectory>, Error>;
|
|
|
|
/// Open existing vault with given key
|
|
|
|
fn open(&self, name: &str, key: VaultKey) -> Result<Box<VaultKeyDirectory>, Error>;
|
2017-02-05 16:17:56 +01:00
|
|
|
/// List all vaults
|
|
|
|
fn list_vaults(&self) -> Result<Vec<String>, Error>;
|
2017-02-09 16:47:22 +01:00
|
|
|
/// Get vault meta
|
|
|
|
fn vault_meta(&self, name: &str) -> Result<String, Error>;
|
2017-01-30 11:44:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Vault directory
|
|
|
|
pub trait VaultKeyDirectory: KeyDirectory {
|
|
|
|
/// Cast to `KeyDirectory`
|
|
|
|
fn as_key_directory(&self) -> &KeyDirectory;
|
|
|
|
/// Vault name
|
|
|
|
fn name(&self) -> &str;
|
2017-02-05 16:17:56 +01:00
|
|
|
/// Get vault key
|
|
|
|
fn key(&self) -> VaultKey;
|
2017-01-30 11:44:09 +01:00
|
|
|
/// Set new key for vault
|
2017-02-05 16:17:56 +01:00
|
|
|
fn set_key(&self, key: VaultKey) -> Result<(), SetKeyError>;
|
2017-02-08 13:53:39 +01:00
|
|
|
/// Get vault meta
|
|
|
|
fn meta(&self) -> String;
|
|
|
|
/// Set vault meta
|
|
|
|
fn set_meta(&self, meta: &str) -> Result<(), Error>;
|
2016-06-20 00:10:34 +02:00
|
|
|
}
|
|
|
|
|
2017-01-30 11:44:09 +01:00
|
|
|
pub use self::disk::RootDiskDirectory;
|
2016-06-20 00:10:34 +02:00
|
|
|
pub use self::geth::GethDirectory;
|
2016-12-09 10:45:34 +01:00
|
|
|
pub use self::memory::MemoryDirectory;
|
2016-06-20 00:10:34 +02:00
|
|
|
pub use self::parity::ParityDirectory;
|
2017-01-30 11:44:09 +01:00
|
|
|
pub use self::vault::VaultDiskDirectory;
|
|
|
|
|
|
|
|
impl VaultKey {
|
|
|
|
/// Create new vault key
|
|
|
|
pub fn new(password: &str, iterations: u32) -> Self {
|
|
|
|
VaultKey {
|
|
|
|
password: password.to_owned(),
|
|
|
|
iterations: iterations,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|