Passed
Pull Request — master (#55)
by Jan
07:58
created

openscap_report.scap_results_parser.parsers.rule_parser   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 98
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 20
eloc 80
dl 0
loc 98
ccs 67
cts 67
cp 1
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A RuleParser._get_multi_check() 0 6 3
A RuleParser._get_references() 0 10 2
A RuleParser._get_identifiers() 0 10 2
A RuleParser._get_warnings() 0 6 2
A RuleParser._get_check_content_refs_dict() 0 10 3
B RuleParser.process_rule() 0 32 5
A RuleParser.__init__() 0 3 1
A RuleParser._get_remediations() 0 6 2
1 1
from ..data_structures.data_structures import Rule
2 1
from ..namespaces import NAMESPACES
3 1
from .description_parser import DescriptionParser
4 1
from .remediation_parser import RemediationParser
5
6
7 1
class RuleParser():
8 1
    def __init__(self, ref_values):
9 1
        self.description_parser = DescriptionParser(ref_values)
10 1
        self.remediation_parser = RemediationParser(ref_values)
11
12 1
    @staticmethod
13 1
    def _get_references(rule):
14 1
        references = []
15 1
        for referenc in rule.findall(".//xccdf:reference", NAMESPACES):
16 1
            ref = {
17
                "href": referenc.get("href"),
18
                "text": referenc.text,
19
            }
20 1
            references.append(ref)
21 1
        return references
22
23 1
    @staticmethod
24 1
    def _get_identifiers(rule):
25 1
        identifiers = []
26 1
        for identifier in rule.findall(".//xccdf:ident", NAMESPACES):
27 1
            ident = {
28
                "system": identifier.get("system"),
29
                "text": identifier.text,
30
            }
31 1
            identifiers.append(ident)
32 1
        return identifiers
33
34 1
    @staticmethod
35 1
    def _get_warnings(rule):
36 1
        warnings = []
37 1
        for warning in rule.findall(".//xccdf:warning", NAMESPACES):
38 1
            warnings.append(warning.text)
39 1
        return warnings
40
41 1
    def _get_remediations(self, rule):
42 1
        output = []
43 1
        for fix in rule.findall(".//xccdf:fix", NAMESPACES):
44 1
            remediation = self.remediation_parser.get_remediation(fix)
45 1
            output.append(remediation)
46 1
        return output
47
48 1
    @staticmethod
49 1
    def _get_multi_check(rule):
50 1
        for check in rule.findall(".//xccdf:check", NAMESPACES):
51 1
            if check.get("multi-check") == "true":
52 1
                return True
53 1
        return False
54
55 1
    @staticmethod
56 1
    def _get_check_content_refs_dict(rule):
57 1
        check_content_refs = rule.findall(".//xccdf:check-content-ref", NAMESPACES)
58 1
        check_content_refs_dict = {}
59 1
        if check_content_refs is not None:
60 1
            for check_ref in check_content_refs:
61 1
                name = check_ref.get("name", "")
62 1
                id_check = name[:name.find(":")]
63 1
                check_content_refs_dict[id_check] = name
64 1
        return check_content_refs_dict
65
66 1
    def process_rule(self, rule):
67 1
        rule_id = rule.get("id")
68
69 1
        rule_dict = {
70
            "rule_id": rule_id,
71
            "severity": rule.get("severity", "Unknown"),
72
            "description": self.description_parser.get_full_description(rule),
73
            "references": self._get_references(rule),
74
            "identifiers": self._get_identifiers(rule),
75
            "warnings": self._get_warnings(rule),
76
            "remediations": self._get_remediations(rule),
77
            "multi_check": self._get_multi_check(rule),
78
        }
79
80 1
        title = rule.find(".//xccdf:title", NAMESPACES)
81 1
        if title is not None:
82 1
            rule_dict["title"] = title.text
83
84 1
        rationale = rule.find(".//xccdf:rationale", NAMESPACES)
85 1
        if rationale is not None:
86 1
            rule_dict["rationale"] = rationale.text
87
88 1
        platforms = rule.findall(".//xccdf:platform", NAMESPACES)
89 1
        rule_dict["platforms"] = []
90 1
        if platforms is not None:
91 1
            for platform in platforms:
92 1
                rule_dict["platforms"].append(platform.get("idref"))
93
94 1
        check_content_refs_dict = self._get_check_content_refs_dict(rule)
95 1
        rule_dict["oval_definition_id"] = check_content_refs_dict.get("oval", "")
96
97
        return Rule(**rule_dict)
98