From c59ba692b8e88b86e85b052d72dcf1d1f2f0bb86 Mon Sep 17 00:00:00 2001 From: Cody Maffucci <46459665+Maffooch@users.noreply.github.com> Date: Thu, 15 Feb 2024 14:25:33 -0600 Subject: [PATCH] Deduplication: Do not reopen original finding --- dojo/utils.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/dojo/utils.py b/dojo/utils.py index 135d341e54f..fe17b240d22 100644 --- a/dojo/utils.py +++ b/dojo/utils.py @@ -483,14 +483,19 @@ def deduplicate_uid_or_hash_code(new_finding): def set_duplicate(new_finding, existing_finding): + deduplicationLogger.debug(f"new_finding.status(): {new_finding.id} {new_finding.status()}") + deduplicationLogger.debug(f"existing_finding.status(): {existing_finding.id} {existing_finding.status()}") if existing_finding.duplicate: - logger.debug('existing finding: %s:%s:duplicate=%s;duplicate_finding=%s', existing_finding.id, existing_finding.title, existing_finding.duplicate, existing_finding.duplicate_finding.id if existing_finding.duplicate_finding else 'None') + deduplicationLogger.debug('existing finding: %s:%s:duplicate=%s;duplicate_finding=%s', existing_finding.id, existing_finding.title, existing_finding.duplicate, existing_finding.duplicate_finding.id if existing_finding.duplicate_finding else 'None') raise Exception("Existing finding is a duplicate") if existing_finding.id == new_finding.id: raise Exception("Can not add duplicate to itself") - deduplicationLogger.debug('Setting new finding ' + str(new_finding.id) + ' as a duplicate of existing finding ' + str(existing_finding.id)) if is_duplicate_reopen(new_finding, existing_finding): - set_duplicate_reopen(new_finding, existing_finding) + raise Exception("Found a regression. Ignore this so that a new duplicate chain can be made") + if new_finding.duplicate and finding_mitigated(existing_finding): + raise Exception("Skip this finding as we do not want to attach a new duplicate to a mitigated finding") + + deduplicationLogger.debug('Setting new finding ' + str(new_finding.id) + ' as a duplicate of existing finding ' + str(existing_finding.id)) new_finding.duplicate = True new_finding.active = False new_finding.verified = False @@ -509,11 +514,16 @@ def set_duplicate(new_finding, existing_finding): super(Finding, existing_finding).save() -def is_duplicate_reopen(new_finding, existing_finding): - if (existing_finding.is_mitigated or existing_finding.mitigated) and not existing_finding.out_of_scope and not existing_finding.false_p and new_finding.active and not new_finding.is_mitigated: - return True - else: - return False +def is_duplicate_reopen(new_finding, existing_finding) -> bool: + return finding_mitigated(existing_finding) and finding_not_human_set_status(existing_finding) and not finding_mitigated(new_finding) + + +def finding_mitigated(finding: Finding) -> bool: + return finding.active is False and (finding.is_mitigated is True or finding.mitigated is not None) + + +def finding_not_human_set_status(finding: Finding) -> bool: + return finding.out_of_scope is False and finding.false_p is False def set_duplicate_reopen(new_finding, existing_finding):