openscap_report.scap_results_parser.parsers.cpe_al_parser   A
last analyzed

Complexity

Total Complexity 19

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Test Coverage

Coverage 98.41%

Importance

Changes 0
Metric Value
eloc 71
dl 0
loc 86
ccs 62
cts 63
cp 0.9841
rs 10
c 0
b 0
f 0
wmc 19

6 Methods

Rating   Name   Duplication   Size   Complexity  
A CPEApplicabilityLanguageParser.get_platform_to_oval_cpe_id_dict() 0 11 4
A CPEApplicabilityLanguageParser._get_oval_cpe_tree() 0 13 4
A CPEApplicabilityLanguageParser._get_cpe_platform_elements() 0 9 3
A CPEApplicabilityLanguageParser.__init__() 0 5 1
A CPEApplicabilityLanguageParser.get_logical_test() 0 16 4
A CPEApplicabilityLanguageParser.get_cpe_platforms() 0 15 3
1
# Copyright 2022, Red Hat, Inc.
2
# SPDX-License-Identifier: LGPL-2.1-or-later
3 1
from ..data_structures import LogicalTest, Platform
4 1
from ..exceptions import ExceptionNoCPEApplicabilityLanguage
5 1
from ..namespaces import NAMESPACES
6 1
from .full_text_parser import FullTextParser
7
8 1
TEXT_TO_BOOL = {"true": True, "false": False, "": False}
9
10
11 1
class CPEApplicabilityLanguageParser:
12 1
    def __init__(self, root, oval_cpe_definitions):
13 1
        self.root = root
14 1
        self.platform_to_oval_cpe_id = self.get_platform_to_oval_cpe_id_dict()
15 1
        self.full_text_parser = FullTextParser({})
16 1
        self.oval_cpe_definitions = oval_cpe_definitions
17
18 1
    def get_platform_to_oval_cpe_id_dict(self):
19 1
        cpe_list = self.root.find(".//ds:component/cpe-dict:cpe-list", NAMESPACES)
20 1
        out = {}
21 1
        if cpe_list is None:
22 1
            return out
23 1
        for cpe_item in cpe_list:
24 1
            name = cpe_item.get("name")
25 1
            check = cpe_item.find(".//cpe-dict:check", NAMESPACES)
26 1
            oval_id = check.text if check is not None else name
27 1
            out[name] = oval_id
28 1
        return out
29
30 1
    def _get_cpe_platform_elements(self):
31 1
        cpe_platform_elements = {}
32 1
        platform_specification = self.root.find('.//cpe-lang:platform-specification', NAMESPACES)
33 1
        if platform_specification is None:
34 1
            raise ExceptionNoCPEApplicabilityLanguage
35 1
        for platform in platform_specification:
36 1
            platform_id = platform.get("id")
37 1
            cpe_platform_elements[platform_id] = platform
38 1
        return cpe_platform_elements
39
40 1
    def _get_oval_cpe_tree(self, platform_name, check_id_ref):
41 1
        oval_tree = None
42 1
        oval_cpe_id = None
43
44 1
        if platform_name in self.platform_to_oval_cpe_id:
45 1
            oval_cpe_id = self.platform_to_oval_cpe_id[platform_name]
46
47 1
        if check_id_ref is not None:
48 1
            oval_cpe_id = check_id_ref
49
50 1
        oval_cpe_definition = self.oval_cpe_definitions.get(oval_cpe_id, None)
51 1
        oval_tree = oval_cpe_definition.oval_tree if oval_cpe_definition is not None else None
52 1
        return oval_tree
53
54 1
    def get_logical_test(self, logical_test_el):
55 1
        operator = logical_test_el.get("operator")
56 1
        negation = logical_test_el.get("negate", "")
57 1
        logical_test = LogicalTest(operator, negation=TEXT_TO_BOOL[negation])
58 1
        for child_logical_test_el in logical_test_el:
59 1
            if "fact-ref" in child_logical_test_el.tag:
60 1
                platform_name = child_logical_test_el.get("name")
61 1
                check_id_ref = child_logical_test_el.get("id-ref")
62 1
                logical_test.children.append(
63
                    LogicalTest(
64
                        node_type="fact-ref",
65
                        oval_tree=self._get_oval_cpe_tree(platform_name, check_id_ref))
66
                )
67 1
            if child_logical_test_el.get('operator') is not None:
68 1
                logical_test.children.append(self.get_logical_test(child_logical_test_el))
69 1
        return logical_test
70
71 1
    def get_cpe_platforms(self):
72 1
        out = {}
73 1
        for platform, platform_el in self._get_cpe_platform_elements().items():
74 1
            title_el = platform_el.find(".//cpe-lang:title", NAMESPACES)
75 1
            title_str = ""
76 1
            if title_el is not None:
77
                self.full_text_parser.get_full_description(title_el)
78 1
            logical_test_el = platform_el.find(".//cpe-lang:logical-test", NAMESPACES)
79
80 1
            out[platform] = Platform(
81
                platform_id=platform,
82
                logical_test=self.get_logical_test(logical_test_el),
83
                title=title_str
84
            )
85
        return out
86