use super::{ScanContext, ScanPhase};
use crate::vulnerabilities::tester::VulnerabilityScanner;
use crate::{Args, Result};
use async_trait::async_trait;
pub struct VulnerabilityPhase;
impl VulnerabilityPhase {
pub fn new() -> Self {
Self
}
fn configure_scanner(&self, context: &ScanContext) -> VulnerabilityScanner {
let target = context.target();
VulnerabilityScanner::with_args(target, &context.args)
}
}
impl Default for VulnerabilityPhase {
fn default() -> Self {
Self::new()
}
}
#[async_trait]
impl ScanPhase for VulnerabilityPhase {
fn name(&self) -> &'static str {
"Testing Vulnerabilities"
}
fn should_run(&self, args: &Args) -> bool {
args.scan.vulnerabilities || args.scan.all || args.target.is_some()
}
async fn execute(&self, context: &mut ScanContext) -> Result<()> {
let scanner = self.configure_scanner(context);
let vulnerability_results = scanner.test_all().await?;
context.results.vulnerabilities = vulnerability_results;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::Arc;
#[test]
fn test_vulnerability_phase_should_run() {
let phase = VulnerabilityPhase::new();
let mut args = Args::default();
args.scan.vulnerabilities = true;
assert!(phase.should_run(&args));
let mut args = Args::default();
args.scan.all = true;
assert!(phase.should_run(&args));
let mut args = Args::default();
args.target = Some("example.com".to_string());
assert!(phase.should_run(&args));
let args = Args::default();
assert!(!phase.should_run(&args));
}
#[test]
fn test_vulnerability_phase_name() {
let phase = VulnerabilityPhase::new();
assert_eq!(phase.name(), "Testing Vulnerabilities");
}
}