From cb1e93e58d6692aae95ebf07783eaa425afcd2a8 Mon Sep 17 00:00:00 2001 From: pierre Date: Wed, 26 Oct 2022 12:06:47 +0200 Subject: [PATCH] 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