From cb1e93e58d6692aae95ebf07783eaa425afcd2a8 Mon Sep 17 00:00:00 2001 From: pierre Date: Wed, 26 Oct 2022 12:06:47 +0200 Subject: [PATCH 1/3] fix(explorer-api): geoip lookup --- Cargo.lock | 2 +- explorer-api/src/geo_ip/location.rs | 27 +++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bfe183e51c..c7367f201e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1585,8 +1585,8 @@ version = "1.0.1" dependencies = [ "chrono", "clap 3.2.8", - "dotenv", "contracts-common", + "dotenv", "humantime-serde", "isocountry", "itertools", diff --git a/explorer-api/src/geo_ip/location.rs b/explorer-api/src/geo_ip/location.rs index 643de3e76d..65f7edc120 100644 --- a/explorer-api/src/geo_ip/location.rs +++ b/explorer-api/src/geo_ip/location.rs @@ -4,9 +4,14 @@ use isocountry::CountryCode; use log::warn; use maxminddb::{geoip2::Country, MaxMindDBError, Reader}; -use std::{net::IpAddr, str::FromStr, sync::Arc}; +use std::{ + net::{IpAddr, ToSocketAddrs}, + str::FromStr, + sync::Arc, +}; const DEFAULT_DATABASE_PATH: &str = "./geo_ip/GeoLite2-Country.mmdb"; +const FAKE_PORT: u16 = 1234; #[derive(Debug)] pub enum GeoIpError { @@ -53,9 +58,23 @@ impl GeoIp { } pub fn query(&self, address: &str) -> Result, GeoIpError> { - let ip: IpAddr = FromStr::from_str(address).map_err(|e| { - error!("Fail to create IpAddr from {}: {}", &address, e); - GeoIpError::NoValidIP + let ip: IpAddr = FromStr::from_str(address).or_else(|_| { + warn!( + "Fail to create IpAddr from {}. Trying using internal lookup...", + &address + ); + let socket_addr = (address, FAKE_PORT) + .to_socket_addrs() + .map_err(|e| { + error!("Fail to resolve IP address from {}: {}", &address, e); + GeoIpError::NoValidIP + })? + .next() + .ok_or_else(|| { + error!("Fail to resolve IP address from {}", &address); + GeoIpError::NoValidIP + })?; + Ok(socket_addr.ip()) })?; let result = self .db From cf10bb12efd3dcc3d3a905cdfabbced38d730176 Mon Sep 17 00:00:00 2001 From: pierre Date: Wed, 26 Oct 2022 12:23:33 +0200 Subject: [PATCH 2/3] feat(explorer-api): use mixnode port in ip lookup --- explorer-api/src/country_statistics/geolocate.rs | 5 ++++- explorer-api/src/geo_ip/location.rs | 9 +++++---- explorer-api/src/guards/location.rs | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/explorer-api/src/country_statistics/geolocate.rs b/explorer-api/src/country_statistics/geolocate.rs index 60603a2aaf..42fe9405be 100644 --- a/explorer-api/src/country_statistics/geolocate.rs +++ b/explorer-api/src/country_statistics/geolocate.rs @@ -58,7 +58,10 @@ impl GeoLocateTask { continue; } - match geo_ip.query(&cache_item.mix_node().host) { + match geo_ip.query( + &cache_item.mix_node().host, + Some(cache_item.mix_node().mix_port), + ) { Ok(opt) => match opt { Some(location) => { let location = Location::new(location); diff --git a/explorer-api/src/geo_ip/location.rs b/explorer-api/src/geo_ip/location.rs index 65f7edc120..ba75d4e52c 100644 --- a/explorer-api/src/geo_ip/location.rs +++ b/explorer-api/src/geo_ip/location.rs @@ -57,21 +57,22 @@ impl GeoIp { GeoIp { db: reader } } - pub fn query(&self, address: &str) -> Result, GeoIpError> { + pub fn query(&self, address: &str, port: Option) -> Result, GeoIpError> { let ip: IpAddr = FromStr::from_str(address).or_else(|_| { warn!( "Fail to create IpAddr from {}. Trying using internal lookup...", &address ); - let socket_addr = (address, FAKE_PORT) + let p = port.unwrap_or(FAKE_PORT); + let socket_addr = (address, p) .to_socket_addrs() .map_err(|e| { - error!("Fail to resolve IP address from {}: {}", &address, e); + error!("Fail to resolve IP address from {}:{}: {}", &address, p, e); GeoIpError::NoValidIP })? .next() .ok_or_else(|| { - error!("Fail to resolve IP address from {}", &address); + error!("Fail to resolve IP address from {}:{}", &address, p); GeoIpError::NoValidIP })?; Ok(socket_addr.ip()) diff --git a/explorer-api/src/guards/location.rs b/explorer-api/src/guards/location.rs index dd1bfe1ff8..23bb92d941 100644 --- a/explorer-api/src/guards/location.rs +++ b/explorer-api/src/guards/location.rs @@ -39,7 +39,7 @@ fn find_location(request: &Request<'_>) -> Result (Status::Forbidden, LocationError::NoIP), GeoIpError::InternalError => { From 3f4373eb98bd6508a238f7fd3737f65a53fb3903 Mon Sep 17 00:00:00 2001 From: pierre Date: Wed, 26 Oct 2022 12:29:01 +0200 Subject: [PATCH 3/3] feat(explorer-api): add debug logs --- explorer-api/src/geo_ip/location.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/explorer-api/src/geo_ip/location.rs b/explorer-api/src/geo_ip/location.rs index ba75d4e52c..a1afec55d6 100644 --- a/explorer-api/src/geo_ip/location.rs +++ b/explorer-api/src/geo_ip/location.rs @@ -59,7 +59,7 @@ impl GeoIp { pub fn query(&self, address: &str, port: Option) -> Result, GeoIpError> { let ip: IpAddr = FromStr::from_str(address).or_else(|_| { - warn!( + debug!( "Fail to create IpAddr from {}. Trying using internal lookup...", &address ); @@ -75,7 +75,9 @@ impl GeoIp { error!("Fail to resolve IP address from {}:{}", &address, p); GeoIpError::NoValidIP })?; - Ok(socket_addr.ip()) + let ip = socket_addr.ip(); + debug!("Internal lookup succeed, resolved ip: {}", ip); + Ok(ip) })?; let result = self .db