diff --git a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_ban_list.rs b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_ban_list.rs index 8037793159..96a0f152b3 100644 --- a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_ban_list.rs +++ b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_ban_list.rs @@ -47,7 +47,7 @@ impl IpBanList { } } - pub fn total_len(&self) -> AnyhowResult { + pub fn total_ip_address_count(&self) -> AnyhowResult { match self.ip_sets.read() { Err(_) => Err(anyhow!("Can't read lock")), Ok(sets) => { @@ -57,6 +57,15 @@ impl IpBanList { }, } } + + pub fn set_count(&self) -> AnyhowResult { + match self.ip_sets.read() { + Err(_) => Err(anyhow!("Can't read lock")), + Ok(sets) => { + Ok(sets.len()) + }, + } + } } #[cfg(test)] diff --git a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_set.rs b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_set.rs index 4f553b6c87..a0ddf0174f 100644 --- a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_set.rs +++ b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_set.rs @@ -38,4 +38,8 @@ impl IpSet { pub fn len(&self) -> usize { self.ip_set.len() } + + pub fn is_empty(&self) -> bool { + self.ip_set.is_empty() + } } diff --git a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/load_ip_ban_list_from_directory.rs b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/load_ip_ban_list_from_directory.rs index e6d8f9f61c..7982449ced 100644 --- a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/load_ip_ban_list_from_directory.rs +++ b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/load_ip_ban_list_from_directory.rs @@ -11,6 +11,9 @@ pub fn load_ip_ban_list_from_directory>(path: P) -> AnyhowResult< let path = entry?.path(); let path_name = path.to_string_lossy().to_string(); let ip_set = load_ip_set_from_file(path)?; + if ip_set.is_empty() { + continue; + } ip_ban_list.add_set(path_name, ip_set)?; } @@ -40,5 +43,17 @@ mod tests { // IP addresses in both files are assert_eq!(ip_set.contains_ip_address("127.0.0.1").unwrap(), true); assert_eq!(ip_set.contains_ip_address("192.168.0.1").unwrap(), true); + + // All five IPs were loaded + assert_eq!(ip_set.total_ip_address_count().unwrap(), 5); + } + + #[test] + fn empty_files_are_not_loaded() { + let directory = test_file("test_data/text_files/ip_ban_example/"); + let ip_set = load_ip_ban_list_from_directory(directory).unwrap(); + + // NB: There are two files with IP addresses and a single empty file, which should not be loaded + assert_eq!(ip_set.set_count().unwrap(), 2); } } diff --git a/crates/service/web/storyteller_web/src/main.rs b/crates/service/web/storyteller_web/src/main.rs index 920615a6e1..0fb3ddb3b1 100644 --- a/crates/service/web/storyteller_web/src/main.rs +++ b/crates/service/web/storyteller_web/src/main.rs @@ -475,7 +475,7 @@ fn load_static_container_ip_bans() -> IpBanList { let ip_ban_list = load_ip_ban_list_from_directory(ip_ban_directory) .unwrap_or(IpBanList::new()); - info!("Static IP bans loaded: {}", ip_ban_list.total_len().unwrap_or(0)); + info!("Static IP bans loaded: {}", ip_ban_list.total_ip_address_count().unwrap_or(0)); ip_ban_list } diff --git a/crates/service/web/storyteller_web/src/threads/poll_ip_banlist_thread.rs b/crates/service/web/storyteller_web/src/threads/poll_ip_banlist_thread.rs index bc56731b2b..7b1ea4a973 100644 --- a/crates/service/web/storyteller_web/src/threads/poll_ip_banlist_thread.rs +++ b/crates/service/web/storyteller_web/src/threads/poll_ip_banlist_thread.rs @@ -39,7 +39,7 @@ pub async fn poll_ip_bans( match ip_ban_list.add_set(DYNAMIC_BAN_LIST_NAME.to_string(), ip_set) { Ok(_) => { - let total_count = ip_ban_list.total_len().unwrap_or(0); + let total_count = ip_ban_list.total_ip_address_count().unwrap_or(0); info!("Internal IP ban list updated! Total bans: {} ({} from database)", total_count, database_count); }, diff --git a/test_data/text_files/ip_ban_example/empty_file_with_no_ip_addresses.txt b/test_data/text_files/ip_ban_example/empty_file_with_no_ip_addresses.txt new file mode 100644 index 0000000000..e69de29bb2