use crate::{
DriverCallback, DriverCategory, DriverContext, DriverError, DriverResult,
operating_system_security::common::check_security_policies,
types::{Driver, DriverParameter},
};
use serde_json::{Value, json};
use std::collections::HashMap;
use tracing::{debug, info};
#[derive(Debug)]
pub struct SecurityPolicyCheckDriver;
#[async_trait::async_trait]
impl Driver for SecurityPolicyCheckDriver {
fn name(&self) -> &str {
"security_policy_check"
}
fn description(&self) -> &str {
"Assess system security policy compliance"
}
fn usage_hint(&self) -> &str {
"Use this skill to check if security policies are properly configured."
}
fn parameters(&self) -> Vec<DriverParameter> {
return vec![];
}
fn example_call(&self) -> DriverResult<Value> {
return Ok(json!({
"action": "security_policy_check"
}));
}
fn example_output(&self) -> String {
return "Security Policy Assessment Results:\n password_min_length: Compliant\n mfa_required: Non-compliant (current: false, expected: true)\n...".to_string();
}
fn category(&self) -> DriverCategory {
return DriverCategory::OperatingSystemSecurity;
}
async fn execute(
&self,
_parameters: &HashMap<String, Value>,
_callback: Option<&dyn DriverCallback>,
_context: Option<&DriverContext>,
) -> DriverResult<String> {
debug!("Executing security_policy_check driver");
let policies = check_security_policies();
if policies.is_empty() {
info!("No security policies found");
return Ok("No security policies found".to_string());
}
info!("Checking {} security policies", policies.len());
let mut result = "Security Policy Assessment Results:\n\n".to_string();
let mut compliant_count = 0;
let mut non_compliant_count = 0;
for policy in policies {
let status = if policy.is_compliant {
compliant_count += 1;
"Yes"
} else {
non_compliant_count += 1;
"No"
};
result.push_str(&format!(
"{} {}: {} (current: {}, expected: {}) [Severity: {}]\n",
status,
policy.policy_name,
if policy.is_compliant { "Compliant" } else { "Non-compliant" },
policy.current_value,
policy.expected_value,
policy.severity
));
if !policy.is_compliant {
result.push_str(&format!(" Recommendation: {}\n", policy.recommendation));
}
}
result.push_str(&format!("\nSummary: {} compliant, {} non-compliant", compliant_count, non_compliant_count));
if non_compliant_count > 0 {
result.push_str(&format!("\n{} policies need attention", non_compliant_count));
info!("Found {} non-compliant policies", non_compliant_count);
} else {
result.push_str("\nAll policies are compliant!");
info!("All policies are compliant");
}
return Ok(result);
}
}