Skip to content

Commit 30fc2b8

Browse files
committed
Add new models
Signed-off-by: Tushar Goel <[email protected]>
1 parent d1f4c74 commit 30fc2b8

11 files changed

+324
-68
lines changed

vulnerabilities/admin.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
from vulnerabilities.models import ApiUser
1515
from vulnerabilities.models import Package
16-
from vulnerabilities.models import PackageRelatedVulnerability
1716
from vulnerabilities.models import Vulnerability
1817
from vulnerabilities.models import VulnerabilityReference
1918
from vulnerabilities.models import VulnerabilitySeverity
@@ -35,12 +34,6 @@ class PackageAdmin(admin.ModelAdmin):
3534
search_fields = ["name"]
3635

3736

38-
@admin.register(PackageRelatedVulnerability)
39-
class PackageRelatedVulnerabilityAdmin(admin.ModelAdmin):
40-
list_filter = ("package__type", "package__namespace")
41-
search_fields = ["vulnerability__vulnerability_id", "package__name"]
42-
43-
4437
@admin.register(VulnerabilitySeverity)
4538
class VulnerabilitySeverityAdmin(admin.ModelAdmin):
4639
pass

vulnerabilities/api.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ def get_fixed_packages(self, package):
287287
type=package.type,
288288
qualifiers=package.qualifiers,
289289
subpath=package.subpath,
290-
packagerelatedvulnerability__fix=True,
290+
fixingpackagerelatedvulnerability__isnull=False,
291291
)
292292
.with_is_vulnerable()
293293
.distinct()
@@ -300,10 +300,13 @@ def get_vulnerabilities_for_a_package(self, package, fix) -> dict:
300300
otherwise return vulnerabilities fixed by the `package`.
301301
"""
302302
fixed_packages = self.get_fixed_packages(package=package)
303-
qs = package.vulnerabilities.filter(packagerelatedvulnerability__fix=fix)
303+
if fix:
304+
qs = package.affected_by_vulnerabilities.all()
305+
else:
306+
qs = package.fixing_vulnerabilities.all()
304307
qs = qs.prefetch_related(
305308
Prefetch(
306-
"packages",
309+
"fixed_by_packages",
307310
queryset=fixed_packages,
308311
to_attr="filtered_fixed_packages",
309312
)
@@ -372,7 +375,6 @@ class Meta:
372375
"qualifiers",
373376
"subpath",
374377
"purl",
375-
"packagerelatedvulnerability__fix",
376378
]
377379

378380
def filter_purl(self, queryset, name, value):
@@ -590,7 +592,7 @@ def get_fixed_packages_qs(self):
590592
Filter the packages that fixes a vulnerability
591593
on fields like name, namespace and type.
592594
"""
593-
return self.get_packages_qs().filter(packagerelatedvulnerability__fix=True)
595+
return self.get_packages_qs().filter(fixingpackagerelatedvulnerability__isnull=False).with_is_vulnerable()
594596

