Skip to content

Commit 8512a60

Browse files
finetune
1 parent 54392b9 commit 8512a60

47 files changed

Lines changed: 9517 additions & 9958 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

dojo/jira_link/helper.py

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,13 @@ def _safely_get_obj_status_for_jira(obj: Finding | Finding_Group, *, isenforced:
119119
return obj.status
120120

121121
if isinstance(obj, Finding_Group):
122+
# only consider findings that are above the minimum threshold, but includ inactive and non-verified findings
122123
findings = get_finding_group_findings_above_threshold(obj)
123124
if not findings:
124-
return ["Empty"]
125+
return ["Empty", "Inactive"]
125126

126127
for find in findings:
127-
logger.error(f"Finding {find.id} status {find.active} {find.verified} {find.is_mitigated}")
128+
logger.debug(f"Finding {find.id} status {find.active} {find.verified} {find.is_mitigated}")
128129

129130
# This iterates 3 times over the list of findings, but any code doing 1 iteration would looke it's from 1990
130131
if any(find.active for find in findings):
@@ -824,7 +825,7 @@ def prepare_jira_issue_fields(
824825
def add_jira_issue(obj, *args, **kwargs):
825826
def failure_to_add_message(message: str, exception: Exception, _: Any) -> bool:
826827
if exception:
827-
logger.error(exception)
828+
logger.error("Exception occurred", exc_info=exception)
828829
logger.error(message)
829830
log_jira_alert(message, obj)
830831
return False
@@ -868,7 +869,7 @@ def failure_to_add_message(message: str, exception: Exception, _: Any) -> bool:
868869
duedate = None
869870

870871
if System_Settings.objects.get().enable_finding_sla:
871-
duedate = obj.sla_deadline()
872+
duedate = get_sla_deadline(obj)
872873
# Set the fields that will compose the jira issue
873874
try:
874875
issuetype_fields = get_issuetype_fields(jira, jira_project.project_key, jira_instance.default_issue_type)
@@ -1809,4 +1810,51 @@ def get_finding_group_findings_above_threshold(finding_group):
18091810
if System_Settings.objects.get().jira_minimum_severity:
18101811
jira_minimum_threshold = Finding.get_numerical_severity(System_Settings.objects.get().jira_minimum_severity)
18111812

1812-
return finding_group.findings.filter(numerical_severity__lte=jira_minimum_threshold)
1813+
return [finding for finding in finding_group.findings.all() if finding.numerical_severity <= jira_minimum_threshold]
1814+
1815+
1816+
def is_qualified(finding):
1817+
"""Check if the finding is qualified to be pushed to JIRA, i.e. active, verified (unless not enforced) and severity is above the threshold"""
1818+
jira_minimum_threshold = None
1819+
if System_Settings.objects.get().jira_minimum_severity:
1820+
jira_minimum_threshold = Finding.get_numerical_severity(System_Settings.objects.get().jira_minimum_severity)
1821+
1822+
isenforced = get_system_setting("enforce_verified_status", True) or get_system_setting("enforce_verified_status_jira", True)
1823+
1824+
return finding.active and (finding.verified or not isenforced) and (finding.numerical_severity <= jira_minimum_threshold)
1825+
1826+
1827+
def get_qualified_findings(findings):
1828+
"""Filters findings to return only findings qualified to be pushed to JIRA, i.e. active, verified (unless not enforced) and severity is above the threshold"""
1829+
if not findings:
1830+
return None
1831+
1832+
return [find for find in findings if is_qualified(find)]
1833+
1834+
1835+
def get_non_qualified_findings(findings):
1836+
"""Filters findings to return only findings not qualified to be pushed to JIRA, i.e. inactive, not-verified (unless not enforced) and severity is below the threshold"""
1837+
if not findings:
1838+
return None
1839+
1840+
return [find for find in findings if not is_qualified(find)]
1841+
1842+
1843+
def get_sla_deadline(obj):
1844+
"""Get the earliest SLA deadline from a finding or a list of findings, this typically includes all qualified findings in the group"""
1845+
if not obj:
1846+
return None
1847+
1848+
if isinstance(obj, Finding):
1849+
return obj.sla_deadline()
1850+
1851+
if isinstance(obj, Finding_Group):
1852+
return min([find.sla_deadline() for find in get_qualified_findings(obj.findings.all()) if find.sla_deadline()], default=None)
1853+
1854+
logger.warning("get_sla_deadline: obj passed that is not a Finding or Finding_Group")
1855+
return None
1856+
1857+
1858+
def get_severity(findings):
1859+
max_number_severity = max(Finding.get_number_severity(find.severity) for find in findings)
1860+
return Finding.get_severity(max_number_severity)

dojo/templates/issue-trackers/jira_full/jira-finding-group-description.tpl

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,16 @@ A group of Findings has been pushed to JIRA to be investigated and fixed:
1010
h2. Group
1111
*Group*: [{{ finding_group.name|jiraencode}}|{{ finding_group_url|full_url }}] in [{{ finding_group.test.engagement.product.name|jiraencode }}|{{ product_url|full_url }}] / [{{ finding_group.test.engagement.name|jiraencode }}|{{ engagement_url|full_url }}] / [{{ finding_group.test|stringformat:'s'|jiraencode }}|{{ test_url|full_url }}]
1212

13-
# TODO: JIRA only include active/verified findings above threshold
14-
|| Severity || CVE || CWE || Component || Version || Title || Status ||{% for finding in finding_group.findings.all %}
15-
| {{finding.severity}} | {% if finding.cve %}[{{finding.cve}}|{{finding.cve|vulnerability_url}}]{% else %}None{% endif %} | [{{finding.cwe}}|{{finding.cwe|cwe_url}}] | {{finding.component_name|jiraencode_component}} | {{finding.component_version}} | {% url 'view_finding' finding.id as finding_url %}[{{ finding.title|jiraencode}}|{{ finding_url|full_url }}] | {{ finding.status }} |{% endfor %}
13+
h2. Summary
14+
*Severity:* {{ finding_group.findings.all | jira_severity }} {% if finding_group.sla_deadline %} *Due Date:* {{ finding_group.findings.all | jira_sla_deadline }} {% endif %}
1615

17-
# TODO: JIRA only include active/verified findings above threshold
18-
*Severity:* {{ finding_group.severity }}
16+
Findings matching the Active,{% if system_settings.enforce_verified_status or system_settings.enforce_verified_status_jira %} Verified{% endif %} and Severity criteria:
17+
|| Severity || CVE || CWE || Component || Version || Title || Status ||{% for finding in finding_group.findings.all|jira_qualified_findings %}
18+
|{{finding.severity}}|{% if finding.cve %}[{{finding.cve}}|{{finding.cve|vulnerability_url}}]{% else %}None{% endif %}|[{{finding.cwe}}|{{finding.cwe|cwe_url}}]|{{finding.component_name|jiraencode_component}}|{{finding.component_version}}|{% url 'view_finding' finding.id as finding_url %}[{{ finding.title|jiraencode}}|{{ finding_url|full_url }}]|{{ finding.status }}|{% endfor %}
1919

20-
# TODO: JIRA only include active/verified findings above threshold
21-
{% if finding_group.sla_deadline %} *Due Date:* {{ finding_group.sla_deadline }} {% endif %}
20+
Findings *not* matching the Active,{% if system_settings.enforce_verified_status or system_settings.enforce_verified_status_jira %} Verified{% endif %} and Severity criteria:
21+
|| Severity || CVE || CWE || Component || Version || Title || Status ||{% for finding in finding_group.findings.all|jira_non_qualified_findings %}
22+
|{{finding.severity}}|{% if finding.cve %}[{{finding.cve}}|{{finding.cve|vulnerability_url}}]{% else %}None{% endif %}|[{{finding.cwe}}|{{finding.cwe|cwe_url}}]|{{finding.component_name|jiraencode_component}}|{{finding.component_version}}|{% url 'view_finding' finding.id as finding_url %}[{{ finding.title|jiraencode}}|{{ finding_url|full_url }}]|{{ finding.status }}|{% endfor %}
2223

2324
{% if finding_group.test.engagement.branch_tag %}
2425
*Branch/Tag:* {{ finding_group.test.engagement.branch_tag }}

dojo/templatetags/display_tags.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,26 @@ def jira_change(obj):
868868
return jira_helper.get_jira_change(obj)
869869

870870

871+
@register.filter
872+
def jira_qualified_findings(findings):
873+
return jira_helper.get_qualified_findings(findings)
874+
875+
876+
@register.filter
877+
def jira_non_qualified_findings(findings):
878+
return jira_helper.get_non_qualified_findings(findings)
879+
880+
881+
@register.filter
882+
def jira_sla_deadline(findings):
883+
return jira_helper.get_sla_deadline(findings)
884+
885+
886+
@register.filter
887+
def jira_severity(findings):
888+
return jira_helper.get_severity(findings)
889+
890+
871891
@register.filter
872892
def get_thumbnail(file):
873893
from pathlib import Path

0 commit comments

Comments
 (0)