From bf4b3eb8815b75f11deb4f22b44ba7e41aa0b8fc Mon Sep 17 00:00:00 2001 From: Guillaume Ballet Date: Wed, 12 Dec 2018 17:26:13 +0100 Subject: [PATCH 01/11] whisper/cli: add p2p port and ip parameters This is so that those params don't change randomly and are in sync with the URL that is displayed. --- whisper/cli/src/main.rs | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/whisper/cli/src/main.rs b/whisper/cli/src/main.rs index 9ef2304b478..c42a6427068 100644 --- a/whisper/cli/src/main.rs +++ b/whisper/cli/src/main.rs @@ -45,6 +45,8 @@ use std::{fmt, io, process, env, sync::Arc}; use jsonrpc_core::{Metadata, MetaIoHandler}; use jsonrpc_pubsub::{PubSubMetadata, Session}; use jsonrpc_http_server::{AccessControlAllowOrigin, DomainsValidation}; +use std::net::{SocketAddr, SocketAddrV4, Ipv4Addr}; +use std::str::FromStr; const POOL_UNIT: usize = 1024 * 1024; const USAGE: &'static str = r#" @@ -57,8 +59,10 @@ Usage: Options: --whisper-pool-size SIZE Specify Whisper pool size [default: 10]. - -p, --port PORT Specify which RPC port to use [default: 8545]. - -a, --address ADDRESS Specify which address to use [default: 127.0.0.1]. + -p, --port PORT Specify which P2P port to use [default: random]. + -a, --address ADDRESS Specify which P2P address to use [default: 127.0.0.1]. + -P, --rpc-port PORT Specify which RPC port to use [default: 8545]. + -A, --rpc-address ADDRESS Specify which RPC address to use [default: 127.0.0.1]. -l, --log LEVEL Specify the logging level. Must conform to the same format as RUST_LOG [default: Error]. -h, --help Display this message and exit. "#; @@ -79,6 +83,8 @@ struct Args { flag_whisper_pool_size: usize, flag_port: String, flag_address: String, + flag_rpc_port: String, + flag_rpc_address: String, flag_log: String, } @@ -196,7 +202,7 @@ fn execute(command: I) -> Result<(), Error> where I: IntoIterator, // Parse arguments let args: Args = Docopt::new(USAGE).and_then(|d| d.argv(command).deserialize())?; let pool_size = args.flag_whisper_pool_size * POOL_UNIT; - let url = format!("{}:{}", args.flag_address, args.flag_port); + let rpc_url = format!("{}:{}", args.flag_rpc_address, args.flag_rpc_port); initialize_logger(args.flag_log); info!(target: "whisper-cli", "start"); @@ -207,8 +213,20 @@ fn execute(command: I) -> Result<(), Error> where I: IntoIterator, // Whisper protocol network handler let whisper_network_handler = Arc::new(whisper::net::Network::new(pool_size, manager.clone())); + let network_config = { + let mut cfg = net::NetworkConfiguration::new(); + let port = match &args.flag_port[..] { + "random" => 0 as u16, + port => port.parse::().expect("Invalid port specifier") + }; + let addr = Ipv4Addr::from_str(&args.flag_address[..]).expect("Could not decode IP address"); + cfg.listen_address = Some(SocketAddr::V4(SocketAddrV4::new(addr, port))); + cfg.nat_enabled = false; + cfg + }; + // Create network service - let network = devp2p::NetworkService::new(net::NetworkConfiguration::new_local(), None)?; + let network = devp2p::NetworkService::new(network_config, None)?; // Start network service network.start().map_err(|(err, _)| err)?; @@ -233,7 +251,7 @@ fn execute(command: I) -> Result<(), Error> where I: IntoIterator, let server = jsonrpc_http_server::ServerBuilder::new(io) .cors(DomainsValidation::AllowOnly(vec![AccessControlAllowOrigin::Null])) - .start_http(&url.parse()?)?; + .start_http(&rpc_url.parse()?)?; server.wait(); From ab803e763e98ae3bddab8c39505b3435a324bf0a Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 13 Dec 2018 09:24:20 +0100 Subject: [PATCH 02/11] feedback: Result instead of panic Co-Authored-By: gballet --- whisper/cli/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whisper/cli/src/main.rs b/whisper/cli/src/main.rs index c42a6427068..f9bc2fb7108 100644 --- a/whisper/cli/src/main.rs +++ b/whisper/cli/src/main.rs @@ -219,7 +219,7 @@ fn execute(command: I) -> Result<(), Error> where I: IntoIterator, "random" => 0 as u16, port => port.parse::().expect("Invalid port specifier") }; - let addr = Ipv4Addr::from_str(&args.flag_address[..]).expect("Could not decode IP address"); + let addr = Ipv4Addr::from_str(&args.flag_address[..])?; cfg.listen_address = Some(SocketAddr::V4(SocketAddrV4::new(addr, port))); cfg.nat_enabled = false; cfg From 95b1d9af9039cd9cf00bc4ed983d6ebc8c23789f Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 13 Dec 2018 09:28:51 +0100 Subject: [PATCH 03/11] feedback: Map error in port conversion Co-Authored-By: gballet --- whisper/cli/src/main.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/whisper/cli/src/main.rs b/whisper/cli/src/main.rs index f9bc2fb7108..cf07edbd7a3 100644 --- a/whisper/cli/src/main.rs +++ b/whisper/cli/src/main.rs @@ -217,7 +217,8 @@ fn execute(command: I) -> Result<(), Error> where I: IntoIterator, let mut cfg = net::NetworkConfiguration::new(); let port = match &args.flag_port[..] { "random" => 0 as u16, - port => port.parse::().expect("Invalid port specifier") + port => port.parse::().map_err(|e| e.to_string())?, + }; let addr = Ipv4Addr::from_str(&args.flag_address[..])?; cfg.listen_address = Some(SocketAddr::V4(SocketAddrV4::new(addr, port))); From 5480b764188aa1219cbb4de0d4d3441061fd82f6 Mon Sep 17 00:00:00 2001 From: Guillaume Ballet Date: Thu, 13 Dec 2018 11:07:04 +0100 Subject: [PATCH 04/11] whisper/cli: User can specify enode private key So that the enode doesn't change at every run. --- Cargo.lock | 2 ++ whisper/cli/Cargo.toml | 2 ++ whisper/cli/src/main.rs | 15 +++++++++++++++ 3 files changed, 19 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 5902aa786cd..f59227ba5b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4369,12 +4369,14 @@ dependencies = [ "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-network 1.12.0", "ethcore-network-devp2p 1.12.0", + "ethkey 0.3.0", "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-http-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-pubsub 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "panic_hook 0.1.0", "parity-whisper 0.1.0", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/whisper/cli/Cargo.toml b/whisper/cli/Cargo.toml index 4d123c09ab7..16ea367275c 100644 --- a/whisper/cli/Cargo.toml +++ b/whisper/cli/Cargo.toml @@ -18,6 +18,8 @@ panic_hook = { path = "../../util/panic-hook" } parity-whisper = { path = "../" } serde = "1.0" serde_derive = "1.0" +ethkey = { path = "../../accounts/ethkey" } +rustc-hex = "1.0" [[bin]] name = "whisper" diff --git a/whisper/cli/src/main.rs b/whisper/cli/src/main.rs index cf07edbd7a3..b1da07593fc 100644 --- a/whisper/cli/src/main.rs +++ b/whisper/cli/src/main.rs @@ -33,6 +33,8 @@ extern crate serde; extern crate jsonrpc_core; extern crate jsonrpc_pubsub; extern crate jsonrpc_http_server; +extern crate ethkey; +extern crate rustc_hex; #[macro_use] extern crate log as rlog; @@ -47,6 +49,8 @@ use jsonrpc_pubsub::{PubSubMetadata, Session}; use jsonrpc_http_server::{AccessControlAllowOrigin, DomainsValidation}; use std::net::{SocketAddr, SocketAddrV4, Ipv4Addr}; use std::str::FromStr; +use ethkey::Secret; +use rustc_hex::FromHex; const POOL_UNIT: usize = 1024 * 1024; const USAGE: &'static str = r#" @@ -61,6 +65,7 @@ Options: --whisper-pool-size SIZE Specify Whisper pool size [default: 10]. -p, --port PORT Specify which P2P port to use [default: random]. -a, --address ADDRESS Specify which P2P address to use [default: 127.0.0.1]. + -s, --secret KEYFILE Specify which file contains the key to generate the enode. -P, --rpc-port PORT Specify which RPC port to use [default: 8545]. -A, --rpc-address ADDRESS Specify which RPC address to use [default: 127.0.0.1]. -l, --log LEVEL Specify the logging level. Must conform to the same format as RUST_LOG [default: Error]. @@ -86,6 +91,7 @@ struct Args { flag_rpc_port: String, flag_rpc_address: String, flag_log: String, + flag_secret: String, } struct WhisperPoolHandle { @@ -222,6 +228,15 @@ fn execute(command: I) -> Result<(), Error> where I: IntoIterator, }; let addr = Ipv4Addr::from_str(&args.flag_address[..])?; cfg.listen_address = Some(SocketAddr::V4(SocketAddrV4::new(addr, port))); + cfg.use_secret = match args.flag_secret.as_str() { + "" => None, + fname => { + let key_text = std::fs::read_to_string(fname)?; + let key = FromHex::from_hex(key_text.as_str()) + .map_err(|e| format!("Error converting key: {}", e.to_string()))?; + Secret::from_slice(key.as_slice()) + } + }; cfg.nat_enabled = false; cfg }; From 72cbf2e5b4670b8e632890ae078b47f6379a9476 Mon Sep 17 00:00:00 2001 From: Guillaume Ballet Date: Thu, 13 Dec 2018 11:07:44 +0100 Subject: [PATCH 05/11] whipser/cli: finish integrating review feedback. --- whisper/cli/src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/whisper/cli/src/main.rs b/whisper/cli/src/main.rs index b1da07593fc..d2bedd98eef 100644 --- a/whisper/cli/src/main.rs +++ b/whisper/cli/src/main.rs @@ -221,9 +221,9 @@ fn execute(command: I) -> Result<(), Error> where I: IntoIterator, let network_config = { let mut cfg = net::NetworkConfiguration::new(); - let port = match &args.flag_port[..] { + let port = match args.flag_port.as_str() { "random" => 0 as u16, - port => port.parse::().map_err(|e| e.to_string())?, + port => port.parse::().map_err(|e| e.to_string())?, }; let addr = Ipv4Addr::from_str(&args.flag_address[..])?; From 2afee3234646e4410135ccf93d3dafd1824b2eb7 Mon Sep 17 00:00:00 2001 From: Guillaume Ballet Date: Mon, 18 Mar 2019 15:02:21 +0100 Subject: [PATCH 06/11] Accomodate error API change --- whisper/cli/src/main.rs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/whisper/cli/src/main.rs b/whisper/cli/src/main.rs index d2bedd98eef..5ffdd783deb 100644 --- a/whisper/cli/src/main.rs +++ b/whisper/cli/src/main.rs @@ -143,6 +143,8 @@ enum Error { JsonRpc(jsonrpc_core::Error), Network(net::Error), SockAddr(std::net::AddrParseError), + FromHex(rustc_hex::FromHexError), + ParseInt(std::num::ParseIntError), } impl From for Error { @@ -175,6 +177,18 @@ impl From for Error { } } +impl From for Error { + fn from(err: rustc_hex::FromHexError) -> Self { + Error::FromHex(err) + } +} + +impl From for Error { + fn from(err: std::num::ParseIntError) -> Self { + Error::ParseInt(err) + } +} + impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { match *self { @@ -183,6 +197,8 @@ impl fmt::Display for Error { Error::Io(ref e) => write!(f, "{}", e), Error::JsonRpc(ref e) => write!(f, "{:?}", e), Error::Network(ref e) => write!(f, "{}", e), + Error::ParseInt(ref e) => write!(f, "Invalid port: {}", e), + Error::FromHex(ref e) => write!(f, "Error decyphering key: {}", e), } } } @@ -223,7 +239,7 @@ fn execute(command: I) -> Result<(), Error> where I: IntoIterator, let mut cfg = net::NetworkConfiguration::new(); let port = match args.flag_port.as_str() { "random" => 0 as u16, - port => port.parse::().map_err(|e| e.to_string())?, + port => port.parse::()?, }; let addr = Ipv4Addr::from_str(&args.flag_address[..])?; @@ -232,8 +248,7 @@ fn execute(command: I) -> Result<(), Error> where I: IntoIterator, "" => None, fname => { let key_text = std::fs::read_to_string(fname)?; - let key = FromHex::from_hex(key_text.as_str()) - .map_err(|e| format!("Error converting key: {}", e.to_string()))?; + let key = FromHex::from_hex(key_text.as_str())?; Secret::from_slice(key.as_slice()) } }; From 5cedb7bb7812d22e8418ac6b70ad3318077e15cc Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Wed, 20 Mar 2019 17:21:59 +0100 Subject: [PATCH 07/11] Update rustc-hex version in whisper/cli/Cargo.toml Co-Authored-By: gballet --- whisper/cli/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whisper/cli/Cargo.toml b/whisper/cli/Cargo.toml index 16ea367275c..5ed38e47d71 100644 --- a/whisper/cli/Cargo.toml +++ b/whisper/cli/Cargo.toml @@ -19,7 +19,7 @@ parity-whisper = { path = "../" } serde = "1.0" serde_derive = "1.0" ethkey = { path = "../../accounts/ethkey" } -rustc-hex = "1.0" +rustc-hex = "2.0" [[bin]] name = "whisper" From eb3e6ef5b8ee933bd499d94bc18a4216e9f614f3 Mon Sep 17 00:00:00 2001 From: Guillaume Ballet Date: Wed, 20 Mar 2019 17:28:23 +0100 Subject: [PATCH 08/11] Update README with new whisper cli options --- whisper/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/whisper/README.md b/whisper/README.md index dc449568aa7..304995aae36 100644 --- a/whisper/README.md +++ b/whisper/README.md @@ -14,8 +14,11 @@ Usage: Options: --whisper-pool-size SIZE Specify Whisper pool size [default: 10]. - -p, --port PORT Specify which RPC port to use [default: 8545]. - -a, --address ADDRESS Specify which address to use [default: 127.0.0.1]. + -p, --port PORT Specify which P2P port to use [default: random]. + -a, --address ADDRESS Specify which P@P address to use [default: 127.0.0.1]. + -s, --secret KEYFILE Specify which file contains the key to generate the enode. + -P, --rpc-port PORT Specify which RPC port to use [default: 8545]. + -A, --rpc-address ADDRESS Specify which RPC address to use [default: 127.0.0.1]. -l, --log LEVEL Specify the logging level. Must conform to the same format as RUST_LOG [default: Error]. -h, --help Display this message and exit. ``` From d802432d14bb352245b17992e821c13784a034df Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 20 Mar 2019 17:29:21 +0100 Subject: [PATCH 09/11] Fix typo in error message Co-Authored-By: gballet --- whisper/cli/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whisper/cli/src/main.rs b/whisper/cli/src/main.rs index 5ffdd783deb..1590ffb030e 100644 --- a/whisper/cli/src/main.rs +++ b/whisper/cli/src/main.rs @@ -198,7 +198,7 @@ impl fmt::Display for Error { Error::JsonRpc(ref e) => write!(f, "{:?}", e), Error::Network(ref e) => write!(f, "{}", e), Error::ParseInt(ref e) => write!(f, "Invalid port: {}", e), - Error::FromHex(ref e) => write!(f, "Error decyphering key: {}", e), + Error::FromHex(ref e) => write!(f, "Error deciphering key: {}", e), } } } From 27e0fc9e944bea86d3a6f65048f00f7f5fd8013a Mon Sep 17 00:00:00 2001 From: Guillaume Ballet Date: Wed, 20 Mar 2019 17:43:52 +0100 Subject: [PATCH 10/11] Fix Cargo.lock and build issue after lib version upgrade --- Cargo.lock | 2 +- whisper/cli/src/main.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f59227ba5b9..811bb6cbc71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4376,7 +4376,7 @@ dependencies = [ "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "panic_hook 0.1.0", "parity-whisper 0.1.0", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/whisper/cli/src/main.rs b/whisper/cli/src/main.rs index 1590ffb030e..41d9e80e42d 100644 --- a/whisper/cli/src/main.rs +++ b/whisper/cli/src/main.rs @@ -248,7 +248,7 @@ fn execute(command: I) -> Result<(), Error> where I: IntoIterator, "" => None, fname => { let key_text = std::fs::read_to_string(fname)?; - let key = FromHex::from_hex(key_text.as_str())?; + let key : Vec = FromHex::from_hex(key_text.as_str())?; Secret::from_slice(key.as_slice()) } }; From 2cf76edba16184a0467cc32402f7b509d5b2344f Mon Sep 17 00:00:00 2001 From: Andronik Ordian Date: Wed, 20 Mar 2019 17:46:01 +0100 Subject: [PATCH 11/11] Fix another typo Co-Authored-By: gballet --- whisper/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whisper/README.md b/whisper/README.md index 304995aae36..b64c0244f96 100644 --- a/whisper/README.md +++ b/whisper/README.md @@ -15,7 +15,7 @@ Usage: Options: --whisper-pool-size SIZE Specify Whisper pool size [default: 10]. -p, --port PORT Specify which P2P port to use [default: random]. - -a, --address ADDRESS Specify which P@P address to use [default: 127.0.0.1]. + -a, --address ADDRESS Specify which P2P address to use [default: 127.0.0.1]. -s, --secret KEYFILE Specify which file contains the key to generate the enode. -P, --rpc-port PORT Specify which RPC port to use [default: 8545]. -A, --rpc-address ADDRESS Specify which RPC address to use [default: 127.0.0.1].