From 0e516162c37cc7fe399bbd6222b5179ba550eea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristoffer=20Str=C3=B6m?= Date: Wed, 2 Nov 2016 17:14:05 +0100 Subject: [PATCH] Rebased on master --- Cargo.lock | 78 +++++++++++++++++++++++++++++++ Cargo.toml | 2 + parity/configuration.rs | 9 +--- rpc/src/v1/types/confirmations.rs | 5 +- rpc_cli/src/lib.rs | 16 ++++--- rpc_client/src/client.rs | 70 ++++++++++++++++++--------- 6 files changed, 142 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 36be7cbc8..2c9af0621 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -31,9 +31,11 @@ dependencies = [ "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "number_prefix 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-rpc-client 1.4.0", "regex 0.1.68 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.1.0", "rpassword 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rpc-cli 1.4.0", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -711,6 +713,14 @@ dependencies = [ "miniz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "futures" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "gcc" version = "0.3.35" @@ -1254,6 +1264,26 @@ dependencies = [ "syntex_syntax 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-rpc-client" +version = "1.4.0" +dependencies = [ + "ethcore-rpc 1.5.0", + "ethcore-signer 1.5.0", + "ethcore-util 1.5.0", + "futures 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ws 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parity-ui" version = "1.5.0" @@ -1533,6 +1563,29 @@ dependencies = [ "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rpassword" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rpc-cli" +version = "1.4.0" +dependencies = [ + "ethcore-bigint 0.1.2", + "ethcore-rpc 1.5.0", + "ethcore-util 1.5.0", + "futures 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-rpc-client 1.4.0", + "rpassword 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rust-crypto" version = "0.2.36" @@ -1763,6 +1816,14 @@ name = "target_info" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "tempdir" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "term" version = "0.2.14" @@ -1963,6 +2024,19 @@ dependencies = [ "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ws" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "httparse 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -2032,6 +2106,7 @@ dependencies = [ "checksum ethabi 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0c53453517f620847be51943db329276ae52f2e210cfc659e81182864be2f" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" "checksum flate2 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "3eeb481e957304178d2e782f2da1257f1434dfecbae883bafb61ada2a9fea3bb" +"checksum futures 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd89497091f8c5d3a65c6b4baf6d2f0731937a7c9217d2f89141b21437a9d96" "checksum gcc 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "91ecd03771effb0c968fd6950b37e89476a578aaf1c70297d8e92b6516ec3312" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum hamming 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65043da274378d68241eb9a8f8f8aa54e349136f7b8e12f63e3ef44043cc30e1" @@ -2118,6 +2193,7 @@ dependencies = [ "checksum rocksdb-sys 0.3.0 (git+https://github.com/ethcore/rust-rocksdb)" = "" "checksum rotor 0.6.3 (git+https://github.com/ethcore/rotor)" = "" "checksum rpassword 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5d3a99497c5c544e629cc8b359ae5ede321eba5fa8e5a8078f3ced727a976c3f" +"checksum rpassword 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab6e42be826e215f30ff830904f8f4a0933c6e2ae890e1af8b408f5bae60081e" "checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" "checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b" "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" @@ -2146,6 +2222,7 @@ dependencies = [ "checksum syntex_syntax 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44bded3cabafc65c90b663b1071bd2d198a9ab7515e6ce729e4570aaf53c407e" "checksum syntex_syntax 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7628a0506e8f9666fdabb5f265d0059b059edac9a3f810bda077abb5d826bd8d" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" +"checksum tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6" "checksum term 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "f2077e54d38055cf1ca0fd7933a2e00cd3ec8f6fed352b2a377f06dcdaaf3281" "checksum term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3deff8a2b3b6607d6d7cc32ac25c0b33709453ca9cceac006caac51e963cf94a" "checksum termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a" @@ -2172,6 +2249,7 @@ dependencies = [ "checksum winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4dfaaa8fbdaa618fa6914b59b2769d690dd7521920a18d84b42d254678dd5fd4" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum ws 0.5.3 (git+https://github.com/ethcore/ws-rs.git?branch=mio-upstream-stable)" = "" +"checksum ws 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7c47e9ca2f5c47d27f731b1bb9bb50cc05f9886bb84fbd52afa0ff97f4f61b06" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum xml-rs 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "65e74b96bd3179209dc70a980da6df843dff09e46eee103a0376c0949257e3ef" "checksum xmltree 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "472a9d37c7c53ab2391161df5b89b1f3bf76dab6ab150d7941ecbdd832282082" diff --git a/Cargo.toml b/Cargo.toml index 65bb0dbc6..85e55ed21 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,6 +47,8 @@ rlp = { path = "util/rlp" } ethcore-stratum = { path = "stratum" } ethcore-dapps = { path = "dapps", optional = true } clippy = { version = "0.0.103", optional = true} +rpc-cli = { path = "rpc_cli" } +parity-rpc-client = { path = "rpc_client" } [target.'cfg(windows)'.dependencies] winapi = "0.2" diff --git a/parity/configuration.rs b/parity/configuration.rs index f43cf3098..b72655daa 100644 --- a/parity/configuration.rs +++ b/parity/configuration.rs @@ -120,16 +120,12 @@ impl Configuration { let cmd = if self.args.flag_version { Cmd::Version -<<<<<<< HEAD - } else if self.args.cmd_signer && self.args.cmd_new_token { - Cmd::SignerToken(signer_conf) -======= } else if self.args.cmd_signer { - let mut authfile = PathBuf::from(signer_conf.signer_path); + let mut authfile = PathBuf::from(signer_conf.signer_path.clone()); authfile.push(AUTHCODE_FILENAME); if self.args.cmd_new_token { - Cmd::SignerToken(dirs.signer) + Cmd::SignerToken(signer_conf) } else if self.args.cmd_sign { let pwfile = self.args.flag_password.get(0).map(|pwfile| { PathBuf::from(pwfile) @@ -154,7 +150,6 @@ impl Configuration { } else { unreachable!(); } ->>>>>>> Add Ws Json rpc client and command line utils } else if self.args.cmd_tools && self.args.cmd_hash { Cmd::Hash(self.args.arg_file) } else if self.args.cmd_account { diff --git a/rpc/src/v1/types/confirmations.rs b/rpc/src/v1/types/confirmations.rs index fb4a23e57..582763914 100644 --- a/rpc/src/v1/types/confirmations.rs +++ b/rpc/src/v1/types/confirmations.rs @@ -48,10 +48,11 @@ impl fmt::Display for ConfirmationRequest { impl fmt::Display for ConfirmationPayload { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { - ConfirmationPayload::Transaction(ref transaction) + ConfirmationPayload::SendTransaction(ref transaction) => write!(f, "{}", transaction), - ConfirmationPayload::Sign(_) => write!(f, "TODO: data"), + ConfirmationPayload::SignTransaction(_) => write!(f, "TODO: data"), ConfirmationPayload::Decrypt(_) => write!(f, "TODO: decrypt"), + ConfirmationPayload::Signature(_) => write!(f, "TODO: signature"), } } } diff --git a/rpc_cli/src/lib.rs b/rpc_cli/src/lib.rs index b30c134ef..47f2947ee 100644 --- a/rpc_cli/src/lib.rs +++ b/rpc_cli/src/lib.rs @@ -18,8 +18,8 @@ use futures::Future; fn sign_interactive( signer: &mut SignerRpc, password: &str, - request: ConfirmationRequest) -{ + request: ConfirmationRequest +) { print!("\n{}\nSign this transaction? (y)es/(N)o/(r)eject: ", request); let _ = stdout().flush(); match BufReader::new(stdin()).lines().next() { @@ -43,7 +43,8 @@ fn sign_interactive( } fn sign_transactions( - signer: &mut SignerRpc, password: String + signer: &mut SignerRpc, + password: String ) -> Result { try!(signer.requests_to_confirm().map(|reqs| { match reqs { @@ -120,8 +121,7 @@ pub fn cmd_signer_list( signerport: u16, authfile: PathBuf ) -> Result { let addr = &format!("ws://127.0.0.1:{}", signerport); - let mut signer = try!(SignerRpc::new(addr, &authfile)); - signer.map_err(|err| { + let mut signer = try!(SignerRpc::new(addr, &authfile).map_err(|err| { format!("{:?}", err) })); list_transactions(&mut signer) @@ -154,7 +154,8 @@ pub fn cmd_signer_sign( _ => return Err(format!("No password in file")) } }, - Err(e) => return Err(format!("Could not open password file: {}", e)) + Err(e) => + return Err(format!("Could not open password file: {}", e)) } } None => { @@ -165,7 +166,8 @@ pub fn cmd_signer_sign( } } - let mut signer = try!(SignerRpc::new(&format!("ws://127.0.0.1:{}", signerport), &authfile).map_err(|err| { + let addr = &format!("ws://127.0.0.1:{}", signerport); + let mut signer = try!(SignerRpc::new(addr, &authfile).map_err(|err| { format!("{:?}", err) })); diff --git a/rpc_client/src/client.rs b/rpc_client/src/client.rs index dddea729f..84e9cedb9 100644 --- a/rpc_client/src/client.rs +++ b/rpc_client/src/client.rs @@ -13,15 +13,17 @@ use util::{Hashable, Mutex}; use url::Url; use std::fs::File; -use ws::{self, - Request, - Handler, - Sender, - Handshake, - Error as WsError, - ErrorKind as WsErrorKind, - Message, - Result as WsResult}; +use ws::{ + self, + Request, + Handler, + Sender, + Handshake, + Error as WsError, + ErrorKind as WsErrorKind, + Message, + Result as WsResult +}; use serde::Deserialize; use serde_json::{self as json, @@ -73,7 +75,8 @@ impl Handler for RpcHandler { r.add_protocol(&proto); Ok(r) }, - Err(e) => Err(WsError::new(WsErrorKind::Internal, format!("{}", e))), + Err(e) => + Err(WsError::new(WsErrorKind::Internal, format!("{}", e))), } } fn on_error(&mut self, err: WsError) { @@ -93,7 +96,8 @@ impl Handler for RpcHandler { Ok(()) }, _ => { - Err(WsError::new(WsErrorKind::Internal, format!("on_open called twice"))) + let msg = format!("on_open called twice"); + Err(WsError::new(WsErrorKind::Internal, msg)) } } } @@ -102,7 +106,8 @@ impl Handler for RpcHandler { let response_id; let string = &msg.to_string(); match json::from_str::(&string) { - Ok(SyncOutput::Success(Success { result, id: Id::Num(id), .. })) => { + Ok(SyncOutput::Success(Success { result, id: Id::Num(id), .. })) => + { ret = Ok(result); response_id = id as usize; } @@ -111,11 +116,20 @@ impl Handler for RpcHandler { response_id = id as usize; } Err(e) => { - warn!(target: "rpc-client", "recieved invalid message: {}\n {:?}", string, e); + warn!( + target: "rpc-client", + "recieved invalid message: {}\n {:?}", + string, + e + ); return Ok(()) }, _ => { - warn!(target: "rpc-client", "recieved invalid message: {}", string); + warn!( + target: "rpc-client", + "recieved invalid message: {}", + string + ); return Ok(()) } } @@ -124,7 +138,11 @@ impl Handler for RpcHandler { Some(c) => c.complete(ret.map_err(|err| { RpcError::JsonRpc(err) })), - None => warn!(target: "rpc-client", "warning: unexpected id: {}", response_id), + None => warn!( + target: "rpc-client", + "warning: unexpected id: {}", + response_id + ), } Ok(()) } @@ -132,7 +150,9 @@ impl Handler for RpcHandler { /// Keeping track of issued requests to be matched up with responses #[derive(Clone)] -struct Pending(Arc>>>>); +struct Pending( + Arc>>>> +); impl Pending { fn new() -> Self { @@ -141,7 +161,10 @@ impl Pending { fn insert(&mut self, k: usize, v: Complete>) { self.0.lock().insert(k, v); } - fn remove(&mut self, k: usize) -> Option>> { + fn remove( + &mut self, + k: usize + ) -> Option>> { self.0.lock().remove(&k) } } @@ -178,22 +201,24 @@ impl Rpc { Err(e) => return done(Ok(Err(e))).boxed(), Ok(code) => { let url = String::from(url); - // The ws::connect takes a FnMut closure, which means c cannot be - // moved into it, since it's consumed on complete. + // The ws::connect takes a FnMut closure, which means c cannot + // be moved into it, since it's consumed on complete. // Therefore we wrap it in an option and pick it out once. let mut once = Some(c); thread::spawn(move || { let conn = ws::connect(url, |out| { // this will panic if the closure is called twice, // which it should never be. - let c = once.take().expect("connection closure called only once"); + let c = once.take() + .expect("connection closure called only once"); RpcHandler::new(out, code.clone(), c) }); match conn { Err(err) => { // since ws::connect is only called once, it cannot // both fail and succeed. - let c = once.take().expect("connection closure called only once"); + let c = once.take() + .expect("connection closure called only once"); c.complete(Err(RpcError::WsError(err))); }, // c will complete on the `on_open` event in the Handler @@ -222,7 +247,8 @@ impl Rpc { id: Id::Num(id as u64), }; - let serialized = json::to_string(&request).expect("request is serializable"); + let serialized = json::to_string(&request) + .expect("request is serializable"); let _ = self.out.send(serialized); p.map(|result| {