// Copyright 2015, 2016 Ethcore (UK) Ltd. // 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 . use std::path::PathBuf; use std::{env, fs}; use rand::{Rng, OsRng}; use ethstore::dir::{KeyDirectory, DiskDirectory}; use ethstore::{Error, SafeAccount}; pub fn random_dir() -> PathBuf { let mut rng = OsRng::new().unwrap(); let mut dir = env::temp_dir(); dir.push(format!("{:x}-{:x}", rng.next_u64(), rng.next_u64())); dir } pub struct TransientDir { dir: DiskDirectory, path: PathBuf, } impl TransientDir { pub fn create() -> Result { let path = random_dir(); let result = TransientDir { dir: try!(DiskDirectory::create(&path)), path: path, }; Ok(result) } pub fn open() -> Self { let path = random_dir(); TransientDir { dir: DiskDirectory::at(&path), path: path, } } } impl Drop for TransientDir { fn drop(&mut self) { fs::remove_dir_all(&self.path).expect("Expected to remove temp dir"); } } impl KeyDirectory for TransientDir { fn load(&self) -> Result, Error> { self.dir.load() } fn insert(&self, account: SafeAccount) -> Result { self.dir.insert(account) } fn remove(&self, account: &SafeAccount) -> Result<(), Error> { self.dir.remove(account) } }