Skip to content

Commit

Permalink
resolve DNS for trusted peers
Browse files Browse the repository at this point in the history
  • Loading branch information
eugene-babichenko committed May 12, 2020
1 parent a04f264 commit a3aedc0
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 18 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

60 changes: 43 additions & 17 deletions jormungandr-lib/src/multiaddr.rs
Original file line number Diff line number Diff line change
@@ -1,24 +1,50 @@
use multiaddr::{AddrComponent, Multiaddr};
use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6};
use multiaddr::{AddrComponent, Multiaddr, ToMultiaddr};
use std::{
io,
net::{SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs},
};

pub fn multiaddr_to_socket_addr(addr: &Multiaddr) -> Option<SocketAddr> {
let mut components = addr.iter();

match components.next()? {
AddrComponent::IP4(ipv4) => {
if let AddrComponent::TCP(port) = components.next()? {
Some(SocketAddr::V4(SocketAddrV4::new(ipv4, port)))
} else {
None
}
}
AddrComponent::IP6(ipv6) => {
if let AddrComponent::TCP(port) = components.next()? {
Some(SocketAddr::V6(SocketAddrV6::new(ipv6, port, 0, 0)))
} else {
None
}
}
let ip = components.next()?;
let port = if let AddrComponent::TCP(port) = components.next()? {
port
} else {
return None;
};

match ip {
AddrComponent::IP4(ipv4) => Some(SocketAddr::V4(SocketAddrV4::new(ipv4, port))),
AddrComponent::IP6(ipv6) => Some(SocketAddr::V6(SocketAddrV6::new(ipv6, port, 0, 0))),
_ => None,
}
}

pub fn multiaddr_resolve_dns(addr: Multiaddr) -> io::Result<Option<Multiaddr>> {
let mut components = addr.iter();

let ip_or_fqdn = if let Some(ip) = components.next() {
ip
} else {
return Ok(None);
};

let port = if let Some(AddrComponent::TCP(port)) = components.next() {
port
} else {
return Ok(None);
};

let maybe_socket_addr = match ip_or_fqdn {
AddrComponent::DNS4(fqdn) => (fqdn.as_ref(), port)
.to_socket_addrs()?
.find(|addr| matches!(addr, SocketAddr::V4(_))),
AddrComponent::DNS6(fqdn) => (fqdn.as_ref(), port)
.to_socket_addrs()?
.find(|addr| matches!(addr, SocketAddr::V6(_))),
_ => return Ok(Some(addr)),
};

Ok(maybe_socket_addr.map(|socket_addr| socket_addr.to_multiaddr().unwrap()))
}
1 change: 1 addition & 0 deletions jormungandr/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ async-trait = "0.1"
lru = "^0.4.3"
warp = { version = "0.2.2", features = ["tls"] }
pin-project = "0.4"
multiaddr = "0.3.1"

[target.'cfg(not(target_os = "android"))'.dependencies.reqwest]
version = "0.10.4"
Expand Down
26 changes: 25 additions & 1 deletion jormungandr/src/settings/start/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ fn generate_network(
config: &Option<Config>,
logger: &Logger,
) -> Result<network::Configuration, Error> {
use jormungandr_lib::multiaddr::multiaddr_to_socket_addr;
use jormungandr_lib::multiaddr::*;

let (mut p2p, http_fetch_block0_service, skip_bootstrap, bootstrap_from_trusted_peers) =
if let Some(cfg) = config {
Expand All @@ -218,6 +218,30 @@ fn generate_network(
p2p.trusted_peers = Some(command_arguments.trusted_peer.clone())
}

p2p.trusted_peers.as_mut().map(|peers| {
*peers = peers.iter().filter_map(|peer| {
let address = match multiaddr_resolve_dns(peer.address.multi_address().clone()) {
Ok(Some(addr)) => {
info!(logger, "DNS resolved"; "fqdn" => peer.address.multi_address().to_string(), "resolved" => addr.to_string());
addr
}
Ok(None) => {
warn!(logger, "failed to resolve DNS"; "fqdn" => peer.address.multi_address().to_string());
return None;
},
Err(e) => {
warn!(logger, "failed to resolve dns"; "fqdn" => peer.address.multi_address().to_string(), "error" => e.to_string());
return None;
}
};
let address = poldercast::Address::from(address);
Some(config::TrustedPeer {
address,
id: peer.id.clone(),
})
}).collect();
});

let mut profile = poldercast::NodeProfileBuilder::new();

if let Some(address) = p2p.public_address {
Expand Down

0 comments on commit a3aedc0

Please sign in to comment.