use crate::csaf_traits::{CsafTrait, VulnerabilityTrait};
use crate::validation::ValidationError;
use std::collections::HashMap;
fn generate_duplicate_cve_error(cve: &str, path: usize) -> ValidationError {
ValidationError {
message: format!("Duplicate usage of same CVE identifier '{cve}'"),
instance_path: format!("/vulnerabilities/{path}/cve"),
}
}
pub fn test_6_1_23_multiple_use_of_same_cve(doc: &impl CsafTrait) -> Result<(), Vec<ValidationError>> {
let vulnerabilities = doc.get_vulnerabilities();
if vulnerabilities.is_empty() {
return Ok(());
}
let mut cve_paths: HashMap<String, Vec<usize>> = HashMap::new();
for (i_r, vulnerability) in vulnerabilities.iter().enumerate() {
let cve = vulnerability.get_cve();
if let Some(cve) = cve {
let path = cve_paths.entry(cve.to_owned()).or_default();
path.push(i_r);
}
}
if cve_paths.is_empty() {
return Ok(());
}
let mut errors: Option<Vec<ValidationError>> = None;
for (cve, paths) in &cve_paths {
if paths.len() > 1 {
errors
.get_or_insert_default()
.extend(paths.iter().map(|path| generate_duplicate_cve_error(cve, *path)));
}
}
errors.map_or(Ok(()), Err)
}
crate::test_validation::impl_validator!(ValidatorForTest6_1_23, test_6_1_23_multiple_use_of_same_cve);
#[cfg(test)]
mod tests {
use super::*;
use crate::csaf2_0::testcases::TESTS_2_0;
use crate::csaf2_1::testcases::TESTS_2_1;
#[test]
fn test_test_6_1_23() {
let case_01 = Err(vec![
generate_duplicate_cve_error("CVE-2017-0145", 0),
generate_duplicate_cve_error("CVE-2017-0145", 1),
]);
let case_s01 = Err(vec![
generate_duplicate_cve_error("CVE-2017-0145", 0),
generate_duplicate_cve_error("CVE-2017-0145", 1),
generate_duplicate_cve_error("CVE-2017-0145", 2),
]);
let case_s02 = Err(vec![
generate_duplicate_cve_error("CVE-2017-0145", 0),
generate_duplicate_cve_error("CVE-2017-0145", 2),
generate_duplicate_cve_error("CVE-2017-0146", 1),
generate_duplicate_cve_error("CVE-2017-0146", 3),
]);
let case_s03 = Err(vec![
generate_duplicate_cve_error("CVE-2017-0145", 0),
generate_duplicate_cve_error("CVE-2017-0145", 2),
]);
TESTS_2_0.test_6_1_23.expect(
case_01.clone(),
case_s01.clone(),
case_s02.clone(),
case_s03.clone(),
Ok(()),
);
TESTS_2_1
.test_6_1_23
.expect(case_01, case_s01, case_s02, case_s03, Ok(()));
}
}