diff --git a/nym-vpn-core/crates/nym-gateway-directory/src/gateway_client.rs b/nym-vpn-core/crates/nym-gateway-directory/src/gateway_client.rs index 3d7c12adf9..911ec9ef73 100644 --- a/nym-vpn-core/crates/nym-gateway-directory/src/gateway_client.rs +++ b/nym-vpn-core/crates/nym-gateway-directory/src/gateway_client.rs @@ -1,6 +1,7 @@ // Copyright 2023-2024 - Nym Technologies SA // SPDX-License-Identifier: GPL-3.0-only +use std::net::SocketAddr; use std::{fmt, net::IpAddr}; use nym_sdk::UserAgent; @@ -85,6 +86,24 @@ impl Config { } } +pub struct ResolvedConfig { + pub nyxd_socket_addrs: Vec, + pub api_socket_addrs: Vec, + pub nym_vpn_api_socket_addres: Option>, +} + +impl ResolvedConfig { + pub fn all_socket_addrs(&self) -> Vec { + let mut socket_addrs = vec![]; + socket_addrs.extend(self.nyxd_socket_addrs.iter()); + socket_addrs.extend(self.api_socket_addrs.iter()); + if let Some(vpn_api_socket_addrs) = &self.nym_vpn_api_socket_addres { + socket_addrs.extend(vpn_api_socket_addrs.iter()); + } + socket_addrs + } +} + pub struct GatewayClient { api_client: NymApiClient, nym_vpn_api_client: Option, diff --git a/nym-vpn-core/crates/nym-gateway-directory/src/helpers.rs b/nym-vpn-core/crates/nym-gateway-directory/src/helpers.rs index e7465fb98e..abfa174bfe 100644 --- a/nym-vpn-core/crates/nym-gateway-directory/src/helpers.rs +++ b/nym-vpn-core/crates/nym-gateway-directory/src/helpers.rs @@ -6,7 +6,7 @@ use std::net::{IpAddr, SocketAddr}; use nym_http_api_client::HickoryDnsResolver; use tracing::debug; -use crate::{error::Result, Config, Error}; +use crate::{error::Result, gateway_client::ResolvedConfig, Config, Error}; async fn try_resolve_hostname(hostname: &str) -> Result> { debug!("Trying to resolve hostname: {hostname}"); @@ -28,34 +28,37 @@ async fn try_resolve_hostname(hostname: &str) -> Result> { Ok(ips) } -pub async fn allowed_ips(config: &Config) -> Result> { - let mut socket_addrs = vec![]; - let mut urls = vec![]; - - urls.push(config.nyxd_url()); - urls.push(config.api_url()); - if let Some(vpn_api_url) = config.nym_vpn_api_url() { - urls.push(vpn_api_url); - } - - for unresolved_url in urls { - let port = unresolved_url - .port_or_known_default() - .ok_or(Error::UrlError { - url: unresolved_url.clone(), - reason: "missing port".to_string(), - })?; - let hostname = unresolved_url.host_str().ok_or(Error::UrlError { +async fn url_to_socket_addr(unresolved_url: &url::Url) -> Result> { + let port = unresolved_url + .port_or_known_default() + .ok_or(Error::UrlError { url: unresolved_url.clone(), - reason: "missing hostname".to_string(), + reason: "missing port".to_string(), })?; - socket_addrs.extend( - try_resolve_hostname(hostname) - .await? - .into_iter() - .map(|ip| SocketAddr::new(ip, port)), - ); - } + let hostname = unresolved_url.host_str().ok_or(Error::UrlError { + url: unresolved_url.clone(), + reason: "missing hostname".to_string(), + })?; + + Ok(try_resolve_hostname(hostname) + .await? + .into_iter() + .map(|ip| SocketAddr::new(ip, port)) + .collect()) +} + +pub async fn resolve_config(config: &Config) -> Result { + let nyxd_socket_addrs = url_to_socket_addr(config.nyxd_url()).await?; + let api_socket_addrs = url_to_socket_addr(config.api_url()).await?; + let nym_vpn_api_socket_addres = if let Some(vpn_api_url) = config.nym_vpn_api_url() { + Some(url_to_socket_addr(vpn_api_url).await?) + } else { + None + }; - Ok(socket_addrs) + Ok(ResolvedConfig { + nyxd_socket_addrs, + api_socket_addrs, + nym_vpn_api_socket_addres, + }) } diff --git a/nym-vpn-core/crates/nym-gateway-directory/src/lib.rs b/nym-vpn-core/crates/nym-gateway-directory/src/lib.rs index a77759acf2..110a14e2bf 100644 --- a/nym-vpn-core/crates/nym-gateway-directory/src/lib.rs +++ b/nym-vpn-core/crates/nym-gateway-directory/src/lib.rs @@ -23,5 +23,5 @@ pub use crate::{ }, error::Error, gateway_client::{Config, GatewayClient}, - helpers::allowed_ips, + helpers::resolve_config, };