From 1769fa8a5a2d2eec4e5e4a43052be81bc174c323 Mon Sep 17 00:00:00 2001 From: Jedrzej Stuczynski Date: Fri, 17 Jan 2020 11:59:59 +0000 Subject: [PATCH 1/7] mixnode: added announce-host and announce-port arguments --- mixnode/src/main.rs | 12 ++++++++++++ mixnode/src/node/mod.rs | 1 + mixnode/src/node/presence.rs | 2 +- mixnode/src/node/runner.rs | 13 +++++++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/mixnode/src/main.rs b/mixnode/src/main.rs index 6f92d4285c..ee05378043 100644 --- a/mixnode/src/main.rs +++ b/mixnode/src/main.rs @@ -32,6 +32,18 @@ fn main() { .takes_value(true) .required(true), ) + .arg( + Arg::with_name("announce_host") + .long("announce-host") + .help("The host that will be reported to the directory server") + .takes_value(true) + ) + .arg( + Arg::with_name("announce_port") + .long("announce-port") + .help("The port that will be reported to the directory server") + .takes_value(true) + ) .arg( Arg::with_name("directory") .long("directory") diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index f6e151803d..e7ac5b1c65 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -19,6 +19,7 @@ mod presence; pub mod runner; pub struct Config { + announce_socket_address: SocketAddr, directory_server: String, layer: usize, public_key: MontgomeryPoint, diff --git a/mixnode/src/node/presence.rs b/mixnode/src/node/presence.rs index 678d8af880..f10d697087 100644 --- a/mixnode/src/node/presence.rs +++ b/mixnode/src/node/presence.rs @@ -17,7 +17,7 @@ impl Notifier { }; let net_client = directory_client::Client::new(config); let presence = MixNodePresence { - host: node_config.socket_address.to_string(), // note: the directory server determines the real incoming IP itself, but uses the socket. Host here is just a placeholder. + host: node_config.announce_socket_address.to_string(), pub_key: node_config.public_key_string(), layer: node_config.layer as u64, last_seen: 0, diff --git a/mixnode/src/node/runner.rs b/mixnode/src/node/runner.rs index 8f120cc0a7..19640765e5 100644 --- a/mixnode/src/node/runner.rs +++ b/mixnode/src/node/runner.rs @@ -51,6 +51,18 @@ fn new_config(matches: &ArgMatches) -> node::Config { .next() .expect("Failed to extract the socket address from the iterator"); + let announce_host = matches.value_of("announce-host").unwrap_or(host); + let announce_port = matches + .value_of("announce-port") + .map(|port| port.parse::().unwrap()) + .unwrap_or(port); + + let announce_socket_address = (announce_host, announce_port) + .to_socket_addrs() + .expect("Failed to combine announce host and port") + .next() + .expect("Failed to extract the announce socket address from the iterator"); + let (secret_key, public_key) = sphinx::crypto::keygen(); let directory_server = matches @@ -63,6 +75,7 @@ fn new_config(matches: &ArgMatches) -> node::Config { layer, public_key, socket_address, + announce_socket_address, secret_key, } } From ac79a0da69c78679e98ee59409678ad94cc6294a Mon Sep 17 00:00:00 2001 From: Jedrzej Stuczynski Date: Fri, 17 Jan 2020 12:21:26 +0000 Subject: [PATCH 2/7] mixnode: changed announce address from SocketAddr to String --- mixnode/src/node/mod.rs | 2 +- mixnode/src/node/presence.rs | 2 +- mixnode/src/node/runner.rs | 14 ++++++++++---- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index e7ac5b1c65..99f4e9646e 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -19,7 +19,7 @@ mod presence; pub mod runner; pub struct Config { - announce_socket_address: SocketAddr, + announce_address: String, directory_server: String, layer: usize, public_key: MontgomeryPoint, diff --git a/mixnode/src/node/presence.rs b/mixnode/src/node/presence.rs index f10d697087..283a6a3afe 100644 --- a/mixnode/src/node/presence.rs +++ b/mixnode/src/node/presence.rs @@ -17,7 +17,7 @@ impl Notifier { }; let net_client = directory_client::Client::new(config); let presence = MixNodePresence { - host: node_config.announce_socket_address.to_string(), + host: node_config.announce_address.clone(), pub_key: node_config.public_key_string(), layer: node_config.layer as u64, last_seen: 0, diff --git a/mixnode/src/node/runner.rs b/mixnode/src/node/runner.rs index 19640765e5..a403e02036 100644 --- a/mixnode/src/node/runner.rs +++ b/mixnode/src/node/runner.rs @@ -24,6 +24,10 @@ pub fn start(matches: &ArgMatches) { "Listening for incoming packets on {}", config.socket_address ); + println!( + "Announcing the following socket address: {}", + config.announce_address + ); let mix = MixNode::new(&config); mix.start(config).unwrap(); @@ -51,18 +55,20 @@ fn new_config(matches: &ArgMatches) -> node::Config { .next() .expect("Failed to extract the socket address from the iterator"); - let announce_host = matches.value_of("announce-host").unwrap_or(host); + let announce_host = matches.value_of("announce_host").unwrap_or(host); let announce_port = matches - .value_of("announce-port") + .value_of("announce_port") .map(|port| port.parse::().unwrap()) .unwrap_or(port); - let announce_socket_address = (announce_host, announce_port) + let _ = (announce_host, announce_port) .to_socket_addrs() .expect("Failed to combine announce host and port") .next() .expect("Failed to extract the announce socket address from the iterator"); + let announce_address = format!("{}:{}", announce_host, announce_port); + let (secret_key, public_key) = sphinx::crypto::keygen(); let directory_server = matches @@ -75,7 +81,7 @@ fn new_config(matches: &ArgMatches) -> node::Config { layer, public_key, socket_address, - announce_socket_address, + announce_address, secret_key, } } From 809db67efde8585b6509af37257d5d4462ffcf8e Mon Sep 17 00:00:00 2001 From: Jedrzej Stuczynski Date: Fri, 17 Jan 2020 12:35:04 +0000 Subject: [PATCH 3/7] nym-client: resolving dns names to ips --- common/clients/directory-client/src/presence.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/common/clients/directory-client/src/presence.rs b/common/clients/directory-client/src/presence.rs index 19a4e5da01..958acde8b6 100644 --- a/common/clients/directory-client/src/presence.rs +++ b/common/clients/directory-client/src/presence.rs @@ -1,6 +1,7 @@ use crate::requests::presence_topology_get::PresenceTopologyGetRequester; use crate::{Client, Config, DirectoryClient}; use serde::{Deserialize, Serialize}; +use std::net::ToSocketAddrs; use topology::{CocoNode, MixNode, MixProviderNode, NymTopology}; #[derive(Clone, Debug, Deserialize, Serialize)] @@ -47,7 +48,15 @@ pub struct MixNodePresence { impl Into for MixNodePresence { fn into(self) -> topology::MixNode { topology::MixNode { - host: self.host.parse().unwrap(), + host: self + .host + .to_socket_addrs() + .expect(&format!( + "failed to parse topology host ({:?}) into a SocketAddr", + self.host + )) + .next() + .unwrap(), pub_key: self.pub_key, layer: self.layer, last_seen: self.last_seen, From 518244f6bf3ba47f3ba6cd4516fc4e77bb437216 Mon Sep 17 00:00:00 2001 From: Jedrzej Stuczynski Date: Fri, 17 Jan 2020 13:07:54 +0000 Subject: [PATCH 4/7] presence client: conversion of MixNodePresence into topology::MixNode returns a Result --- .../clients/directory-client/src/presence.rs | 72 +++++++++++++++---- 1 file changed, 58 insertions(+), 14 deletions(-) diff --git a/common/clients/directory-client/src/presence.rs b/common/clients/directory-client/src/presence.rs index 958acde8b6..f20ed9f914 100644 --- a/common/clients/directory-client/src/presence.rs +++ b/common/clients/directory-client/src/presence.rs @@ -1,6 +1,8 @@ use crate::requests::presence_topology_get::PresenceTopologyGetRequester; use crate::{Client, Config, DirectoryClient}; use serde::{Deserialize, Serialize}; +use std::convert::TryInto; +use std::io; use std::net::ToSocketAddrs; use topology::{CocoNode, MixNode, MixProviderNode, NymTopology}; @@ -45,23 +47,25 @@ pub struct MixNodePresence { pub version: String, } -impl Into for MixNodePresence { - fn into(self) -> topology::MixNode { - topology::MixNode { - host: self - .host - .to_socket_addrs() - .expect(&format!( - "failed to parse topology host ({:?}) into a SocketAddr", - self.host - )) - .next() - .unwrap(), +impl TryInto for MixNodePresence { + type Error = io::Error; + + fn try_into(self) -> Result { + let resolved_hostname = self.host.to_socket_addrs()?.next(); + if resolved_hostname.is_none() { + return Err(io::Error::new( + io::ErrorKind::Other, + "no valid socket address", + )); + } + + Ok(topology::MixNode { + host: resolved_hostname.unwrap(), pub_key: self.pub_key, layer: self.layer, last_seen: self.last_seen, version: self.version, - } + }) } } @@ -184,7 +188,10 @@ impl NymTopology for Topology { } fn get_mix_nodes(&self) -> Vec { - self.mix_nodes.iter().map(|x| x.clone().into()).collect() + self.mix_nodes + .iter() + .filter_map(|x| x.clone().try_into().ok()) + .collect() } fn get_mix_provider_nodes(&self) -> Vec { @@ -198,3 +205,40 @@ impl NymTopology for Topology { self.coco_nodes.iter().map(|x| x.clone().into()).collect() } } + +#[cfg(test)] +mod converting_mixnode_presence_into_topology_mixnode { + use super::*; + + #[test] + fn it_returns_error_on_unresolvable_hostname() { + let unresolvable_hostname = "foomp.foomp.foomp:1234"; + + let mix_presence = MixNodePresence { + host: unresolvable_hostname.to_string(), + pub_key: "".to_string(), + layer: 0, + last_seen: 0, + version: "".to_string(), + }; + + let result: Result = mix_presence.try_into(); + assert!(result.is_err()) + } + + #[test] + fn it_returns_resolved_ip_on_resolvable_hostname() { + let resolvable_hostname = "nymtech.net:1234"; + + let mix_presence = MixNodePresence { + host: resolvable_hostname.to_string(), + pub_key: "".to_string(), + layer: 0, + last_seen: 0, + version: "".to_string(), + }; + + let result: Result = mix_presence.try_into(); + assert!(result.is_ok()) + } +} From 766dbee75a3a5b23189e32b42b276e068969d8ec Mon Sep 17 00:00:00 2001 From: Jedrzej Stuczynski Date: Fri, 17 Jan 2020 13:12:22 +0000 Subject: [PATCH 5/7] Updated version numbers --- Cargo.lock | 6 +++--- mixnode/Cargo.toml | 2 +- nym-client/Cargo.toml | 2 +- sfw-provider/Cargo.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 49fcae7f95..9cc19b1dbe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1339,7 +1339,7 @@ dependencies = [ [[package]] name = "nym-client" -version = "0.3.1" +version = "0.3.2" dependencies = [ "addressing", "base64 0.11.0", @@ -1372,7 +1372,7 @@ dependencies = [ [[package]] name = "nym-mixnode" -version = "0.3.1" +version = "0.3.2" dependencies = [ "addressing", "base64 0.11.0", @@ -1388,7 +1388,7 @@ dependencies = [ [[package]] name = "nym-sfw-provider" -version = "0.3.1" +version = "0.3.2" dependencies = [ "base64 0.11.0", "built", diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index 32859e847a..8c51ad61e0 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -1,7 +1,7 @@ [package] build = "build.rs" name = "nym-mixnode" -version = "0.3.1" +version = "0.3.2" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] edition = "2018" diff --git a/nym-client/Cargo.toml b/nym-client/Cargo.toml index 4c52dbd0fb..fbf8e54a62 100644 --- a/nym-client/Cargo.toml +++ b/nym-client/Cargo.toml @@ -1,7 +1,7 @@ [package] build = "build.rs" name = "nym-client" -version = "0.3.1" +version = "0.3.2" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] edition = "2018" diff --git a/sfw-provider/Cargo.toml b/sfw-provider/Cargo.toml index 2ab7cc691f..83bf161c9a 100644 --- a/sfw-provider/Cargo.toml +++ b/sfw-provider/Cargo.toml @@ -1,7 +1,7 @@ [package] build = "build.rs" name = "nym-sfw-provider" -version = "0.3.1" +version = "0.3.2" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] edition = "2018" From aaa8e54c80e83d54daf8b77fba0d4fb29b417dae Mon Sep 17 00:00:00 2001 From: Jedrzej Stuczynski Date: Fri, 17 Jan 2020 13:15:20 +0000 Subject: [PATCH 6/7] Updated changelogs --- mixnode/CHANGELOG.md | 5 +++++ nym-client/CHANGELOG.md | 4 ++++ sfw-provider/CHANGELOG.md | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/mixnode/CHANGELOG.md b/mixnode/CHANGELOG.md index 553a967807..2f41201d97 100644 --- a/mixnode/CHANGELOG.md +++ b/mixnode/CHANGELOG.md @@ -1,5 +1,10 @@ # nym-mixnode Changelog +## 0.3.2 + +* added separate announce address +* allows announcing dns hostname instead of an ip address + ## 0.3.1 * Fixed crash when directory server goes down diff --git a/nym-client/CHANGELOG.md b/nym-client/CHANGELOG.md index 02c638b629..34ed4c2dd2 100644 --- a/nym-client/CHANGELOG.md +++ b/nym-client/CHANGELOG.md @@ -1,5 +1,9 @@ # nym-client Changelog +## 0.3.2 + +* allows receiving topology with dns hostname instead of an ip address + ## 0.3.1 * Version increase for consistency with `nym-mixnode` and `nym-sfw-provider` diff --git a/sfw-provider/CHANGELOG.md b/sfw-provider/CHANGELOG.md index 6379cbed8a..6da245a539 100644 --- a/sfw-provider/CHANGELOG.md +++ b/sfw-provider/CHANGELOG.md @@ -1,5 +1,9 @@ # nym-sfw-provider Changelog +## 0.3.2 + +* Version increase for consistency with `nym-mixnode` and `nym-client` + ## 0.3.1 * Fixed crash when directory server goes down From 1357ae8ff1a14465d46adbdebdb87594d087f0c6 Mon Sep 17 00:00:00 2001 From: Jedrzej Stuczynski Date: Fri, 17 Jan 2020 14:13:04 +0000 Subject: [PATCH 7/7] Updated tokio-tungstenite dependency to point to the main repo --- Cargo.lock | 2 +- nym-client/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9cc19b1dbe..24d0bfbb35 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2381,7 +2381,7 @@ dependencies = [ [[package]] name = "tokio-tungstenite" version = "0.10.0" -source = "git+https://github.com/dbcfd/tokio-tungstenite?rev=6dc2018cbfe8fe7ddd75ff977343086503135b38#6dc2018cbfe8fe7ddd75ff977343086503135b38" +source = "git+https://github.com/snapview/tokio-tungstenite?rev=308d9680c0e59dd1e8651659a775c05df937934e#308d9680c0e59dd1e8651659a775c05df937934e" dependencies = [ "futures 0.3.1", "log", diff --git a/nym-client/Cargo.toml b/nym-client/Cargo.toml index fbf8e54a62..e2276544c9 100644 --- a/nym-client/Cargo.toml +++ b/nym-client/Cargo.toml @@ -39,7 +39,7 @@ topology = {path = "../common/topology" } sphinx = { git = "https://github.com/nymtech/sphinx", rev="1d8cefcb6a0cb8e87d00d89eb1ccf2839e92aa1f" } # putting this explicitly below everything and most likely, the next time we look into it, it will already have a proper release -tokio-tungstenite = { git = "https://github.com/dbcfd/tokio-tungstenite", rev="6dc2018cbfe8fe7ddd75ff977343086503135b38" } +tokio-tungstenite = { git = "https://github.com/snapview/tokio-tungstenite", rev="308d9680c0e59dd1e8651659a775c05df937934e" } [build-dependencies] built = "0.3.2"