geth import finish

This commit is contained in:
Nikolay Volf
2016-02-22 20:07:56 +03:00
parent a8f4d24dad
commit 753f52fc22
5 changed files with 95 additions and 3 deletions

View File

@@ -17,13 +17,18 @@
//! Geth keys import/export tool
use util::hash::*;
use util::keys::store::SecretStore;
use util::keys::directory::KeyFileContent;
use std::path::Path;
use std::result::*;
use std::fs;
use std::str::FromStr;
use std::io;
use std::io::Read;
use rustc_serialize::json::Json;
/// Enumerates all geth keys in the directory and returns collection of tuples `(accountId, filename)`
pub fn enumerate_geth_keys(path: &Path) -> Result<Vec<(Address, String)>, ::std::io::Error> {
pub fn enumerate_geth_keys(path: &Path) -> Result<Vec<(Address, String)>, io::Error> {
let mut entries = Vec::new();
for entry in try!(fs::read_dir(path)) {
let entry = try!(entry);
@@ -44,14 +49,57 @@ pub fn enumerate_geth_keys(path: &Path) -> Result<Vec<(Address, String)>, ::std:
Ok(entries)
}
#[derive(Debug)]
pub enum ImportError {
IoError(io::Error),
FormatError,
}
impl From<io::Error> for ImportError {
fn from (err: io::Error) -> ImportError {
ImportError::IoError(err)
}
}
pub fn import_geth_key(secret_store: &mut SecretStore, geth_keyfile_path: &Path) -> Result<(), ImportError> {
let mut file = try!(fs::File::open(geth_keyfile_path));
let mut buf = String::new();
try!(file.read_to_string(&mut buf));
let mut json = match Json::from_str(&buf) {
Ok(parsed_json) => try!(parsed_json.as_object().ok_or(ImportError::FormatError)).clone(),
Err(_) => { return Err(ImportError::FormatError); }
};
let crypto_object = try!(json.get("Crypto").and_then(|crypto| crypto.as_object()).ok_or(ImportError::FormatError)).clone();
json.insert("crypto".to_owned(), Json::Object(crypto_object.clone()));
json.remove("Crypto");
match KeyFileContent::load(&Json::Object(json.clone())) {
Ok(key_file) => try!(secret_store.import_key(key_file)),
Err(_) => { return Err(ImportError::FormatError); }
};
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use std::path::Path;
use util::hash::*;
use util::keys::store::SecretStore;
use std::str::FromStr;
#[test]
fn can_enumerate() {
let keys = enumerate_geth_keys(Path::new("res/geth_keystore")).unwrap();
assert_eq!(2, keys.len());
}
#[test]
fn can_import() {
let temp = ::devtools::RandomTempPath::new();
let mut secret_store = SecretStore::new_in(temp.as_path());
import_geth_key(&mut secret_store, Path::new("res/geth_keystore/UTC--2016-02-17T09-20-45.721400158Z--3f49624084b67849c7b4e805c5988c21a430f9d9")).unwrap();
let key = secret_store.account(&Address::from_str("3f49624084b67849c7b4e805c5988c21a430f9d9").unwrap());
assert!(key.is_some());
}
}

View File

@@ -17,5 +17,7 @@
//! Ethereum Tools Library
extern crate ethcore_util as util;
extern crate rustc_serialize;
extern crate ethcore_devtools as devtools;
pub mod geth_keys;