fix: resolve all clippy warnings with RUSTFLAGS="-D warnings"
All checks were successful
CI / Clippy (push) Successful in 4m15s
CI / Security Audit (push) Has been skipped
CI / Tests (push) Has been skipped
CI / Clippy (pull_request) Successful in 4m16s
CI / Security Audit (pull_request) Has been skipped
CI / Tests (pull_request) Has been skipped
CI / Detect Changes (push) Has been skipped
CI / Detect Changes (pull_request) Has been skipped
CI / Deploy Agent (push) Has been skipped
CI / Deploy Dashboard (push) Has been skipped
CI / Deploy Docs (push) Has been skipped
CI / Deploy MCP (push) Has been skipped
CI / Deploy Agent (pull_request) Has been skipped
CI / Deploy Dashboard (pull_request) Has been skipped
CI / Deploy Docs (pull_request) Has been skipped
CI / Deploy MCP (pull_request) Has been skipped
CI / Format (push) Successful in 27s
CI / Format (pull_request) Successful in 3s
All checks were successful
CI / Clippy (push) Successful in 4m15s
CI / Security Audit (push) Has been skipped
CI / Tests (push) Has been skipped
CI / Clippy (pull_request) Successful in 4m16s
CI / Security Audit (pull_request) Has been skipped
CI / Tests (pull_request) Has been skipped
CI / Detect Changes (push) Has been skipped
CI / Detect Changes (pull_request) Has been skipped
CI / Deploy Agent (push) Has been skipped
CI / Deploy Dashboard (push) Has been skipped
CI / Deploy Docs (push) Has been skipped
CI / Deploy MCP (push) Has been skipped
CI / Deploy Agent (pull_request) Has been skipped
CI / Deploy Dashboard (pull_request) Has been skipped
CI / Deploy Docs (pull_request) Has been skipped
CI / Deploy MCP (pull_request) Has been skipped
CI / Format (push) Successful in 27s
CI / Format (pull_request) Successful in 3s
Fix dead code warnings, redundant clones, boolean simplification, format-in-format-args, type complexity, and Box::new of Default across compliance-dast, compliance-agent, and compliance-dashboard. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -158,7 +158,7 @@ impl LlmClient {
|
||||
) -> Result<LlmResponse, AgentError> {
|
||||
let mut req = self
|
||||
.http
|
||||
.post(&self.chat_url())
|
||||
.post(self.chat_url())
|
||||
.header("content-type", "application/json")
|
||||
.json(request_body);
|
||||
|
||||
|
||||
@@ -35,10 +35,12 @@ impl PentestOrchestrator {
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn subscribe(&self) -> broadcast::Receiver<PentestEvent> {
|
||||
self.event_tx.subscribe()
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn event_sender(&self) -> broadcast::Sender<PentestEvent> {
|
||||
self.event_tx.clone()
|
||||
}
|
||||
|
||||
@@ -19,17 +19,17 @@ pub(super) fn build_zip(
|
||||
.with_aes_encryption(AesMode::Aes256, password);
|
||||
|
||||
// report.pdf (primary)
|
||||
zip.start_file("report.pdf", options.clone())?;
|
||||
zip.start_file("report.pdf", options)?;
|
||||
zip.write_all(pdf)?;
|
||||
|
||||
// report.html (fallback)
|
||||
zip.start_file("report.html", options.clone())?;
|
||||
zip.start_file("report.html", options)?;
|
||||
zip.write_all(html.as_bytes())?;
|
||||
|
||||
// findings.json
|
||||
let findings_json =
|
||||
serde_json::to_string_pretty(&ctx.findings).unwrap_or_else(|_| "[]".to_string());
|
||||
zip.start_file("findings.json", options.clone())?;
|
||||
zip.start_file("findings.json", options)?;
|
||||
zip.write_all(findings_json.as_bytes())?;
|
||||
|
||||
// attack-chain.json
|
||||
|
||||
@@ -3,6 +3,7 @@ use compliance_core::models::pentest::AttackChainNode;
|
||||
|
||||
use super::ReportContext;
|
||||
|
||||
#[allow(clippy::format_in_format_args)]
|
||||
pub(super) fn build_html_report(ctx: &ReportContext) -> String {
|
||||
let session = &ctx.session;
|
||||
let session_id = session
|
||||
@@ -68,10 +69,8 @@ pub(super) fn build_html_report(ctx: &ReportContext) -> String {
|
||||
};
|
||||
|
||||
// Risk score 0-100
|
||||
let risk_score: usize = std::cmp::min(
|
||||
100,
|
||||
critical * 25 + high * 15 + medium * 8 + low * 3 + info * 1,
|
||||
);
|
||||
let risk_score: usize =
|
||||
std::cmp::min(100, critical * 25 + high * 15 + medium * 8 + low * 3 + info);
|
||||
|
||||
// Collect unique tool names used
|
||||
let tool_names: Vec<String> = {
|
||||
@@ -226,7 +225,7 @@ pub(super) fn build_html_report(ctx: &ReportContext) -> String {
|
||||
ev.response_status,
|
||||
ev.response_snippet
|
||||
.as_deref()
|
||||
.map(|s| html_escape(s))
|
||||
.map(html_escape)
|
||||
.unwrap_or_default(),
|
||||
payload_info,
|
||||
));
|
||||
@@ -447,7 +446,7 @@ pub(super) fn build_html_report(ctx: &ReportContext) -> String {
|
||||
let toc_findings_sub = if !ctx.findings.is_empty() {
|
||||
let mut sub = String::new();
|
||||
let mut fnum = 0usize;
|
||||
for (si, &sev_key) in severity_order.iter().enumerate() {
|
||||
for &sev_key in severity_order.iter() {
|
||||
let count = ctx
|
||||
.findings
|
||||
.iter()
|
||||
|
||||
@@ -2,6 +2,9 @@ use dioxus::prelude::*;
|
||||
|
||||
use super::helpers::*;
|
||||
|
||||
/// (phase_index, steps, findings_count, has_failed, has_running, all_done)
|
||||
type PhaseData<'a> = (usize, Vec<&'a serde_json::Value>, usize, bool, bool, bool);
|
||||
|
||||
#[component]
|
||||
pub fn AttackChainView(
|
||||
steps: Vec<serde_json::Value>,
|
||||
@@ -58,7 +61,7 @@ pub fn AttackChainView(
|
||||
};
|
||||
|
||||
// Build phase data for rail and accordion
|
||||
let phase_data: Vec<(usize, Vec<&serde_json::Value>, usize, bool, bool, bool)> = phases
|
||||
let phase_data: Vec<PhaseData<'_>> = phases
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(pi, indices)| {
|
||||
@@ -211,7 +214,7 @@ pub fn AttackChainView(
|
||||
|
||||
// Phase accordion
|
||||
div { class: "ac-phases",
|
||||
for (pi, (_, phase_steps, phase_findings, has_failed, has_running, all_done)) in phase_data.iter().enumerate() {
|
||||
for (pi, (_, phase_steps, phase_findings, _has_failed, has_running, _all_done)) in phase_data.iter().enumerate() {
|
||||
{
|
||||
let open_cls = if pi == 0 { " open" } else { "" };
|
||||
let phase_label = phase_name(pi);
|
||||
|
||||
@@ -9,14 +9,14 @@ use crate::agents::api_fuzzer::ApiFuzzerAgent;
|
||||
|
||||
/// PentestTool wrapper around the existing ApiFuzzerAgent.
|
||||
pub struct ApiFuzzerTool {
|
||||
http: reqwest::Client,
|
||||
_http: reqwest::Client,
|
||||
agent: ApiFuzzerAgent,
|
||||
}
|
||||
|
||||
impl ApiFuzzerTool {
|
||||
pub fn new(http: reqwest::Client) -> Self {
|
||||
let agent = ApiFuzzerAgent::new(http.clone());
|
||||
Self { http, agent }
|
||||
Self { _http: http, agent }
|
||||
}
|
||||
|
||||
fn parse_endpoints(input: &serde_json::Value) -> Vec<DiscoveredEndpoint> {
|
||||
|
||||
@@ -9,14 +9,14 @@ use crate::agents::auth_bypass::AuthBypassAgent;
|
||||
|
||||
/// PentestTool wrapper around the existing AuthBypassAgent.
|
||||
pub struct AuthBypassTool {
|
||||
http: reqwest::Client,
|
||||
_http: reqwest::Client,
|
||||
agent: AuthBypassAgent,
|
||||
}
|
||||
|
||||
impl AuthBypassTool {
|
||||
pub fn new(http: reqwest::Client) -> Self {
|
||||
let agent = AuthBypassAgent::new(http.clone());
|
||||
Self { http, agent }
|
||||
Self { _http: http, agent }
|
||||
}
|
||||
|
||||
fn parse_endpoints(input: &serde_json::Value) -> Vec<DiscoveredEndpoint> {
|
||||
|
||||
@@ -14,6 +14,7 @@ pub struct CookieAnalyzerTool {
|
||||
#[derive(Debug)]
|
||||
struct ParsedCookie {
|
||||
name: String,
|
||||
#[allow(dead_code)]
|
||||
value: String,
|
||||
secure: bool,
|
||||
http_only: bool,
|
||||
@@ -219,8 +220,7 @@ impl PentestTool for CookieAnalyzerTool {
|
||||
let mut cookie_data = Vec::new();
|
||||
|
||||
// Collect Set-Cookie headers from the main URL and optional login URL
|
||||
let urls_to_check: Vec<&str> =
|
||||
std::iter::once(url).chain(login_url).collect();
|
||||
let urls_to_check: Vec<&str> = std::iter::once(url).chain(login_url).collect();
|
||||
|
||||
for check_url in &urls_to_check {
|
||||
// Use a client that does NOT follow redirects so we catch cookies on redirect responses
|
||||
|
||||
@@ -224,10 +224,10 @@ impl CspAnalyzerTool {
|
||||
|
||||
for (dir_name, desc) in &important_directives {
|
||||
if !directive_names.contains(dir_name)
|
||||
&& !(has_default_src
|
||||
&& *dir_name != "frame-ancestors"
|
||||
&& *dir_name != "base-uri"
|
||||
&& *dir_name != "form-action")
|
||||
&& (!has_default_src
|
||||
|| *dir_name == "frame-ancestors"
|
||||
|| *dir_name == "base-uri"
|
||||
|| *dir_name == "form-action")
|
||||
{
|
||||
let evidence = make_evidence(format!("CSP missing directive: {dir_name}"));
|
||||
let mut finding = DastFinding::new(
|
||||
|
||||
@@ -33,8 +33,15 @@ pub struct ToolRegistry {
|
||||
tools: HashMap<String, Box<dyn PentestTool>>,
|
||||
}
|
||||
|
||||
impl Default for ToolRegistry {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
|
||||
impl ToolRegistry {
|
||||
/// Create a new registry with all built-in tools pre-registered.
|
||||
#[allow(clippy::expect_used)]
|
||||
pub fn new() -> Self {
|
||||
let http = reqwest::Client::builder()
|
||||
.danger_accept_invalid_certs(true)
|
||||
@@ -67,8 +74,11 @@ impl ToolRegistry {
|
||||
);
|
||||
|
||||
// New infrastructure / analysis tools
|
||||
register(&mut tools, Box::new(dns_checker::DnsCheckerTool::new()));
|
||||
register(&mut tools, Box::new(dmarc_checker::DmarcCheckerTool::new()));
|
||||
register(&mut tools, Box::<dns_checker::DnsCheckerTool>::default());
|
||||
register(
|
||||
&mut tools,
|
||||
Box::<dmarc_checker::DmarcCheckerTool>::default(),
|
||||
);
|
||||
register(
|
||||
&mut tools,
|
||||
Box::new(tls_analyzer::TlsAnalyzerTool::new(http.clone())),
|
||||
|
||||
@@ -90,10 +90,11 @@ impl PentestTool for ReconTool {
|
||||
|
||||
// Look for technology indicators
|
||||
if (k == "x-powered-by" || k == "server" || k == "x-generator")
|
||||
&& !result.technologies.contains(&v) && !extra_technologies.contains(&v)
|
||||
{
|
||||
extra_technologies.push(v.clone());
|
||||
}
|
||||
&& !result.technologies.contains(&v)
|
||||
&& !extra_technologies.contains(&v)
|
||||
{
|
||||
extra_technologies.push(v.clone());
|
||||
}
|
||||
extra_headers.insert(format!("{probe_url} -> {k}"), v);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,14 +9,14 @@ use crate::agents::injection::SqlInjectionAgent;
|
||||
|
||||
/// PentestTool wrapper around the existing SqlInjectionAgent.
|
||||
pub struct SqlInjectionTool {
|
||||
http: reqwest::Client,
|
||||
_http: reqwest::Client,
|
||||
agent: SqlInjectionAgent,
|
||||
}
|
||||
|
||||
impl SqlInjectionTool {
|
||||
pub fn new(http: reqwest::Client) -> Self {
|
||||
let agent = SqlInjectionAgent::new(http.clone());
|
||||
Self { http, agent }
|
||||
Self { _http: http, agent }
|
||||
}
|
||||
|
||||
fn parse_endpoints(input: &serde_json::Value) -> Vec<DiscoveredEndpoint> {
|
||||
|
||||
@@ -9,14 +9,14 @@ use crate::agents::ssrf::SsrfAgent;
|
||||
|
||||
/// PentestTool wrapper around the existing SsrfAgent.
|
||||
pub struct SsrfTool {
|
||||
http: reqwest::Client,
|
||||
_http: reqwest::Client,
|
||||
agent: SsrfAgent,
|
||||
}
|
||||
|
||||
impl SsrfTool {
|
||||
pub fn new(http: reqwest::Client) -> Self {
|
||||
let agent = SsrfAgent::new(http.clone());
|
||||
Self { http, agent }
|
||||
Self { _http: http, agent }
|
||||
}
|
||||
|
||||
fn parse_endpoints(input: &serde_json::Value) -> Vec<DiscoveredEndpoint> {
|
||||
|
||||
@@ -65,7 +65,7 @@ impl TlsAnalyzerTool {
|
||||
.map_err(|e| CoreError::Dast(format!("Failed to get peer certificate: {e}")))?;
|
||||
|
||||
let mut tls_info = TlsInfo {
|
||||
protocol_version: String::new(),
|
||||
_protocol_version: String::new(),
|
||||
cert_subject: String::new(),
|
||||
cert_issuer: String::new(),
|
||||
cert_not_before: String::new(),
|
||||
@@ -104,7 +104,7 @@ impl TlsAnalyzerTool {
|
||||
}
|
||||
|
||||
struct TlsInfo {
|
||||
protocol_version: String,
|
||||
_protocol_version: String,
|
||||
cert_subject: String,
|
||||
cert_issuer: String,
|
||||
cert_not_before: String,
|
||||
|
||||
@@ -9,14 +9,14 @@ use crate::agents::xss::XssAgent;
|
||||
|
||||
/// PentestTool wrapper around the existing XssAgent.
|
||||
pub struct XssTool {
|
||||
http: reqwest::Client,
|
||||
_http: reqwest::Client,
|
||||
agent: XssAgent,
|
||||
}
|
||||
|
||||
impl XssTool {
|
||||
pub fn new(http: reqwest::Client) -> Self {
|
||||
let agent = XssAgent::new(http.clone());
|
||||
Self { http, agent }
|
||||
Self { _http: http, agent }
|
||||
}
|
||||
|
||||
fn parse_endpoints(input: &serde_json::Value) -> Vec<DiscoveredEndpoint> {
|
||||
|
||||
Reference in New Issue
Block a user