1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use serde::{Deserialize, Serialize};
/// A detected technology fingerprint.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Technology {
/// Technology name (e.g. "nginx", "Cloudflare", "Next.js").
pub name: String,
/// Extracted version string, if available.
pub version: Option<String>,
/// Broad technology category.
pub category: TechCategory,
/// Confidence score in the range 0–100.
pub confidence: u8,
}
/// Broad category for a detected technology.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum TechCategory {
/// Content management system (WordPress, Drupal, …).
Cms,
/// Web framework (Next.js, Laravel, Spring, …).
Framework,
/// Programming language runtime (PHP, Python, …).
Language,
/// HTTP server software (nginx, Apache, IIS, …).
Server,
/// Content-delivery network (Cloudflare, Fastly, …).
Cdn,
/// Analytics and tracking (Google Analytics, …).
Analytics,
/// Security products (WAF, anti-bot, …).
Security,
/// Database engines.
Database,
/// Operating system.
Os,
/// Anything that does not fit the categories above.
Other,
}
/// Evidence attached to a `HeaderFinding`.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HeaderEvidence {
/// The relevant HTTP header name-value pair.
pub header: Option<(String, String)>,
/// An optional excerpt from the response body.
pub body_excerpt: Option<String>,
}