Skip to content

Commit e812ce6

Browse files
authored
Merge pull request #182 from sbs2001/rm_performant_oval_parser
Update lib_oval.py and remove PerformantOvalDocument from oval_parser.py
2 parents 736a9b2 + bcb0ff4 commit e812ce6

2 files changed

Lines changed: 20 additions & 58 deletions

File tree

vulnerabilities/scraper/lib_oval.py

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
# * Neither the name of the Center for Internet Security, Inc. (CIS) nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
99

1010
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER, CIS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER, CIS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
11-
1211
"""Library to simplify working with the OVAL XML structure
1312
1413
@@ -160,8 +159,14 @@ def __init__(self, tree):
160159
gen.setSchemaVersion("5.10.1")
161160
root.append(gen.get_element())
162161
return
163-
162+
164163
self.tree = tree
164+
self.id_to_definition = { el.getId(): el for el in self.getDefinitions()} if self.getDefinitions() else {}
165+
self.id_to_test = {el.getId(): el for el in self.getTests()} if self.getTests() else {}
166+
self.id_to_object = {el.getId(): el for el in self.getObjects()} if self.getObjects() else {}
167+
self.id_to_state = {el.getId(): el for el in self.getStates()} if self.getStates() else {}
168+
self.id_to_variable = {el.getId(): el for el in self.getVariables()} if self.getVariables() else {}
169+
165170

166171

167172
def parseFromFile(self, filename):
@@ -438,28 +443,17 @@ def getElementByID(self, ovalid):
438443
return None
439444

440445
if oval_type == OvalDefinition.DEFINITION:
441-
elist = self.getDefinitions()
446+
return self.id_to_definition[ovalid]
442447
elif oval_type == OvalDefinition.TEST:
443-
elist = self.getTests()
448+
return self.id_to_test[ovalid]
444449
elif oval_type == OvalDefinition.OBJECT:
445-
elist = self.getObjects()
450+
return self.id_to_object[ovalid]
446451
elif oval_type == OvalDefinition.STATE:
447-
elist = self.getStates()
452+
return self.id_to_state[ovalid]
448453
elif oval_type == OvalDefinition.VARIABLE:
449-
elist = self.getVariables()
454+
return self.id_to_variable[ovalid]
450455
else:
451456
return None
452-
453-
if not elist:
454-
return None
455-
456-
for element in elist:
457-
defid = element.getId()
458-
if defid and defid == ovalid:
459-
return element
460-
461-
462-
463457

464458
def addElement(self, element, replace=True):
465459
"""
@@ -512,6 +506,7 @@ def addElement(self, element, replace=True):
512506
root.append(parent)
513507

514508
parent.append(element.getElement())
509+
self.id_to_definition[ovalid] = element
515510
return True
516511

517512
elif oval_type == OvalDefinition.TEST:
@@ -521,6 +516,7 @@ def addElement(self, element, replace=True):
521516
root.append(parent)
522517

523518
parent.append(element.getElement())
519+
self.id_to_test[ovalid] = element
524520
return True
525521

526522
elif oval_type == OvalDefinition.OBJECT:
@@ -530,6 +526,7 @@ def addElement(self, element, replace=True):
530526
root.append(parent)
531527

532528
parent.append(element.getElement())
529+
self.id_to_object[ovalid] = element
533530
return True
534531

535532
elif oval_type == OvalDefinition.STATE:
@@ -539,14 +536,16 @@ def addElement(self, element, replace=True):
539536
root.append(parent)
540537

541538
parent.append(element.getElement())
539+
self.id_to_state[ovalid] = element
542540
return True
543541

544542
elif oval_type == OvalDefinition.VARIABLE:
545543
parent = root.find("def:variables", OvalDocument.NS_DEFAULT)
546544
if parent is None:
547545
parent = Element("{" + OvalDocument.NS_DEFAULT.get("def") + "}variables")
548546
root.append(parent)
549-
547+
548+
self.id_to_variable[ovalid] = element
550549
parent.append(element.getElement())
551550
return True
552551

@@ -1383,4 +1382,4 @@ def __init__(self, element):
13831382

13841383

13851384
def getType(self):
1386-
return OvalElement.VARIABLE
1385+
return OvalElement.VARIABLE

vulnerabilities/scraper/oval_parser.py

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,49 +11,12 @@
1111
OvalDefinition, OvalDocument, OvalTest, OvalObject, OvalState, OvalElement)
1212

1313

14-
class PerformantOvalDocument(OvalDocument):
15-
16-
def __init__(self, tree):
17-
super().__init__(tree)
18-
self.id_to_definition = {
19-
el.getId(): el for el in self.getDefinitions()}
20-
self.id_to_test = {el.getId(): el for el in self.getTests()}
21-
self.id_to_object = {el.getId(): el for el in self.getObjects()}
22-
self.id_to_state = {el.getId(): el for el in self.getStates()}
23-
self.id_to_variable = {el.getId(): el for el in self.getVariables()}
24-
25-
def getElementByID(self, oval_id: str) -> Optional[OvalElement]:
26-
if not oval_id:
27-
return None
28-
29-
root = self.getDocumentRoot()
30-
if not root:
31-
return None
32-
try:
33-
oval_type = OvalElement.getElementTypeFromOvalID(oval_id)
34-
except Exception:
35-
return None
36-
37-
if oval_type == OvalDefinition.DEFINITION:
38-
return self.id_to_definition[oval_id]
39-
elif oval_type == OvalDefinition.TEST:
40-
return self.id_to_test[oval_id]
41-
elif oval_type == OvalDefinition.OBJECT:
42-
return self.id_to_object[oval_id]
43-
elif oval_type == OvalDefinition.STATE:
44-
return self.id_to_state[oval_id]
45-
elif oval_type == OvalDefinition.VARIABLE:
46-
return self.id_to_variable[oval_id]
47-
else:
48-
return None
49-
50-
5114
class OvalExtractor:
5215

5316
def __init__(self, translations: Dict, oval_document: ET.ElementTree):
5417

5518
self.translations = translations
56-
self.oval_document = PerformantOvalDocument(oval_document)
19+
self.oval_document = OvalDocument(oval_document)
5720
self.all_definitions = self.oval_document.getDefinitions()
5821
self.all_tests = self.oval_document.getTests()
5922

0 commit comments

Comments
 (0)