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 new file mode 100644 index 0000000000..e6d8f9f61c --- /dev/null +++ b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/load_ip_ban_list_from_directory.rs @@ -0,0 +1,44 @@ +use crate::middleware::ip_filter::ip_ban_list::ip_ban_list::IpBanList; +use crate::middleware::ip_filter::ip_ban_list::load_ip_set_from_file::load_ip_set_from_file; +use errors::AnyhowResult; +use std::path::Path; + +pub fn load_ip_ban_list_from_directory>(path: P) -> AnyhowResult { + let ip_ban_list = IpBanList::new(); + let paths = std::fs::read_dir(path)?; + + for entry in paths { + let path = entry?.path(); + let path_name = path.to_string_lossy().to_string(); + let ip_set = load_ip_set_from_file(path)?; + ip_ban_list.add_set(path_name, ip_set)?; + } + + Ok(ip_ban_list) +} + +#[cfg(test)] +mod tests { + use std::path::PathBuf; + use crate::middleware::ip_filter::ip_ban_list::load_ip_ban_list_from_directory::load_ip_ban_list_from_directory; + + fn test_file(path_from_repo_root: &str) -> PathBuf { + // https://doc.rust-lang.org/cargo/reference/environment-variables.html + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.push(format!("../../../{}", path_from_repo_root)); + path + } + + #[test] + fn test_load_ip_ban_list_from_directory() { + let directory = test_file("test_data/text_files/ip_ban_example/"); + let ip_set = load_ip_ban_list_from_directory(directory).unwrap(); + + // Comments are not included + assert_eq!(ip_set.contains_ip_address("# this is test data").unwrap(), false); + + // 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); + } +} diff --git a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/load_ip_set_from_file.rs b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/load_ip_set_from_file.rs index cb8e52aee3..97b37f6b98 100644 --- a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/load_ip_set_from_file.rs +++ b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/load_ip_set_from_file.rs @@ -32,7 +32,7 @@ mod tests { #[test] fn test_load_ip_set_from_file() { - let filename = test_file("test_data/text_files/ip_addresses_and_comments.txt"); + let filename = test_file("test_data/text_files/ip_ban_example/local_ip_addresses_and_comments.txt"); let ip_set = load_ip_set_from_file(filename).unwrap(); // Comments are not included @@ -40,8 +40,9 @@ mod tests { // IP addresses in the file are. assert_eq!(ip_set.contains_ip_address("127.0.0.1"), true); + assert_eq!(ip_set.contains_ip_address("192.168.1.1"), false); // Length is expected - assert_eq!(ip_set.len(), 4); + assert_eq!(ip_set.len(), 2); } } diff --git a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/mod.rs b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/mod.rs index e81d8ec43d..0f80fd8232 100644 --- a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/mod.rs +++ b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/mod.rs @@ -1,3 +1,4 @@ pub mod ip_ban_list; pub mod ip_set; +pub mod load_ip_ban_list_from_directory; pub mod load_ip_set_from_file; diff --git a/test_data/text_files/ip_addresses_and_comments.txt b/test_data/text_files/ip_ban_example/local_ip_addresses_and_comments.txt similarity index 61% rename from test_data/text_files/ip_addresses_and_comments.txt rename to test_data/text_files/ip_ban_example/local_ip_addresses_and_comments.txt index de206bcf24..4a0556a281 100644 --- a/test_data/text_files/ip_addresses_and_comments.txt +++ b/test_data/text_files/ip_ban_example/local_ip_addresses_and_comments.txt @@ -3,8 +3,3 @@ # local addresses 127.0.0.1 192.168.0.1 - -# remote addresses -4.4.4.4 -8.8.8.8 - diff --git a/test_data/text_files/ip_ban_example/remote_ip_addresses_and_comments.txt b/test_data/text_files/ip_ban_example/remote_ip_addresses_and_comments.txt new file mode 100644 index 0000000000..602ebd5371 --- /dev/null +++ b/test_data/text_files/ip_ban_example/remote_ip_addresses_and_comments.txt @@ -0,0 +1,7 @@ +# this is test data + +# remote addresses +4.4.4.4 +8.8.4.4 +8.8.8.8 +