use struct_field_names_as_array::FieldNamesAsSlice;
use crate::FirewallAuditError;
use std::collections::HashSet;
use std::net::IpAddr;
#[cfg(target_os = "linux")]
pub mod linux;
#[cfg(target_os = "windows")]
pub mod windows;
#[derive(Debug, Clone, FieldNamesAsSlice)]
pub struct FirewallRule {
pub os: Option<String>,
pub name: String,
pub direction: String,
pub enabled: bool,
pub action: String,
pub description: Option<String>,
pub application_name: Option<String>,
pub service_name: Option<String>,
pub protocol: Option<String>,
pub local_ports: Option<HashSet<u16>>,
pub remote_ports: Option<HashSet<u16>>,
pub local_addresses: Option<HashSet<IpAddr>>,
pub remote_addresses: Option<HashSet<IpAddr>>,
pub icmp_types_and_codes: Option<String>,
pub interfaces: Option<HashSet<String>>,
pub interface_types: Option<HashSet<String>>,
pub grouping: Option<String>,
pub profiles: Option<String>,
pub edge_traversal: Option<bool>,
}
impl FirewallRule {
pub fn valid_fields() -> &'static [&'static str] {
Self::FIELD_NAMES_AS_SLICE
}
}
pub trait FirewallRuleProvider {
fn list_rules() -> Result<Vec<FirewallRule>, FirewallAuditError>;
}
#[cfg(target_os = "windows")]
pub use crate::firewall_rule::windows::WindowsFirewallProvider as PlatformFirewallProvider;
#[cfg(target_os = "linux")]
pub use crate::firewall_rule::linux::LinuxFirewallProvider as PlatformFirewallProvider;
#[cfg(test)]
mod tests {
use crate::FirewallRuleProvider;
#[test]
fn test_list_rules_compiles() {
#[cfg(target_os = "windows")]
{
use crate::PlatformFirewallProvider;
let rules = PlatformFirewallProvider::list_rules().unwrap();
for rule in rules {
println!("{rule:?}");
}
}
#[cfg(target_os = "linux")]
{
use crate::firewall_rule::linux::LinuxFirewallProvider;
let rules = LinuxFirewallProvider::list_rules().unwrap();
for rule in rules {
println!("{rule:?}");
}
}
}
}