From b70a48ce3ccc85227016a51b0b544603e8d12e78 Mon Sep 17 00:00:00 2001 From: Jia Chao Date: Fri, 7 Jun 2024 15:08:16 +0800 Subject: [PATCH] =?UTF-8?q?CVRF:=20=E5=A4=84=E7=90=86=20documentreferences?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jia Chao --- src/lib.rs | 36 ++++++++++++++++++++++++++++++++++++ src/test.rs | 7 +++++++ 2 files changed, 43 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 35de1e0..83955bd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -161,6 +161,7 @@ impl CVRF { "DocumentPublisher" => self.documentpublisher.load_from_xmlreader(xmlreader), "DocumentTracking" => self.documenttracking.load_from_xmlreader(xmlreader), "DocumentNotes" => self.handle_notes(xmlreader), + "DocumentReferences" => self.handle_references(xmlreader), _ => {} }, Err(e) => { @@ -185,6 +186,18 @@ impl CVRF { self.documentnotes.push(note); } } + + fn handle_references(&mut self, xmlreader: &mut XmlReader) { + loop { + let mut reference = Reference::new(); + reference.load_from_xmlreader(xmlreader); + + if xmlreader.depth < 2 { + break; + } + self.documentreferences.push(reference); + } + } } // depth = 2 @@ -506,6 +519,29 @@ impl Reference { url: String::new(), } } + + #[instrument(skip(self, xmlreader))] + fn load_from_xmlreader(&mut self, xmlreader: &mut XmlReader) { + loop { + match xmlreader.next() { + Ok(XmlEvent::StartElement { attributes, .. }) => { + self.r#type = attributes[0].value.clone(); + self.url = xmlreader.next_characters(); + } + Ok(XmlEvent::EndElement { .. }) => { + if xmlreader.depth < 3 { + trace!("Reference read end."); + break; + } + } + Err(e) => { + error!("XmlReader Error: {e}"); + break; + } + _ => {} + } + } + } } // depth = 2 diff --git a/src/test.rs b/src/test.rs index 40a085b..f959fa7 100644 --- a/src/test.rs +++ b/src/test.rs @@ -48,4 +48,11 @@ fn cvrf_works() { assert_eq!(cvrf.documentnotes[0].r#type, note_type); assert_eq!(cvrf.documentnotes[0].ordinal, note_ordinal); assert_eq!(cvrf.documentnotes[1].content, note_content); + + // references + let reference_type = "openEuler CVE"; + let reference_url = "https://www.openeuler.org/en/security/cve/detail.html?id=CVE-2023-45288"; + assert_eq!(cvrf.documentreferences.len(), 3); + assert_eq!(cvrf.documentreferences[1].r#type, reference_type); + assert_eq!(cvrf.documentreferences[1].r#url, reference_url); }