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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
use crate::v2::{Keyword, LastModDate, LimitOffset};
use chrono::NaiveDateTime;
use serde::{Deserialize, Serialize};

// https://nvd.nist.gov/developers/vulnerabilities
#[derive(Debug, Default, Serialize, Deserialize, PartialEq, Clone, Eq)]
#[serde(rename_all = "camelCase")]
pub struct CveParameters {
  pub cpe_name: Option<String>,
  pub cve_id: Option<String>,
  pub cvss_v2_metrics: Option<String>,
  pub cvss_v2_severity: Option<nvd_cvss::severity::SeverityTypeV2>,
  pub cvss_v3_metrics: Option<String>,
  pub cvss_v3_severity: Option<nvd_cvss::severity::SeverityType>,
  pub cwe_id: Option<String>,
  pub has_cert_alerts: Option<bool>,
  pub has_cert_notes: Option<bool>,
  pub has_kev: Option<bool>,
  pub has_oval: Option<bool>,
  pub is_vulnerable: Option<bool>,
  #[serde(flatten)]
  pub keyword: Option<Keyword>,
  #[serde(flatten)]
  pub last_mod: Option<LastModDate>,
  pub no_rejected: Option<bool>,
  #[serde(flatten)]
  pub pub_date: Option<PubDate>,
  #[serde(flatten)]
  pub limit_offset: Option<LimitOffset>,
  pub source_identifier: Option<String>,
  #[serde(flatten)]
  pub virtual_match: Option<VirtualMatch>,
}

#[derive(Debug, Default, Serialize, Deserialize, PartialEq, Clone, Eq)]
#[serde(rename_all = "camelCase")]
pub struct VirtualMatch {
  pub virtual_match_string: String,
  #[serde(flatten)]
  pub version_start: Option<VersionStart>,
  #[serde(flatten)]
  pub version_end: Option<VersionEnd>,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq)]
#[serde(rename_all = "camelCase")]
pub struct VersionStart {
  pub version_start: String,
  pub version_start_type: String,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq)]
#[serde(rename_all = "camelCase")]
pub struct VersionEnd {
  pub version_end: String,
  pub version_end_type: String,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq)]
#[serde(rename_all = "camelCase")]
pub enum VersionType {
  Including,
  Excluding,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq)]
#[serde(rename_all = "camelCase")]
pub struct PubDate {
  pub pub_start_date: String,
  pub pub_end_date: String,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
pub struct Vulnerabilities {
  pub cve: nvd_cves::api::CVE,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq)]
#[serde(rename_all = "camelCase")]
pub struct CveHistoryParameters {
  pub cve_id: Option<String>,
  #[serde(flatten)]
  pub change_date: Option<ChangeDate>,
  pub event_name: Option<EventName>,
  #[serde(flatten)]
  pub limit_offset: Option<LimitOffset>,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq)]
#[serde(rename_all = "camelCase")]
pub struct ChangeDate {
  pub change_start_date: String,
  pub change_end_date: String,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq)]
pub enum EventName {
  #[serde(rename = "CVE Received")]
  CVEReceived,
  #[serde(rename = "Initial Analysis")]
  InitialAnalysis,
  Reanalysis,
  #[serde(rename = "CVE Modified")]
  CVEModified,
  #[serde(rename = "Modified Analysis")]
  ModifiedAnalysis,
  #[serde(rename = "CVE Translated")]
  CVETranslated,
  #[serde(rename = "Vendor Comment")]
  VendorComment,
  #[serde(rename = "CVE Source Update")]
  CVESourceUpdate,
  #[serde(rename = "CPE Deprecation Remap")]
  CPEDeprecationRemap,
  #[serde(rename = "CWE Remap")]
  CWERemap,
  #[serde(rename = "CVE Rejected")]
  CVERejected,
  #[serde(rename = "CVE Unrejected")]
  CVEUnRejected,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq)]
#[serde(rename_all = "camelCase")]
pub struct CveChanges {
  pub change: Change,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Change {
  pub cve_id: String,
  pub event_name: EventName,
  pub cve_change_id: String,
  pub source_identifier: String,
  pub created: NaiveDateTime,
  pub details: Vec<Details>,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Details {
  pub action: Action,
  pub r#type: String,
  pub old_value: Option<String>,
  pub new_value: Option<String>,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq)]
pub enum Action {
  Added,
  Removed,
  Changed,
}