Skip to content

Commit 33f60a4

Browse files
authored
Merge pull request DefectDojo#1508 from Maffooch/dedupe
Return dedupe to a "working" state
2 parents b955457 + 848fbab commit 33f60a4

File tree

2 files changed

+52
-5
lines changed

2 files changed

+52
-5
lines changed

dojo/api_v2/serializers.py

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
Notes, DojoMeta, FindingImage
77
from dojo.forms import ImportScanForm, SEVERITY_CHOICES
88
from dojo.tools.factory import import_parser_factory
9+
from dojo.utils import create_notification
10+
from django.urls import reverse
11+
from tagging.models import Tag
912
from django.core.validators import URLValidator, validate_ipv46_address
1013
from django.conf import settings
1114
from rest_framework import serializers
@@ -516,12 +519,10 @@ class ImportScanSerializer(TaggitSerializer, serializers.Serializer):
516519
default=None,
517520
queryset=User.objects.all())
518521
tags = TagListSerializerField(required=False)
519-
skip_duplicates = serializers.BooleanField(required=False, default=False)
520522
close_old_findings = serializers.BooleanField(required=False, default=False)
521523

522524
def save(self):
523525
data = self.validated_data
524-
skip_duplicates = data['skip_duplicates']
525526
close_old_findings = data['close_old_findings']
526527
active = data['active']
527528
verified = data['verified']
@@ -614,6 +615,52 @@ def save(self):
614615
except SyntaxError:
615616
raise Exception('Parser SyntaxError')
616617

618+
if close_old_findings:
619+
# Close old active findings that are not reported by this scan.
620+
new_hash_codes = test.finding_set.values('hash_code')
621+
622+
old_findings = None
623+
if test.engagement.deduplication_on_engagement:
624+
old_findings = Finding.objects.exclude(test=test) \
625+
.exclude(hash_code__in=new_hash_codes) \
626+
.exclude(hash_code__in=skipped_hashcodes) \
627+
.filter(test__engagement=test.engagement,
628+
test__test_type=test_type,
629+
active=True)
630+
else:
631+
old_findings = Finding.objects.exclude(test=test) \
632+
.exclude(hash_code__in=new_hash_codes) \
633+
.exclude(hash_code__in=skipped_hashcodes) \
634+
.filter(test__engagement__product=test.engagement.product,
635+
test__test_type=test_type,
636+
active=True)
637+
638+
for old_finding in old_findings:
639+
old_finding.active = False
640+
old_finding.mitigated = datetime.datetime.combine(
641+
test.target_start,
642+
timezone.now().time())
643+
if settings.USE_TZ:
644+
old_finding.mitigated = timezone.make_aware(
645+
old_finding.mitigated,
646+
timezone.get_default_timezone())
647+
old_finding.mitigated_by = self.context['request'].user
648+
old_finding.notes.create(author=self.context['request'].user,
649+
entry="This finding has been automatically closed"
650+
" as it is not present anymore in recent scans.")
651+
Tag.objects.add_tag(old_finding, 'stale')
652+
old_finding.save()
653+
title = 'An old finding has been closed for "{}".' \
654+
.format(test.engagement.product.name)
655+
description = 'See <a href="{}">{}</a>' \
656+
.format(reverse('view_finding', args=(old_finding.id, )),
657+
old_finding.title)
658+
create_notification(event='other',
659+
title=title,
660+
description=description,
661+
icon='bullseye',
662+
objowner=self.context['request'].user)
663+
617664
return test
618665

619666
def validate_scan_data(self, value):

dojo/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1374,16 +1374,16 @@ def save(self, dedupe_option=True, false_history=False, rules_option=True, *args
13741374
else:
13751375
super(Finding, self).save(*args, **kwargs)
13761376

1377-
if (self.line is not None and self.file_path is not None) and (self.endpoints.count() == 0):
1377+
if (self.file_path is not None) and (self.endpoints.count() == 0):
13781378
self.static_finding = True
13791379
self.dynamic_finding = False
1380-
elif (self.line is not None and self.file_path is not None):
1380+
elif (self.file_path is not None):
13811381
self.static_finding = True
13821382

13831383
# Compute hash code before dedupe
13841384
if (self.hash_code is None):
13851385
if((self.dynamic_finding and (self.endpoints.count() > 0)) or
1386-
(self.static_finding and (self.line is not None and self.file_path is not None))):
1386+
(self.static_finding and (self.file_path is not None))):
13871387
self.hash_code = self.compute_hash_code()
13881388
self.found_by.add(self.test.test_type)
13891389

0 commit comments

Comments
 (0)