use adhammer_collector::{Collector, LdapConfig};
use anyhow::Result;
use clap::Parser;
#[derive(Parser)]
pub(crate) struct CheckAdcsArgs {
#[command(flatten)]
pub auth: crate::shared_args::LdapAuth,
#[arg(long)]
pub json: bool,
}
pub(crate) async fn check_adcs(a: CheckAdcsArgs) -> Result<()> {
let cfg = LdapConfig {
url: a.auth.url.clone(),
bind_dn: a.auth.user.clone(),
password: a.auth.password.clone(),
base_dn: None,
insecure: a.auth.insecure,
gssapi: false,
};
let snap = Collector::connect(&cfg).await?.collect().await?;
let templates =
adhammer_collector::sources::adcs::templates_from(snap.objects.iter().collect::<Vec<_>>());
let findings = adhammer_checks::rules::esc::detect_all(&templates);
if a.json {
let j = serde_json::to_string_pretty(&findings)?;
println!("{j}");
} else {
println!(
"== check adcs (ms-crtd ESC rule pack) — {} template(s) scanned, {} finding(s) ==",
templates.len(),
findings.len()
);
for f in &findings {
println!(
"[{:?}] {} — {}\n affected: {}\n {}\n",
f.severity,
f.id,
f.title,
f.affected.join(", "),
f.detail
);
}
}
Ok(())
}