From d859a983678c4642671b79330b1664e40f8aabcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Thu, 2 Apr 2020 15:39:14 +0100 Subject: [PATCH] Checking if any other node is already announcing the same host (#168) --- Cargo.lock | 2 ++ mixnode/Cargo.toml | 1 + mixnode/src/node/mod.rs | 19 +++++++++++++++++++ sfw-provider/Cargo.toml | 1 + sfw-provider/src/provider/mod.rs | 23 +++++++++++++++++++++++ 5 files changed, 46 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 4d3b9027f8..549606f022 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1591,6 +1591,7 @@ dependencies = [ "sphinx", "tempfile", "tokio 0.2.12", + "topology", ] [[package]] @@ -1620,6 +1621,7 @@ dependencies = [ "sphinx", "tempfile", "tokio 0.2.12", + "topology", ] [[package]] diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index 23614966a5..1d22c565c8 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -26,6 +26,7 @@ crypto = {path = "../common/crypto"} directory-client = { path = "../common/clients/directory-client" } multi-tcp-client = { path = "../common/clients/multi-tcp-client" } pemstore = {path = "../common/pemstore"} +topology = {path = "../common/topology"} ## will be moved to proper dependencies once released sphinx = { git = "https://github.com/nymtech/sphinx", rev="44d8f2aece5049eaa4fe84b7948758ce82b4b80d" } diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index 80d0b6a743..ee992f9568 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -2,11 +2,13 @@ use crate::config::persistence::pathfinder::MixNodePathfinder; use crate::config::Config; use crate::node::packet_processing::PacketProcessor; use crypto::encryption; +use directory_client::presence::Topology; use futures::channel::mpsc; use log::*; use pemstore::pemstore::PemStore; use std::net::SocketAddr; use tokio::runtime::Runtime; +use topology::NymTopology; mod listener; mod metrics; @@ -97,7 +99,24 @@ impl MixNode { .start(self.runtime.handle()) } + fn check_if_same_ip_node_exists(&self) -> Option { + // TODO: once we change to graph topology this here will need to be updated! + let topology = Topology::new(self.config.get_presence_directory_server()); + let existing_mixes_presence = topology.mix_nodes; + existing_mixes_presence + .iter() + .find(|node| node.host == self.config.get_announce_address()) + .map(|node| node.pub_key.clone()) + } + pub fn run(&mut self) { + if let Some(duplicate_node_key) = self.check_if_same_ip_node_exists() { + error!( + "Our announce-host is identical to one of existing nodes! (its key is {:?}", + duplicate_node_key + ); + return; + } let forwarding_channel = self.start_packet_forwarder(); let metrics_reporter = self.start_metrics_reporter(); self.start_socket_listener(metrics_reporter, forwarding_channel); diff --git a/sfw-provider/Cargo.toml b/sfw-provider/Cargo.toml index 6e4e20dde9..63caeb06a8 100644 --- a/sfw-provider/Cargo.toml +++ b/sfw-provider/Cargo.toml @@ -29,6 +29,7 @@ config = {path = "../common/config"} directory-client = { path = "../common/clients/directory-client" } pemstore = {path = "../common/pemstore"} sfw-provider-requests = { path = "./sfw-provider-requests" } +topology = {path = "../common/topology"} # this dependency is due to requiring to know content of loop message. however, mix-client module itself # is going to be removed or renamed at some point as it no longer servers its purpose of sending traffic to mix network diff --git a/sfw-provider/src/provider/mod.rs b/sfw-provider/src/provider/mod.rs index 78affe4264..b0a3b8ecfb 100644 --- a/sfw-provider/src/provider/mod.rs +++ b/sfw-provider/src/provider/mod.rs @@ -3,9 +3,11 @@ use crate::config::Config; use crate::provider::client_handling::ledger::ClientLedger; use crate::provider::storage::ClientStorage; use crypto::encryption; +use directory_client::presence::Topology; use log::*; use pemstore::pemstore::PemStore; use tokio::runtime::Runtime; +use topology::NymTopology; mod client_handling; mod mix_handling; @@ -85,12 +87,33 @@ impl ServiceProvider { ); } + fn check_if_same_ip_provider_exists(&self) -> Option { + // TODO: once we change to graph topology this here will need to be updated! + let topology = Topology::new(self.config.get_presence_directory_server()); + let existing_providers_presence = topology.mix_provider_nodes; + existing_providers_presence + .iter() + .find(|node| { + node.mixnet_listener == self.config.get_mix_announce_address() + || node.client_listener == self.config.get_clients_announce_address() + }) + .map(|node| node.pub_key.clone()) + } + pub fn run(&mut self) { // A possible future optimisation, depending on bottlenecks and resource usage: // considering, presumably, there will be more mix packets received than client requests: // create 2 separate runtimes - one with bigger threadpool dedicated solely for // the mix handling and the other one for the rest of tasks + if let Some(duplicate_provider_key) = self.check_if_same_ip_provider_exists() { + error!( + "Our announce-host is identical to one of existing nodes! (its key is {:?}", + duplicate_provider_key + ); + return; + } + let client_storage = ClientStorage::new( self.config.get_message_retrieval_limit() as usize, self.config.get_stored_messages_filename_length(),