From 442acb41d6e31482b8b4e35c7032b4547d0af7d6 Mon Sep 17 00:00:00 2001 From: /dev/fd0 <147166694+1440000bytes@users.noreply.github.com> Date: Sun, 16 Feb 2025 16:36:53 +0530 Subject: [PATCH] validate relay address --- rust/joinstr/src/joinstr/mod.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/rust/joinstr/src/joinstr/mod.rs b/rust/joinstr/src/joinstr/mod.rs index 0212e18..a5169d9 100644 --- a/rust/joinstr/src/joinstr/mod.rs +++ b/rust/joinstr/src/joinstr/mod.rs @@ -24,6 +24,9 @@ use crate::{ utils::{now, rand_delay}, }; +use std::net::IpAddr; +use url::Url; + // delay we wait between (non-blocking) polls of a channel pub const WAIT: u64 = 50; @@ -296,8 +299,26 @@ impl<'a> Joinstr<'a> { /// Add a relay address to [`Joinstr::relays`] pub fn relay>(mut self, url: T) -> Result { self.pool_not_exists()?; - // TODO: check the address is valid + let url: String = url.into(); + + // Validate if it's a valid "ws" or "wss" URL + if let Ok(parsed_url) = Url::parse(&url) { + if parsed_url.scheme() != "wss" && parsed_url.scheme() != "ws" { + return Err(Error::InvalidRelayAddress); + } + + if let Some(host) = parsed_url.host_str() { + if host.parse::().is_err() && !host.contains('.') { + return Err(Error::InvalidRelayAddress); + } + } else { + return Err(Error::InvalidRelayAddress); + } + } else { + return Err(Error::InvalidRelayAddress); + } + self.relays.push(url); Ok(self) }