attackerkb_api_rs/v1/
mod.rs1pub mod assessment;
3pub mod contributor;
4pub mod query;
5pub mod topic;
6
7use chrono::NaiveDateTime;
8#[cfg(feature = "nvd-cves")]
9use nvd_cves::impact::ImpactMetrics;
10use serde::{Deserialize, Serialize};
11use uuid::Uuid;
12
13#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
14#[serde(untagged)]
15pub enum TagsOrReferences {
16 FoldedRecord(FoldedRecord),
17 References(References),
18 Tags(Tags),
19}
20
21#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
22#[serde(rename_all = "camelCase")]
23pub struct References {
24 pub id: Uuid,
27 pub editor_id: Uuid,
30 pub created: NaiveDateTime,
33 pub name: String,
36 pub url: String,
39 pub ref_type: String,
42 pub ref_source: String,
44}
45
46#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
47#[serde(rename_all = "camelCase")]
48pub struct Tags {
49 pub id: Uuid,
52 pub name: String,
55 pub r#type: String,
58 pub code: String,
61 pub metadata: TagMetaData,
63}
64
65#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
67#[serde(rename_all = "camelCase")]
68pub struct TagMetaData {
69 pub value: String,
72 pub source: String,
75 pub tactic_id: String,
78 pub tactic_name: String,
81}
82
83#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
84#[serde(rename_all = "camelCase")]
85pub struct Score {
86 pub attacker_value: f32,
88 pub exploitability: f32,
90}
91
92#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, Default)]
93#[serde(rename_all = "camelCase")]
94pub struct MetaData {
95 #[serde(default)]
96 pub configurations: Vec<String>,
97 #[serde(default)]
98 pub credits: Option<Credits>,
99 #[serde(default)]
100 pub cve_state: CveState,
101 #[cfg(feature = "nvd-cves")]
102 #[serde(flatten)]
103 pub cvss_metric_v31: ImpactMetrics,
104 #[serde(default)]
105 pub references: Vec<String>,
106 #[serde(default)]
107 pub vendor: Option<Vendor>,
108 #[serde(rename = "vulnerable-versions")]
109 pub vulnerable_versions: Option<Vec<String>>,
110}
111
112#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
113#[serde(rename_all = "camelCase")]
114pub struct Vendor {
115 #[serde(default)]
116 product_names: Vec<String>,
117 #[serde(default)]
118 vendor_names: Vec<String>,
119}
120
121#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
122pub enum CveState {
123 PUBLIC,
124 RESERVED,
125}
126
127impl Default for CveState {
128 fn default() -> Self {
129 Self::PUBLIC
130 }
131}
132
133#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, Default)]
134#[serde(rename_all = "kebab-case")]
135pub struct Credits {
136 #[serde(default)]
137 pub discovered_by: Vec<String>,
138 #[serde(default)]
139 pub module: Vec<String>,
140 #[serde(default)]
141 pub reporter: Vec<String>,
142}
143
144#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
146#[serde(rename_all = "camelCase")]
147pub struct FoldedRecord {
148 pub id: Uuid,
150}