diff options
-rw-r--r-- | lib/orm/models.py | 3 | ||||
-rw-r--r-- | lib/srtgui/api.py | 5 | ||||
-rw-r--r-- | lib/srtgui/reports.py | 119 | ||||
-rw-r--r-- | lib/srtgui/tables.py | 1 | ||||
-rw-r--r-- | lib/srtgui/templates/cves-toastertable.html | 2 |
5 files changed, 124 insertions, 6 deletions
diff --git a/lib/orm/models.py b/lib/orm/models.py index 29ef88dc..0f6cfb17 100644 --- a/lib/orm/models.py +++ b/lib/orm/models.py @@ -584,7 +584,8 @@ class Product(models.Model): unique_together = ('name', 'version', 'profile', ) @property def long_name(self): - return '%s %s %s' % (self.name,self.version,self.profile) + long_name = '%s %s %s' % (self.name,self.version,self.profile) + return long_name.strip() def get_defect_tag(self,tag): dict = json.loads(self.defect_tags) try: diff --git a/lib/srtgui/api.py b/lib/srtgui/api.py index b3e15acc..16ff88b0 100644 --- a/lib/srtgui/api.py +++ b/lib/srtgui/api.py @@ -296,6 +296,11 @@ def summaryCveDetails(cve,cve_sources): cve_detail.name = cve.name cve_html = {} + # No data sources + if not cve_main: + return cve_detail,cve_html + + # Merge the data into summary record summaryMerge(cve_detail,cve_main,cve_local,cve_html,'description') summaryMerge(cve_detail,cve_main,cve_local,cve_html,'cve_data_format') summaryMerge(cve_detail,cve_main,cve_local,cve_html,'lastModifiedDate') diff --git a/lib/srtgui/reports.py b/lib/srtgui/reports.py index a7de4ca4..297b885a 100644 --- a/lib/srtgui/reports.py +++ b/lib/srtgui/reports.py @@ -659,6 +659,7 @@ class CvesReport(Report): context['report_type_list'] = '\ <option value="summary">CVEs Table</option> \ + <option value="cve_defects">CVE to Defects Table</option> \ ' context['report_get_title'] = '' context['report_recordrange_list'] = '\ @@ -678,7 +679,7 @@ class CvesReport(Report): ' return context - def print_row(self,writer,is_header,is_full,cve): + def print_row_summary(self,writer,is_header,is_full,cve): if is_header: if not is_full: writer.writerow([ @@ -762,6 +763,99 @@ class CvesReport(Report): cve.description, ]) + def print_row_cve_defects(self,writer,mode,is_full,cve,vulnerability,investigation,defect): + if 'header' == mode: + if not is_full: + writer.writerow([ + 'Name', + 'Status', + 'Severity (V3)', + 'Published', + 'Vulnerability', + 'Investigation', + 'Investigation Product', + 'Investigation Priority', + 'Investigation Status', + 'Investigation Outcome', + 'Defect', + 'Defect Priority', + 'Defect Status', + 'Defect resolution', + ]) + else: + writer.writerow([ + 'Name', + 'Status', + 'Severity (V3)', + 'Published', + 'Vulnerability', + 'Investigation', + 'Investigation Product', + 'Investigation Priority', + 'Investigation Status', + 'Investigation Outcome', + 'Defect', + 'Defect Priority', + 'Defect Status', + 'Defect resolution', + ]) + elif 'cve' == mode: + c2v_list = cve.cve_to_vulnerability.all() + if c2v_list: + for cv in c2v_list: + v2i_list = cv.vulnerability.vulnerability_investigation.all() + if v2i_list: + for investigation in v2i_list: + i2d_list = investigation.investigation_to_defect.all() + if i2d_list: + for i2d in investigation.investigation_to_defect.all(): + self.print_row_cve_defects(writer,'line',is_full,cve,cv.vulnerability,investigation,i2d.defect) + else: + self.print_row_cve_defects(writer,'line',is_full,cve,cv.vulnerability,investigation,None) + else: + self.print_row_cve_defects(writer,'line',is_full,cve,cv.vulnerability,None,None) + else: + self.print_row_cve_defects(writer,'line',is_full,cve,None,None,None) + else: + if not is_full: + writer.writerow([ + cve.name, + cve.get_status_text, + '%s %s' % (cve.cvssV3_baseScore,cve.cvssV3_baseSeverity), + cve.get_publish_text, + vulnerability.name if vulnerability else '<no_vulnerability>', + investigation.name if investigation else '', + investigation.product.long_name if investigation and investigation.product else '<no_product>', + investigation.get_priority_text if investigation else '', + investigation.get_status_text if investigation else '', + investigation.get_outcome_text if investigation else '', + defect.name if defect else '<no_defect>', + defect.get_priority_text if defect else '', + defect.get_status_text if defect else '', + defect.get_resolution_text if defect else '', + ]) + else: + writer.writerow([ + cve.name, + cve.get_status_text, + '%s %s' % (cve.recommend,cve.recommend_list), + cve.cve_data_type, + cve.cve_data_format, + cve.cve_data_version, + '%s %s' % (cve.cvssV3_baseScore,cve.cvssV3_baseSeverity), + '%s %s' % (cve.cvssV2_baseScore,cve.cvssV2_severity), + cve.get_publish_text, + vulnerability.name if vulnerability else '', + investigation.name if investigation else '', + investigation.get_priority_text if investigation else '', + investigation.get_status_text if investigation else '', + investigation.get_outcome_text if investigation else '', + defect.name if defect else '', + defect.get_priority_text if defect else '', + defect.get_status_text if defect else '', + defect.get_outcome_text if defect else '', + ]) + def exec_report(self, *args, **kwargs): _log_args("REPORT_CVES_EXEC", *args, **kwargs) super(CvesReport, self).exec_report(*args, **kwargs) @@ -786,21 +880,38 @@ class CvesReport(Report): writer = csv.writer(csvfile, delimiter=delimiter, quotechar='"', quoting=csv.QUOTE_MINIMAL) if ('summary' == report_type): - self.print_row(writer,True,"all" == columns,None) + self.print_row_summary(writer,True,"all" == columns,None) + if 'displayed' == range: + for id in record_list.split(','): + if not id: + continue + cve = Cve.objects.get(id=id) + if not name_filter or (name_filter in cve.name): + self.print_row_summary(writer,False,"all" == columns,cve) + elif 'all' == range: + if name_filter: + query = Cve.objects.filter(name__contains=name_filter).order_by('name') + else: + query = Cve.objects.all().order_by('name') + for cve in query: + self.print_row_summary(writer,False,"all" == columns,cve) + + if ('cve_defects' == report_type): + self.print_row_cve_defects(writer,'header',"all" == columns,None,None,None,None) if 'displayed' == range: for id in record_list.split(','): if not id: continue cve = Cve.objects.get(id=id) if not name_filter or (name_filter in cve.name): - self.print_row(writer,False,"all" == columns,cve) + self.print_row_cve_defects(writer,'cve',"all" == columns,cve,None,None,None) elif 'all' == range: if name_filter: query = Cve.objects.filter(name__contains=name_filter).order_by('name') else: query = Cve.objects.all().order_by('name') for cve in query: - self.print_row(writer,False,"all" == columns,cve) + self.print_row_cve_defects(writer,'line',"all" == columns,cve,None,None,None) return report_name,os.path.basename(report_name) diff --git a/lib/srtgui/tables.py b/lib/srtgui/tables.py index 3268e68f..0bfef4e5 100644 --- a/lib/srtgui/tables.py +++ b/lib/srtgui/tables.py @@ -1126,6 +1126,7 @@ class ProductsTable(ToasterTable): self.add_column(title="Order", field_name="order", hideable=False, + orderable=True, ) key_link_template = ''' diff --git a/lib/srtgui/templates/cves-toastertable.html b/lib/srtgui/templates/cves-toastertable.html index d5329713..45dce261 100644 --- a/lib/srtgui/templates/cves-toastertable.html +++ b/lib/srtgui/templates/cves-toastertable.html @@ -62,7 +62,7 @@ /* Set the report link */ var record_list="" - $(".name > a").each(function(){ + $(".name_sort > a").each(function(){ var this_id=$(this).prop('id'); if (this_id.startsWith("dataid_")) { record_list +=this_id.replace(/dataid_/,"") + ","; |