From 2fd23dc18f7c8f820503dbcfecd7b5b9f1b80dd0 Mon Sep 17 00:00:00 2001 From: arkpar Date: Sun, 3 Apr 2016 11:36:21 +0200 Subject: [PATCH] Handle geth keys with lowercase `crypto` key --- ...--63121b431a52f8043c16fcf0d1df9cb7b5f66649 | 1 + util/src/keys/geth_import.rs | 28 ++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 util/res/geth_keystore/UTC--2016-04-03T08-58-49.834202900Z--63121b431a52f8043c16fcf0d1df9cb7b5f66649 diff --git a/util/res/geth_keystore/UTC--2016-04-03T08-58-49.834202900Z--63121b431a52f8043c16fcf0d1df9cb7b5f66649 b/util/res/geth_keystore/UTC--2016-04-03T08-58-49.834202900Z--63121b431a52f8043c16fcf0d1df9cb7b5f66649 new file mode 100644 index 000000000..08272d43b --- /dev/null +++ b/util/res/geth_keystore/UTC--2016-04-03T08-58-49.834202900Z--63121b431a52f8043c16fcf0d1df9cb7b5f66649 @@ -0,0 +1 @@ +{"address":"63121b431a52f8043c16fcf0d1df9cb7b5f66649","crypto":{"cipher":"aes-128-ctr","ciphertext":"1dd21926c644b9983916d646f3a4f2c7f9362f7e1c9fb1abcb42494dae06fa01","cipherparams":{"iv":"c52c6ee66d89a7aa8c6839f4b6ed29c8"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"96f17c17bbf48db2dc4da00b3e7decce8e21f44a5d7963dadeeff70e1d38ad75"},"mac":"f279f3444585c2817701225e2196c1176386ad549ebaec2bcc4f94f309727fe6"},"id":"15e49cd2-51fb-4316-ba46-c3cf8db4ae44","version":3} \ No newline at end of file diff --git a/util/src/keys/geth_import.rs b/util/src/keys/geth_import.rs index 6c684c37d..9f6be18eb 100644 --- a/util/src/keys/geth_import.rs +++ b/util/src/keys/geth_import.rs @@ -21,7 +21,7 @@ use keys::store::SecretStore; use keys::directory::KeyFileContent; /// Enumerates all geth keys in the directory and returns collection of tuples `(accountId, filename)` -pub fn enumerate_geth_keys(path: &Path) -> Result, io::Error> { +pub fn enumerate_geth_keys(path: &Path) -> Result, ImportError> { let mut entries = Vec::new(); for entry in try!(fs::read_dir(path)) { let entry = try!(entry); @@ -30,10 +30,8 @@ pub fn enumerate_geth_keys(path: &Path) -> Result, io::Er Some(name) => { let parts: Vec<&str> = name.split("--").collect(); if parts.len() != 3 { continue; } - match Address::from_str(parts[2]) { - Ok(account_id) => { entries.push((account_id, name.to_owned())); } - Err(e) => { panic!("error: {:?}", e); } - } + let account_id = try!(Address::from_str(parts[2]).map_err(|_| ImportError::Format)); + entries.push((account_id, name.to_owned())); }, None => { continue; } }; @@ -68,9 +66,10 @@ pub fn import_geth_key(secret_store: &mut SecretStore, geth_keyfile_path: &Path) Ok(ref mut parsed_json) => try!(parsed_json.as_object_mut().ok_or(ImportError::Format)), Err(_) => { return Err(ImportError::Format); } }; - let crypto_object = try!(json.get("Crypto").and_then(|crypto| crypto.as_object()).ok_or(ImportError::Format)).clone(); - json.insert("crypto".to_owned(), Json::Object(crypto_object)); - json.remove("Crypto"); + if let Some(crypto_object) = json.get("Crypto").and_then(|crypto| crypto.as_object()).cloned() { + json.insert("crypto".to_owned(), Json::Object(crypto_object)); + json.remove("Crypto"); + } match KeyFileContent::load(&Json::Object(json.clone())) { Ok(key_file) => try!(secret_store.import_key(key_file)), Err(_) => { return Err(ImportError::Format); } @@ -113,11 +112,11 @@ mod tests { #[test] fn can_enumerate() { let keys = enumerate_geth_keys(Path::new(test_path())).unwrap(); - assert_eq!(2, keys.len()); + assert_eq!(3, keys.len()); } #[test] - fn can_import() { + fn can_import_geth_old() { let temp = ::devtools::RandomTempPath::create_dir(); let mut secret_store = SecretStore::new_in(temp.as_path()); import_geth_key(&mut secret_store, Path::new(&test_path_param("/UTC--2016-02-17T09-20-45.721400158Z--3f49624084b67849c7b4e805c5988c21a430f9d9"))).unwrap(); @@ -125,6 +124,15 @@ mod tests { assert!(key.is_some()); } + #[test] + fn can_import_geth140() { + let temp = ::devtools::RandomTempPath::create_dir(); + let mut secret_store = SecretStore::new_in(temp.as_path()); + import_geth_key(&mut secret_store, Path::new(&test_path_param("/UTC--2016-04-03T08-58-49.834202900Z--63121b431a52f8043c16fcf0d1df9cb7b5f66649"))).unwrap(); + let key = secret_store.account(&Address::from_str("63121b431a52f8043c16fcf0d1df9cb7b5f66649").unwrap()); + assert!(key.is_some()); + } + #[test] fn can_import_directory() { let temp = ::devtools::RandomTempPath::create_dir();