595597
def get_packages_qs(self):
596598
"""
@@ -613,16 +615,16 @@ def get_queryset(self):
613615
super()
614616
.get_queryset()
615617
.prefetch_related(
616-
Prefetch(
617-
"packages",
618-
queryset=self.get_packages_qs(),
619-
),
618+
# Prefetch(
619+
# "packages",
620+
# queryset=self.get_packages_qs(),
621+
# ),
620622
"weaknesses",
621-
Prefetch(
622-
"packages",
623-
queryset=self.get_fixed_packages_qs(),
624-
to_attr="filtered_fixed_packages",
625-
),
623+
# Prefetch(
624+
# "fixed_by_packages",
625+
# queryset=self.get_fixed_packages_qs(),
626+
# to_attr="filtered_fixed_packages",
627+
# ),
626628
)
627629
)
628630

vulnerabilities/import_runner.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
from vulnerabilities.models import Advisory
2424
from vulnerabilities.models import Alias
2525
from vulnerabilities.models import Package
26-
from vulnerabilities.models import PackageRelatedVulnerability
2726
from vulnerabilities.models import Vulnerability
2827
from vulnerabilities.models import VulnerabilityChangeLog
2928
from vulnerabilities.models import VulnerabilityReference
@@ -211,22 +210,20 @@ def process_inferences(inferences: List[Inference], advisory: Advisory, improver
211210

212211
for affected_purl in inference.affected_purls or []:
213212
vulnerable_package, _ = Package.objects.get_or_create_from_purl(purl=affected_purl)
214-
PackageRelatedVulnerability(
213+
AffectedByPackageRelatedVulnerability(
215214
vulnerability=vulnerability,
216215
package=vulnerable_package,
217216
created_by=improver_name,
218217
confidence=inference.confidence,
219-
fix=False,
220218
).update_or_create(advisory=advisory)
221219

222220
if inference.fixed_purl:
223221
fixed_package, _ = Package.objects.get_or_create_from_purl(purl=inference.fixed_purl)
224-
PackageRelatedVulnerability(
222+
FixingPackageRelatedVulnerability(
225223
vulnerability=vulnerability,
226224
package=fixed_package,
227225
created_by=improver_name,
228226
confidence=inference.confidence,
229-
fix=True,
230227
).update_or_create(advisory=advisory)
231228

232229
if inference.weaknesses and vulnerability:

vulnerabilities/improve_runner.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,11 @@ def process_inferences(
135135
vulnerable_package, created = Package.objects.get_or_create_from_purl(
136136
purl=affected_purl
137137
)
138-
PackageRelatedVulnerability(
138+
AffectedByPackageRelatedVulnerability(
139139
vulnerability=vulnerability,
140140
package=vulnerable_package,
141141
created_by=improver_name,
142142
confidence=inference.confidence,
143-
fix=False,
144143
).update_or_create(
145144
advisory=advisory,
146145
)
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
from django.db import migrations, models
2+
import django.db.models.deletion
3+
from django.core.validators import MaxValueValidator, MinValueValidator
4+
from vulnerabilities.improver import MAX_CONFIDENCE
5+
6+
def split_packagerelatedvulnerability(apps, schema_editor):
7+
PackageRelatedVulnerability = apps.get_model('vulnerabilities', 'PackageRelatedVulnerability')
8+
FixingPackageRelatedVulnerability = apps.get_model('vulnerabilities', 'FixingPackageRelatedVulnerability')
9+
AffectedByPackageRelatedVulnerability = apps.get_model('vulnerabilities', 'AffectedByPackageRelatedVulnerability')
10+
11+
for prv in PackageRelatedVulnerability.objects.all():
12+
if prv.fix:
13+
FixingPackageRelatedVulnerability.objects.create(
14+
package=prv.package,
15+
vulnerability=prv.vulnerability,
16+
created_by=prv.created_by,
17+
confidence=prv.confidence,
18+
)
19+
else:
20+
AffectedByPackageRelatedVulnerability.objects.create(
21+
package=prv.package,
22+
vulnerability=prv.vulnerability,
23+
created_by=prv.created_by,
24+
confidence=prv.confidence,
25+
)
26+
27+
def reverse_migration(apps, schema_editor):
28+
FixingPackageRelatedVulnerability = apps.get_model('vulnerabilities', 'FixingPackageRelatedVulnerability')
29+
AffectedByPackageRelatedVulnerability = apps.get_model('vulnerabilities', 'AffectedByPackageRelatedVulnerability')
30+
PackageRelatedVulnerability = apps.get_model('vulnerabilities', 'PackageRelatedVulnerability')
31+
32+
for fpv in FixingPackageRelatedVulnerability.objects.all():
33+
PackageRelatedVulnerability.objects.create(
34+
package=fpv.package,
35+
vulnerability=fpv.vulnerability,
36+
created_by=fpv.created_by,
37+
confidence=fpv.confidence,
38+
fix=True,
39+
)
40+
41+
for apv in AffectedByPackageRelatedVulnerability.objects.all():
42+
PackageRelatedVulnerability.objects.create(
43+
package=apv.package,
44+
vulnerability=apv.vulnerability,
45+
created_by=apv.created_by,
46+
confidence=apv.confidence,
47+
fix=False,
48+
)
49+
50+
class Migration(migrations.Migration):
51+
52+
dependencies = [
53+
("vulnerabilities", "0070_alter_advisory_created_by_and_more"),
54+
]
55+
56+
operations = [
57+
migrations.RunPython(split_packagerelatedvulnerability, reverse_migration),
58+
]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Generated by Django 4.2.15 on 2024-10-07 10:52
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("vulnerabilities", "0071_auto_20241007_1044"),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name="package",
15+
name="vulnerabilities",
16+
),
17+
]
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 4.2.15 on 2024-10-07 10:53
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("vulnerabilities", "0072_remove_package_vulnerabilities"),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name="vulnerability",
15+
name="packages",
16+
),
17+
migrations.AddField(
18+
model_name="vulnerability",
19+
name="affecting_packages",
20+
field=models.ManyToManyField(
21+
related_name="affected_by_vulnerabilities",
22+
through="vulnerabilities.AffectedByPackageRelatedVulnerability",
23+
to="vulnerabilities.package",
24+
),
25+
),
26+
]
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Generated by Django 4.2.15 on 2024-10-07 11:09
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("vulnerabilities", "0073_remove_vulnerability_packages_and_more"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="vulnerability",
15+
name="fixed_by_packages",
16+
field=models.ManyToManyField(
17+
related_name="fixing_vulnerabilities",
18+
through="vulnerabilities.FixingPackageRelatedVulnerability",
19+
to="vulnerabilities.package",
20+
),
21+
),
22+
]
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Generated by Django 4.2.15 on 2024-10-07 11:39
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("vulnerabilities", "0074_vulnerability_fixed_by_packages"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="package",
15+
name="affected_by_vulnerabilities",
16+
field=models.ManyToManyField(
17+
through="vulnerabilities.AffectedByPackageRelatedVulnerability",
18+
to="vulnerabilities.vulnerability",
19+
),
20+
),
21+
migrations.AlterField(
22+
model_name="vulnerability",
23+
name="affecting_packages",
24+
field=models.ManyToManyField(
25+
through="vulnerabilities.AffectedByPackageRelatedVulnerability",
26+
to="vulnerabilities.package",
27+
),
28+
),
29+
]

0 commit comments

Comments
 (0)