Skip to main content

etalon_techscan/
types.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Debug, Deserialize)]
5#[serde(untagged)]
6pub enum StringOrVec {
7    String(String),
8    Vec(Vec<String>),
9}
10
11#[derive(Debug, Deserialize)]
12pub struct RawFingerprint {
13    pub website: Option<String>,
14    pub cats: Option<Vec<u32>>,
15    pub headers: Option<HashMap<String, String>>,
16    pub cookies: Option<HashMap<String, String>>,
17    pub html: Option<StringOrVec>,
18    pub script_src: Option<StringOrVec>,
19    pub meta: Option<HashMap<String, StringOrVec>>,
20    pub dns: Option<HashMap<String, StringOrVec>>,
21    pub implies: Option<StringOrVec>,
22}
23
24#[derive(Debug, Clone, Serialize)]
25pub struct DetectedTech {
26    pub name: String,
27    pub categories: Vec<u32>,
28    pub confidence: u8, // 0-100
29    pub version: Option<String>,
30    pub via: DetectionMethod,
31}
32
33#[derive(Debug, Clone, Serialize)]
34pub enum DetectionMethod {
35    Header(String),
36    Cookie(String),
37    Html,
38    ScriptSrc,
39    Meta,
40    Dns,
41    Implied(String),
42}
43
44#[derive(Debug, Serialize)]
45pub struct ScanResult {
46    pub domain: String,
47    pub techs: Vec<DetectedTech>,
48    pub scanned_at: chrono::DateTime<chrono::Utc>,
49    pub scan_ms: u64,
50    pub error: Option<String>,
51}