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, 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}