Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ All Sniffnet releases with the relative changes are documented in this file.

## [UNRELEASED]
- Support CIDR ranges in imported IP blacklists ([#1181](https://github.com/GyulyVGC/sniffnet/pull/1181))
- Show number of IP addresses and CIDR ranges in imported IP blacklists ([#1183](https://github.com/GyulyVGC/sniffnet/pull/1183))
- Updated some of the existing translations to v1.5:
- Ukrainian ([#1039](https://github.com/GyulyVGC/sniffnet/pull/1039))
- German ([#1122](https://github.com/GyulyVGC/sniffnet/pull/1122))
Expand Down
8 changes: 6 additions & 2 deletions src/gui/pages/settings_general_page.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use crate::gui::pages::types::settings_page::SettingsPage;
use crate::gui::styles::button::ButtonType;
use crate::gui::styles::container::ContainerType;
use crate::gui::styles::rule::RuleType;
use crate::gui::styles::style_constants::{FONT_SIZE_SUBTITLE, TOOLTIP_DELAY};
use crate::gui::styles::style_constants::{FONT_SIZE_FOOTER, FONT_SIZE_SUBTITLE, TOOLTIP_DELAY};
use crate::gui::styles::text::TextType;
use crate::gui::types::message::Message;
use crate::gui::types::settings::Settings;
Expand Down Expand Up @@ -331,7 +331,6 @@ fn blacklist_selection<'a>(
};

let message = Message::LoadIpBlacklist;

Column::new()
.width(Length::Fill)
.spacing(5)
Expand Down Expand Up @@ -363,6 +362,11 @@ fn blacklist_selection<'a>(
button_clear_mmdb(message, is_editable)
}),
)
.push(
ip_blacklist
.imported_items_info()
.map(|info| Text::new(info).size(FONT_SIZE_FOOTER)),
)
}

fn button_clear_mmdb<'a>(
Expand Down
50 changes: 38 additions & 12 deletions src/networking/types/ip_blacklist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use prefix_trie::joint::set::JointPrefixSet;
#[derive(Clone, Default, Debug)]
pub struct IpBlacklist {
ips: Arc<HashSet<IpAddr>>,
networks: Arc<JointPrefixSet<IpNet>>,
cidrs: Arc<JointPrefixSet<IpNet>>,
is_loading: bool,
}

Expand All @@ -18,37 +18,46 @@ impl IpBlacklist {
return IpBlacklist::default();
};
let mut ips = HashSet::new();
let mut networks = JointPrefixSet::new();
let mut cidrs = JointPrefixSet::new();
for line in buf.lines() {
let Some(first) = line.split_whitespace().next() else {
continue;
};

if let Ok(ip) = first.parse::<IpAddr>() {
ips.insert(ip);
} else if let Ok(network) = first.parse::<IpNet>() {
networks.insert(network);
} else if let Ok(cidr) = first.parse::<IpNet>() {
cidrs.insert(cidr);
}
}
IpBlacklist {
ips: Arc::new(ips),
networks: Arc::new(networks),
cidrs: Arc::new(cidrs),
is_loading: false,
}
}

pub fn contains(&self, ip: &IpAddr) -> bool {
self.ips.contains(ip) || self.networks.get_lpm(&IpNet::from(*ip)).is_some()
self.ips.contains(ip) || self.cidrs.get_lpm(&IpNet::from(*ip)).is_some()
}

pub fn is_invalid(&self) -> bool {
self.ips.is_empty() && self.networks.is_empty() && !self.is_loading
self.ips.is_empty() && self.cidrs.is_empty() && !self.is_loading
}

pub fn is_loading(&self) -> bool {
self.is_loading
}

pub fn imported_items_info(&self) -> Option<String> {
match (self.ips.len(), self.cidrs.len()) {
(0, 0) => None,
(ips, 0) => Some(format!("(IPs: {ips})")),
(0, cidrs) => Some(format!("(CIDRs: {cidrs})")),
(ips, cidrs) => Some(format!("(IPs: {ips}, CIDRs: {cidrs})")),
}
}

pub fn start_loading(&mut self) {
self.is_loading = true;
}
Expand All @@ -67,7 +76,11 @@ mod tests {
assert!(!blacklist.is_invalid());
assert!(!blacklist.is_loading());
assert_eq!(blacklist.ips.len(), 4);
assert_eq!(blacklist.networks.len(), 0);
assert_eq!(blacklist.cidrs.len(), 0);
assert_eq!(
blacklist.imported_items_info(),
Some("(IPs: 4)".to_string())
);

assert!(blacklist.contains(&IpAddr::V4(Ipv4Addr::new(8, 8, 8, 8))));
assert!(blacklist.contains(&IpAddr::V4(Ipv4Addr::new(1, 2, 3, 255))));
Expand All @@ -88,7 +101,8 @@ mod tests {
assert!(blacklist.is_invalid());
assert!(!blacklist.is_loading());
assert_eq!(blacklist.ips.len(), 0);
assert_eq!(blacklist.networks.len(), 0);
assert_eq!(blacklist.cidrs.len(), 0);
assert_eq!(blacklist.imported_items_info(), None);

assert!(!blacklist.contains(&IpAddr::V4(Ipv4Addr::new(8, 8, 8, 8))));
assert!(!blacklist.contains(&IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))));
Expand All @@ -105,7 +119,11 @@ mod tests {
assert!(!blacklist.is_invalid());
assert!(!blacklist.is_loading());
assert_eq!(blacklist.ips.len(), 2);
assert_eq!(blacklist.networks.len(), 4);
assert_eq!(blacklist.cidrs.len(), 4);
assert_eq!(
blacklist.imported_items_info(),
Some("(IPs: 2, CIDRs: 4)".to_string())
);

assert!(blacklist.contains(&IpAddr::V4(Ipv4Addr::new(8, 8, 8, 8))));
assert!(blacklist.contains(&"2001:db8::1".parse::<IpAddr>().unwrap()));
Expand Down Expand Up @@ -136,7 +154,11 @@ mod tests {
assert!(!blacklist.is_invalid());
assert!(!blacklist.is_loading());
assert_eq!(blacklist.ips.len(), 0);
assert_eq!(blacklist.networks.len(), 1);
assert_eq!(blacklist.cidrs.len(), 1);
assert_eq!(
blacklist.imported_items_info(),
Some("(CIDRs: 1)".to_string())
);

assert!(blacklist.contains(&IpAddr::V4(Ipv4Addr::new(1, 2, 3, 1))));
assert!(!blacklist.contains(&IpAddr::V4(Ipv4Addr::new(1, 2, 4, 1))));
Expand All @@ -150,7 +172,11 @@ mod tests {

assert!(!blacklist.is_invalid());
assert_eq!(blacklist.ips.len(), 0);
assert_eq!(blacklist.networks.len(), 6);
assert_eq!(blacklist.cidrs.len(), 6);
assert_eq!(
blacklist.imported_items_info(),
Some("(CIDRs: 6)".to_string())
);

assert!(blacklist.contains(&IpAddr::V4(Ipv4Addr::new(209, 186, 20, 0))));
assert!(blacklist.contains(&IpAddr::V4(Ipv4Addr::new(209, 186, 23, 255))));
Expand Down
Loading