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
use scan_object::ScanObject;
use scan_module::ScanModule;
use scan_result::ScanResult;
use scan_report::ScanReport;
pub mod strings;
pub mod unicode_watermark;
pub mod exif;
pub fn make_default_scan_modules() -> Vec<Box<ScanModule>> {
vec![
Box::new(strings::StringsScanModule {}),
Box::new(unicode_watermark::UnicodeWatermarkScanModule {}),
Box::new(exif::ExifScanModule {}),
]
}
pub fn process(scan_modules: Vec<Box<ScanModule>>, scan_object: &ScanObject) -> ScanResult {
let mut scan_reports: Vec<ScanReport> = Vec::new();
let mut skipped_scan_modules: Vec<&'static str> = Vec::new();
for sm in scan_modules {
if sm.subscribed_filetypes().is_some() {
let filetypes: Vec<String> = sm.subscribed_filetypes()
.unwrap()
.iter()
.map(|f| String::from(*f))
.collect();
let mut found = false;
if &scan_object.filetype.is_some() == &true {
let given_filetype: &String = match &scan_object.filetype.as_ref() {
&Some(filetype) => &filetype,
&None => unreachable!(),
};
if filetypes.contains(&given_filetype) {
found = true;
}
}
for filetype in scan_object.detected_filetypes.as_slice() {
if filetypes.contains(&filetype) {
found = true;
}
}
if !found {
skipped_scan_modules.push(sm.name());
continue;
}
}
let report: ScanReport = match sm.scan(scan_object) {
Ok(findings) => ScanReport {
error: None,
findings: match findings.len() {
0 => None,
_ => Some(findings),
},
module_info: (String::from(sm.name()), String::from(sm.description())),
},
Err(error) => ScanReport {
error: Some(error),
findings: None,
module_info: (String::from(sm.name()), String::from(sm.description())),
},
};
scan_reports.push(report);
}
ScanResult {
reports: scan_reports,
}
}