diff --git a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list.rs b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_ban_list.rs similarity index 90% rename from crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list.rs rename to crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_ban_list.rs index e6e22aa3b2..7b29f36c67 100644 --- a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list.rs +++ b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_ban_list.rs @@ -1,4 +1,4 @@ -use crate::middleware::ip_filter::ip_set::IpSet; +use crate::middleware::ip_filter::ip_ban_list::ip_set::IpSet; use errors::{anyhow, AnyhowResult}; use std::collections::HashMap; use std::sync::{Arc, RwLock}; @@ -50,8 +50,8 @@ impl IpBanList { #[cfg(test)] mod tests { - use crate::middleware::ip_filter::ip_ban_list::IpBanList; - use crate::middleware::ip_filter::ip_set::IpSet; + use crate::middleware::ip_filter::ip_ban_list::ip_ban_list::IpBanList; + use crate::middleware::ip_filter::ip_ban_list::ip_set::IpSet; #[test] fn test_contains_ip() { diff --git a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_set.rs b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_set.rs similarity index 88% rename from crates/lib/actix_helpers/src/middleware/ip_filter/ip_set.rs rename to crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_set.rs index 2efbaf5f29..4f553b6c87 100644 --- a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_set.rs +++ b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/ip_set.rs @@ -13,6 +13,12 @@ impl IpSet { } } + pub fn from_set(ip_set: HashSet) -> Self { + Self { + ip_set, + } + } + pub fn replace_set(&mut self, ip_set: HashSet) { self.ip_set = ip_set; } 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 new file mode 100644 index 0000000000..cb8e52aee3 --- /dev/null +++ b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/load_ip_set_from_file.rs @@ -0,0 +1,47 @@ +use crate::middleware::ip_filter::ip_ban_list::ip_set::IpSet; +use errors::AnyhowResult; +use std::collections::HashSet; +use std::fs::File; +use std::io::{BufRead, BufReader}; +use std::path::Path; + +pub fn load_ip_set_from_file>(path: P) -> AnyhowResult { + let file = File::open(path)?; + let reader = BufReader::new(file); + + let lines = reader.lines() + .filter_map(|line| line.ok()) + .map(|line| line.trim().to_string()) + .filter(|line| !(line.starts_with("#") || line.is_empty())) + .collect::>(); + + Ok(IpSet::from_set(lines)) +} + +#[cfg(test)] +mod tests { + use std::path::PathBuf; + use crate::middleware::ip_filter::ip_ban_list::load_ip_set_from_file::load_ip_set_from_file; + + 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_set_from_file() { + let filename = test_file("test_data/text_files/ip_addresses_and_comments.txt"); + let ip_set = load_ip_set_from_file(filename).unwrap(); + + // Comments are not included + assert_eq!(ip_set.contains_ip_address("# this is test data"), false); + + // IP addresses in the file are. + assert_eq!(ip_set.contains_ip_address("127.0.0.1"), true); + + // Length is expected + assert_eq!(ip_set.len(), 4); + } +} 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 new file mode 100644 index 0000000000..e81d8ec43d --- /dev/null +++ b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_ban_list/mod.rs @@ -0,0 +1,3 @@ +pub mod ip_ban_list; +pub mod ip_set; +pub mod load_ip_set_from_file; diff --git a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_filter_middleware.rs b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_filter_middleware.rs index 2860b56d26..886dae5686 100644 --- a/crates/lib/actix_helpers/src/middleware/ip_filter/ip_filter_middleware.rs +++ b/crates/lib/actix_helpers/src/middleware/ip_filter/ip_filter_middleware.rs @@ -1,11 +1,11 @@ +use actix_web::Error; use actix_web::dev::{Service, Transform}; use actix_web::dev::{ServiceRequest, ServiceResponse}; -use actix_web::Error; +use crate::extractors::get_service_request_ip_address::get_service_request_ip_address; use crate::middleware::ip_filter::banned_error::BannedError; -use crate::middleware::ip_filter::ip_ban_list::IpBanList; +use crate::middleware::ip_filter::ip_ban_list::ip_ban_list::IpBanList; use futures_util::future::{err, ok, Either, Ready}; use std::task::{Context, Poll}; -use crate::extractors::get_service_request_ip_address::get_service_request_ip_address; // There are two steps in middleware processing. // 1. Middleware initialization, middleware factory gets called with diff --git a/crates/lib/actix_helpers/src/middleware/ip_filter/mod.rs b/crates/lib/actix_helpers/src/middleware/ip_filter/mod.rs index 11ecca58a3..44a520446f 100644 --- a/crates/lib/actix_helpers/src/middleware/ip_filter/mod.rs +++ b/crates/lib/actix_helpers/src/middleware/ip_filter/mod.rs @@ -1,4 +1,3 @@ pub mod banned_error; pub mod ip_ban_list; pub mod ip_filter_middleware; -pub mod ip_set; \ No newline at end of file diff --git a/test_data/text_files/ip_addresses_and_comments.txt b/test_data/text_files/ip_addresses_and_comments.txt new file mode 100644 index 0000000000..de206bcf24 --- /dev/null +++ b/test_data/text_files/ip_addresses_and_comments.txt @@ -0,0 +1,10 @@ +# this is test data + +# local addresses +127.0.0.1 +192.168.0.1 + +# remote addresses +4.4.4.4 +8.8.8.8 +