Skip to content

Commit ffc6c72

Browse files
committed
Remove duplicate rows for CVSS
Signed-off-by: ziadhany <[email protected]>
1 parent 171c831 commit ffc6c72

File tree

6 files changed

+84
-21
lines changed

6 files changed

+84
-21
lines changed

vulnerabilities/importers/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
github.GitHubAPIImporter,
2525
nvd.NVDImporter,
2626
openssl.OpensslImporter,
27-
redhat.RedhatImporter,
27+
# redhat.RedhatImporter,
2828
pysec.PyPIImporter,
2929
debian.DebianImporter,
3030
gitlab.GitLabAPIImporter,
Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 4.0.7 on 2022-09-12 14:50
1+
# Generated by Django 4.0.7 on 2022-09-22 21:25
22

33
from django.db import migrations, models
44

@@ -15,9 +15,4 @@ class Migration(migrations.Migration):
1515
name='scoring_elements',
1616
field=models.CharField(help_text='Supporting a scoring elements as a string For example a CVSS vector Important, High, Medium ,Low.Typically used to compute the value', max_length=100, null=True),
1717
),
18-
migrations.AlterField(
19-
model_name='vulnerabilityseverity',
20-
name='value',
21-
field=models.CharField(help_text='Score Value expressed as a number such as 9.0 that can be sorted or compared', max_length=50),
22-
),
2318
]
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from django.db import migrations
2+
3+
from vulnerabilities.severity_systems import SCORING_SYSTEMS
4+
5+
6+
def compute_score(apps, schema_editor):
7+
Vuln_severity = apps.get_model('vulnerabilities', 'VulnerabilitySeverity')
8+
for vuln_severity in Vuln_severity.objects.all():
9+
if vuln_severity.value and not vuln_severity.scoring_elements:
10+
try:
11+
vuln_severity.scoring_elements = SCORING_SYSTEMS[vuln_severity.scoring_system].as_score(vuln_severity.value)
12+
vuln_severity.save()
13+
except NotImplementedError:
14+
pass
15+
16+
17+
class Migration(migrations.Migration):
18+
dependencies = [
19+
('vulnerabilities', '0028_vulnerabilityseverity_scoring_elements'),
20+
]
21+
22+
operations = [
23+
migrations.RunPython(compute_score),
24+
]
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from django.db import migrations
2+
3+
4+
def remove_extra_rows(apps, schema_editor):
5+
Vuln_severity = apps.get_model('vulnerabilities', 'VulnerabilitySeverity')
6+
for vuln_severity in Vuln_severity.objects.all():
7+
duplicated_row = None
8+
if vuln_severity.scoring_system == "cvssv2_vector":
9+
duplicated_row = Vuln_severity.objects.filter(reference_id=vuln_severity.reference_id,
10+
scoring_system="cvssv2",
11+
value=vuln_severity.scoring_elements)
12+
13+
elif vuln_severity.scoring_system == "cvssv3_vector":
14+
duplicated_row = Vuln_severity.objects.filter(reference_id=vuln_severity.reference_id,
15+
scoring_system="cvssv3",
16+
value=vuln_severity.scoring_elements)
17+
18+
elif vuln_severity.scoring_system == "cvssv3.1_vector":
19+
duplicated_row = Vuln_severity.objects.filter(reference_id=vuln_severity.reference_id,
20+
scoring_system="cvssv3.1",
21+
value=vuln_severity.scoring_elements)
22+
23+
if duplicated_row and duplicated_row.count() == 1:
24+
duplicated_row[0].delete()
25+
26+
27+
def swap_scoring_elements_with_value(apps, schema_editor):
28+
Vuln_severity = apps.get_model('vulnerabilities', 'VulnerabilitySeverity')
29+
for vuln_severity in Vuln_severity.objects.all():
30+
mapper_scoring_system = {
31+
"cvssv2_vector": "cvssv2",
32+
"cvssv3_vector": "cvssv3",
33+
"cvssv3.1_vector": "cvssv3.1",
34+
}
35+
if vuln_severity.scoring_system in ["cvssv2_vector", "cvssv3_vector", "cvssv3.1_vector"]:
36+
vuln_severity.scoring_system = mapper_scoring_system[vuln_severity.scoring_system]
37+
temp = vuln_severity.scoring_elements # value
38+
vuln_severity.scoring_elements = vuln_severity.value
39+
vuln_severity.value = temp
40+
vuln_severity.save()
41+
42+
43+
class Migration(migrations.Migration):
44+
dependencies = [
45+
('vulnerabilities', '0029_vulnerabilityserverity_compute_score'),
46+
]
47+
48+
operations = [
49+
migrations.RunPython(remove_extra_rows),
50+
migrations.RunPython(swap_scoring_elements_with_value),
51+
]

vulnerabilities/models.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -367,10 +367,12 @@ class VulnerabilitySeverity(models.Model):
367367
),
368368
)
369369

370-
value = models.CharField(
371-
max_length=50,
372-
help_text="Score Value expressed as a number such as 9.0 that can be sorted or compared",
373-
)
370+
# value = models.CharField(
371+
# max_length=50,
372+
# help_text="Score Value expressed as a number such as 9.0 that can be sorted or compared",
373+
# )
374+
375+
value = models.CharField(max_length=50, help_text="Example: 9.0, Important, High")
374376

375377
scoring_elements = models.CharField(
376378
max_length=100,
@@ -380,15 +382,6 @@ class VulnerabilitySeverity(models.Model):
380382
"Typically used to compute the value",
381383
)
382384

383-
def save(self, *args, **kwargs):
384-
super().save(*args, **kwargs)
385-
if not self.value and self.scoring_elements:
386-
try:
387-
self.value = SCORING_SYSTEMS[self.scoring_system].as_score(self.value)
388-
super().save(update_fields=["value"])
389-
except NotImplementedError:
390-
pass
391-
392385
class Meta:
393386
unique_together = ["reference", "scoring_system", "value"]
394387
ordering = ["reference", "scoring_system", "value"]

vulnerabilities/severity_systems.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def as_score(self, value) -> Decimal:
5252
c = CVSS3(value)
5353
return c.base_score
5454
else:
55-
raise NotImplementedError
55+
raise NotImplementedError("Can't compute a score")
5656

5757

5858
CVSSV2 = ScoringSystem(

0 commit comments

Comments
 (0)