use super::scan::parse_config_min_confidence;
use super::schema::ConfigFile;
use std::path::{Path, PathBuf};
#[derive(Debug, Default)]
pub(crate) struct ConfigOutcome {
pub disabled_detectors: Vec<String>,
pub require_lockdown: bool,
pub detector_min_confidence: std::collections::HashMap<String, f64>,
pub config_errors: Vec<String>,
pub trusted_bin_dirs: Vec<PathBuf>,
pub aws_canary_accounts: Vec<String>,
pub scanner_tuning: keyhog_scanner::ScannerTuningConfig,
pub allowlist_file: Option<PathBuf>,
pub allowlist_require_reason: bool,
pub allowlist_require_approved_by: bool,
pub allowlist_max_expires_days: Option<u64>,
}
pub(super) fn base_config_outcome() -> ConfigOutcome {
ConfigOutcome {
disabled_detectors: Vec::new(),
require_lockdown: false,
detector_min_confidence: std::collections::HashMap::new(),
config_errors: Vec::new(),
trusted_bin_dirs: Vec::new(),
aws_canary_accounts: Vec::new(),
scanner_tuning: keyhog_scanner::ScannerTuningConfig::default(),
allowlist_file: None,
allowlist_require_reason: false,
allowlist_require_approved_by: false,
allowlist_max_expires_days: None,
}
}
pub(super) fn config_file_error(
path: &Path,
detail: impl std::fmt::Display,
fix: &str,
) -> ConfigOutcome {
let mut outcome = base_config_outcome();
outcome
.config_errors
.push(format!("- {}: {detail}. Fix: {fix}", path.display()));
outcome
}
pub(super) fn resolve_policy_outcome(config: &mut ConfigFile) -> ConfigOutcome {
let mut outcome = base_config_outcome();
outcome.require_lockdown = config
.lockdown
.as_ref()
.and_then(|l| l.require)
.unwrap_or(false);
if let Some(map) = config.detector.take() {
let _detector_policy_span = keyhog_profile::span(keyhog_profile::Stage::BackendSelect);
for (id, section) in map {
if section.enabled == Some(false) && !outcome.disabled_detectors.contains(&id) {
outcome.disabled_detectors.push(id.clone());
}
if let Some(conf) = section.min_confidence {
let field = format!("[detector.{id}].min_confidence");
if let Some(conf) =
parse_config_min_confidence(&mut outcome.config_errors, &field, conf)
{
outcome.detector_min_confidence.insert(id, conf);
}
}
}
}
outcome
}