Skip to content
Snippets Groups Projects
html_report_builder.py 1.99 KiB
Newer Older
  • Learn to ignore specific revisions
  • import json
    
    sw's avatar
    sw committed
    import os
    from typing import Any
    
    from jinja2 import Template, FileSystemLoader, Environment
    
    from contrib.descriptions import VulnDescriptionProvider
    from contrib.report_builders import JsonReportBuilder
    
    
    
    Lukas Koenen's avatar
    Lukas Koenen committed
    class ReportInfo:
        def __init__(self, severity='SeverityNone', is_empty=False):
            self.severity = severity
            self.num_severity = 0
    
    Lukas Koenen's avatar
    Lukas Koenen committed
            self.empty = is_empty
    
    Lukas Koenen's avatar
    Lukas Koenen committed
            if severity == 'SeverityLow':
                self.num_severity = 1
    
    Lukas Koenen's avatar
    Lukas Koenen committed
            if severity == 'SeverityMedium':
                self.num_severity = 2
    
            if severity == 'SeverityHigh':
                self.num_severity = 3
    
        def toJSON(self):
            return json.dumps(self, default=lambda o: o.__dict__,
                              sort_keys=True, indent=4)
    
        def __lt__(self, other):
    
    Lukas Koenen's avatar
    Lukas Koenen committed
            return self.num_severity < other.num_severity
    
    sw's avatar
    sw committed
    class JinjaHtmlReportBuilder(JsonReportBuilder):
        def __init__(self, description_provider: VulnDescriptionProvider):
            super().__init__(description_provider)
            self.template_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'templates')
            self.template_name = 'jinja2_report.html'
            self._read_template()  # type: Template
    
        def build(self) -> Any:
    
            json_data = self._buffer
    
    
    Lukas Koenen's avatar
    Lukas Koenen committed
            report_info = ReportInfo()
    
            if len(json_data['ips']) == 0:
                report_info.empty = True
    
    
            for vv in json_data['vulnerable'].values():
                for v in vv['vulnerabilities']:
    
    Lukas Koenen's avatar
    Lukas Koenen committed
                    r = ReportInfo(f'Severity{v["severity_str"]}')
    
    Lukas Koenen's avatar
    Lukas Koenen committed
                    if r > report_info:
                        report_info = r
    
    Lukas Koenen's avatar
    Lukas Koenen committed
            with open(f'{json_data["output_path"]}.info', 'w+') as info:
                info.write(report_info.toJSON())
    
    
            return self._template.render(data=json_data)
    
    sw's avatar
    sw committed
    
        def _read_template(self):
            template_loader = FileSystemLoader(searchpath=self.template_path)
            template_env = Environment(loader=template_loader, autoescape=True)
            self._template = template_env.get_template(self.template_name)