Skip to content

Commit 6df7da4

Browse files
finetune
1 parent 6be5b1c commit 6df7da4

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):
@@ -826,7 +827,7 @@ def prepare_jira_issue_fields(
826827
def add_jira_issue(obj, *args, **kwargs):
827828
def failure_to_add_message(message: str, exception: Exception, _: Any) -> bool:
828829
if exception:
829-
logger.error(exception)
830+
logger.error("Exception occurred", exc_info=exception)
830831
logger.error(message)
831832
log_jira_alert(message, obj)
832833
return False
@@ -870,7 +871,7 @@ def failure_to_add_message(message: str, exception: Exception, _: Any) -> bool:
870871
duedate = None
871872

872873
if System_Settings.objects.get().enable_finding_sla:
873-
duedate = obj.sla_deadline()
874+
duedate = get_sla_deadline(obj)
874875
# Set the fields that will compose the jira issue
875876
try:
876877
issuetype_fields = get_issuetype_fields(jira, jira_project.project_key, jira_instance.default_issue_type)
@@ -1793,4 +1794,51 @@ def get_finding_group_findings_above_threshold(finding_group):
17931794
if System_Settings.objects.get().jira_minimum_severity:
17941795
jira_minimum_threshold = Finding.get_numerical_severity(System_Settings.objects.get().jira_minimum_severity)
17951796

1796-
return finding_group.findings.filter(numerical_severity__lte=jira_minimum_threshold)
1797+
return [finding for finding in finding_group.findings.all() if finding.numerical_severity <= jira_minimum_threshold]
1798+
1799+
1800+
def is_qualified(finding):
1801+
"""Check if the finding is qualified to be pushed to JIRA, i.e. active, verified (unless not enforced) and severity is above the threshold"""
1802+
jira_minimum_threshold = None
1803+
if System_Settings.objects.get().jira_minimum_severity:
1804+
jira_minimum_threshold = Finding.get_numerical_severity(System_Settings.objects.get().jira_minimum_severity)
1805+
1806+
isenforced = get_system_setting("enforce_verified_status", True) or get_system_setting("enforce_verified_status_jira", True)
1807+
1808+
return finding.active and (finding.verified or not isenforced) and (finding.numerical_severity <= jira_minimum_threshold)
1809+
1810+
1811+
def get_qualified_findings(findings):
1812+
"""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"""
1813+
if not findings:
1814+
return None
1815+
1816+
return [find for find in findings if is_qualified(find)]
1817+
1818+
1819+
def get_non_qualified_findings(findings):
1820+
"""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"""
1821+
if not findings:
1822+
return None
1823+
1824+
return [find for find in findings if not is_qualified(find)]
1825+
1826+
1827+
def get_sla_deadline(obj):
1828+
"""Get the earliest SLA deadline from a finding or a list of findings, this typically includes all qualified findings in the group"""
1829+
if not obj:
1830+
return None
1831+
1832+
if isinstance(obj, Finding):
1833+
return obj.sla_deadline()
1834+
1835+
if isinstance(obj, Finding_Group):
1836+
return min([find.sla_deadline() for find in get_qualified_findings(obj.findings.all()) if find.sla_deadline()], default=None)
1837+
1838+
logger.warning("get_sla_deadline: obj passed that is not a Finding or Finding_Group")
1839+
return None
1840+
1841+
1842+
def get_severity(findings):
1843+
max_number_severity = max(Finding.get_number_severity(find.severity) for find in findings)
1844+
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
@@ -870,6 +870,26 @@ def jira_change(obj):
870870
return jira_helper.get_jira_change(obj)
871871

872872

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

0 commit comments

Comments
 (0)