cwe/
cwe.rs

1use std::io::Read;
2use std::rc::Rc;
3
4use cwe_xml::cwe::{CweDatabase, WeaknessVisitor};
5use cwe_xml::cwe::weaknesses::Weakness;
6
7/// Download the CWE catalogs, parse them, build a global CweCatalog struct and print it.
8/// CWE files are zipped XML files.
9fn main() -> Result<(), Box<dyn std::error::Error>> {
10    let mut cwe_db = CweDatabase::new();
11
12    // Import the 3 main CWE catalogs from the official website.
13    cwe_db.import_weakness_catalog_from_url("https://cwe.mitre.org/data/xml/views/699.xml.zip")?;
14    cwe_db.import_weakness_catalog_from_url("https://cwe.mitre.org/data/xml/views/1000.xml.zip")?;
15    cwe_db.import_weakness_catalog_from_url("https://cwe.mitre.org/data/xml/views/1194.xml.zip")?;
16
17    cwe_db.infer_categories_from_ancestors();
18    cwe_db.infer_categories_from_descendants();
19
20    // Retrieve a weakness by its ID (CWE-73).
21    let cwe_id: i64 = 306;
22    let weakness = cwe_db.weakness_by_cwe_id(cwe_id);
23    println!("Weakness CWE-ID-{}\n{:#?}", cwe_id, weakness);
24
25    // Display the categories of the weakness (if any).
26    let categories = cwe_db.categories_by_cwe_id(cwe_id);
27    println!("Categories {:#?}", categories);
28
29    let children = cwe_db.weakness_children_by_cwe_id(1076);
30    println!("CWE-{} has {} children", cwe_id, children.len());
31
32    println!("{} CWE roots", cwe_db.weakness_roots().len());
33    for root in &cwe_db.weakness_roots() {
34        println!("CWE-{} is a root '{}'", root.id, root.name);
35    }
36
37    let mut visitor = Visitor;
38
39    cwe_db.visit_weaknesses(&mut visitor);
40
41    // Display the CWE catalog summary.
42    println!("{}", cwe_db);
43
44    Ok(())
45}
46
47struct Visitor;
48
49impl WeaknessVisitor for Visitor {
50    fn visit(&mut self, db: &CweDatabase, level: usize, weakness: Rc<Weakness>) {
51        let cats = db.categories_by_cwe_id(weakness.id).iter().map(|c| c.name.clone()).collect::<Vec<_>>();
52
53        println!("{} CWE-{} {} (subtree-size: {}, categories: {:?})",
54                 " ".repeat(level * 2),
55                 weakness.id,
56                 weakness.name,
57                 db.weakness_subtree_by_cwe_id(weakness.id).len(),
58                 cats
59        );
60    }
61}