use ipnet::IpNet;
use crate::constants::proxies;
fn parse_ranges(ranges: &[&str]) -> Vec<IpNet> {
ranges
.iter()
.filter_map(|cidr| match cidr.parse::<IpNet>() {
Ok(net) => Some(net),
Err(err) => {
tracing::warn!(error = %err, cidr, "invalid built-in proxy CIDR");
None
},
})
.collect()
}
#[must_use]
pub fn default_cloud_trusted_proxies() -> Vec<IpNet> {
let mut nets = parse_ranges(proxies::PRIVATE_RANGES);
nets.extend(parse_ranges(proxies::FLY_PRIVATE_RANGES));
nets.extend(parse_ranges(proxies::FLY_PUBLIC_RANGES));
nets.extend(parse_ranges(proxies::CLOUDFLARE_RANGES));
nets
}
#[must_use]
pub fn default_local_trusted_proxies() -> Vec<IpNet> {
parse_ranges(proxies::PRIVATE_RANGES)
}
#[must_use]
pub fn covers_fly_peer(trusted: &[IpNet]) -> bool {
covers_all(proxies::FLY_PRIVATE_RANGES, trusted)
}
#[must_use]
pub fn covers_fly_public_edge(trusted: &[IpNet]) -> bool {
covers_all(proxies::FLY_PUBLIC_RANGES, trusted)
}
fn covers_all(required: &[&str], trusted: &[IpNet]) -> bool {
parse_ranges(required)
.iter()
.all(|required| trusted.iter().any(|net| net.contains(required)))
}