swagger/scan/passive/
mod.rs1use super::*;
2mod auth;
3pub use auth::*;
4mod general;
5pub use general::*;
6mod type_checks;
7pub use type_checks::*;
8mod utils;
9pub use utils::*;
10mod additional_checks;
11use strum::IntoEnumIterator;
12
13#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
14pub enum PassiveScanType {
15 Full,
16 Partial(Vec<PassiveChecks>),
17}
18
19impl Default for PassiveScanType {
20 fn default() -> Self {
21 Self::Full
22 }
23}
24#[derive(Debug, Clone, Serialize, Default, PartialEq, Eq)]
25pub struct PassiveSwaggerScan<T>
26where
27 T: Serialize,
28{
29 swagger: T,
30 swagger_value: Value,
31 verbosity: u8,
33 pub passive_checks: Vec<PassiveChecks>,
34}
35impl<T: OAS + Serialize + for<'de> Deserialize<'de>> PassiveSwaggerScan<T> {
36 pub fn new(swagger_value: Value) -> Result<Self, &'static str> {
37 match serde_json::from_value::<T>(swagger_value.clone()) {
38 Ok(swagger) => Ok(PassiveSwaggerScan {
39 swagger,
40 swagger_value,
41 passive_checks: vec![],
42 verbosity: 0,
43 }),
44 Err(e) => {
45 println!("{:?}", e);
46 Err("Failed at deserializing swagger value to a swagger struct, please check the swagger definition")
47 }
48 }
49 }
50
51 pub fn run(&mut self, tp: PassiveScanType) {
52 match tp {
54 PassiveScanType::Full => {
55 for check in PassiveChecks::iter() {
56 self.passive_checks.push(self.run_check(check));
57 }
58 }
59 PassiveScanType::Partial(checks) => {
60 for check in checks {
61 self.passive_checks.push(self.run_check(check));
62 }
63 }
64 };
65 }
66
67 pub fn print(&self, verbosity: u8) {
68 match verbosity {
69 0 => {
70 print_passive_alerts_verbose(self.passive_checks.clone());
73 }
74 1 => print_passive_alerts(self.passive_checks.clone()),
75 2 => (), _ => (),
77 }
78 }
79 pub fn print_to_file_string(&self) -> String {
80 let mut string = String::new();
81 for check in &self.passive_checks {
82 string.push_str(&format!(
83 "CHECK: {:?}\tALERTS:{}\tTOP SEVERITY:{:?}\n",
84 check.name(),
85 check.inner().len(),
86 check.top_severity()
87 ));
88 for alert in check.inner() {
89 string.push_str(&format!(
90 "LEVEL:{:?}\tLOCATION:{:?}\tDESCRIPTION:{:?}\n",
91 alert.level, alert.location, alert.description
92 ));
93 }
94 }
95 string
96 }
97}
98impl PassiveChecks {
99 pub fn parse_check_list(list: Vec<String>, exclude: bool) -> Vec<PassiveChecks> {
100 let mut checks = Vec::new();
101 for check in list.iter() {
102 let check = Self::from_string(check);
103 if let Some(c) = check {
104 checks.push(c);
105 }
106 }
107 if exclude {
108 let mut ex_checks: Vec<_> = Self::iter().collect();
109 ex_checks.retain(|x| !checks.contains(x));
110 return ex_checks;
111 }
112 checks
113 }
114}