From 62c2aa547bda3752fa8df6d4e264387e419079b2 Mon Sep 17 00:00:00 2001 From: Daniel Saxton <2658661+dsaxton@users.noreply.github.com> Date: Fri, 7 Mar 2025 21:47:48 -0600 Subject: [PATCH] Use custom deserialization --- src/filters/blacklist.rs | 48 +++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/src/filters/blacklist.rs b/src/filters/blacklist.rs index 2eb99f1..13e2f3a 100644 --- a/src/filters/blacklist.rs +++ b/src/filters/blacklist.rs @@ -5,32 +5,54 @@ use std::net::IpAddr; use std::str::FromStr; #[derive(Deserialize, Default)] -pub struct Blacklist { +pub struct BlacklistConfig { pub pubkeys: Option>, pub ips: Option>, pub cidrs: Option>, } +#[derive(Default)] +pub struct Blacklist { + pubkeys: Option>, + ips: Option>, + cidrs: Option>, +} + +impl<'de> Deserialize<'de> for Blacklist { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let config = BlacklistConfig::deserialize(deserializer)?; + Ok(Blacklist { + pubkeys: config.pubkeys, + ips: config.ips, + cidrs: config.cidrs.map(|cidrs| { + cidrs + .into_iter() + .filter_map(|s| IpNetwork::from_str(&s).ok()) + .collect() + }), + }) + } +} + impl Blacklist { fn is_ip_blocked(&self, ip: &str) -> bool { - if let Some(cidrs) = &self.cidrs { - for cidr in cidrs { - if let Ok(network) = IpNetwork::from_str(cidr) { - if let Ok(addr) = IpAddr::from_str(ip) { - if network.contains(addr) { - return true; - } - } - } - } - } - if let Some(ips) = &self.ips { if ips.contains(&ip.to_string()) { return true; } } + if let Ok(addr) = IpAddr::from_str(ip) { + if let Some(cidrs) = &self.cidrs { + if cidrs.iter().any(|network| network.contains(addr)) { + return true; + } + } + } + false } }