Skip to content

Commit e412d13

Browse files
committed
Fix tests
Signed-off-by: Tushar Goel <[email protected]>
1 parent 3d5f8d0 commit e412d13

File tree

14 files changed

+123
-274
lines changed

14 files changed

+123
-274
lines changed

vulnerabilities/api.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -619,10 +619,6 @@ def get_queryset(self):
619619
super()
620620
.get_queryset()
621621
.prefetch_related(
622-
# Prefetch(
623-
# "packages",
624-
# queryset=self.get_packages_qs(),
625-
# ),
626622
"weaknesses",
627623
Prefetch(
628624
"fixed_by_packages",

vulnerabilities/api_extension.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,6 @@ class Meta:
238238
"qualifiers",
239239
"subpath",
240240
"purl",
241-
# this hurts
242-
"packagerelatedvulnerability__fix",
243241
]
244242

245243
def filter_purl(self, queryset, name, value):

vulnerabilities/import_runner.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
from vulnerabilities.improver import Inference
2222
from vulnerabilities.improvers.default import DefaultImporter
2323
from vulnerabilities.models import Advisory
24+
from vulnerabilities.models import AffectedByPackageRelatedVulnerability
2425
from vulnerabilities.models import Alias
26+
from vulnerabilities.models import FixingPackageRelatedVulnerability
2527
from vulnerabilities.models import Package
2628
from vulnerabilities.models import Vulnerability
2729
from vulnerabilities.models import VulnerabilityChangeLog

vulnerabilities/improve_runner.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@
1717
from vulnerabilities.importers import IMPORTERS_REGISTRY
1818
from vulnerabilities.improver import Inference
1919
from vulnerabilities.models import Advisory
20+
from vulnerabilities.models import AffectedByPackageRelatedVulnerability
2021
from vulnerabilities.models import Alias
22+
from vulnerabilities.models import FixingPackageRelatedVulnerability
2123
from vulnerabilities.models import Package
22-
from vulnerabilities.models import PackageRelatedVulnerability
2324
from vulnerabilities.models import Vulnerability
2425
from vulnerabilities.models import VulnerabilityChangeLog
2526
from vulnerabilities.models import VulnerabilityReference
@@ -148,12 +149,11 @@ def process_inferences(
148149
fixed_package, created = Package.objects.get_or_create_from_purl(
149150
purl=inference.fixed_purl
150151
)
151-
PackageRelatedVulnerability(
152+
FixingPackageRelatedVulnerability(
152153
vulnerability=vulnerability,
153154
package=fixed_package,
154155
created_by=improver_name,
155156
confidence=inference.confidence,
156-
fix=True,
157157
).update_or_create(
158158
advisory=advisory,
159159
)

vulnerabilities/management/commands/export.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ def export_data(self, base_path: Path):
116116
}
117117
package_vulnerabilities.append(package_data)
118118

119-
for vuln in pkg_version.vulnerabilities.all():
119+
for vuln in pkg_version.vulnerabilities:
120120
vcid = vuln.vulnerability_id
121121
# do not write twice the same file
122122
if vcid in seen_vcid:
@@ -158,10 +158,14 @@ def packages_by_type_ns_name():
158158
qs = (
159159
Package.objects.order_by("type", "namespace", "name", "version")
160160
.prefetch_related(
161-
"vulnerabilities",
162-
"vulnerabilities__references",
163-
"vulnerabilities__weaknesses",
164-
"vulnerabilities__references__vulnerabilityseverity_set",
161+
"affected_by_vulnerabilities",
162+
"affected_by_vulnerabilities__references",
163+
"affected_by_vulnerabilities__weaknesses",
164+
"affected_by_vulnerabilities__references__vulnerabilityseverity_set",
165+
"fixing_vulnerabilities",
166+
"fixing_vulnerabilities__references",
167+
"fixing_vulnerabilities__weaknesses",
168+
"fixing_vulnerabilities__references__vulnerabilityseverity_set",
165169
)
166170
.paginated()
167171
)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Generated by Django 4.2.15 on 2024-10-15 10:37
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("vulnerabilities", "0072_remove_package_vulnerabilities_and_more"),
10+
]
11+
12+
operations = [
13+
migrations.DeleteModel(
14+
name="PackageRelatedVulnerability",
15+
),
16+
]

vulnerabilities/models.py

Lines changed: 14 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def affecting_vulnerabilities(self):
8787
"""
8888
Return a queryset of Vulnerability that affect a package.
8989
"""
90-
return self.filter(packagerelatedvulnerability__fix=False)
90+
return self.filter(affecting_packages__isnull=False)
9191

9292
def with_cpes(self):
9393
"""
@@ -187,12 +187,6 @@ class Vulnerability(models.Model):
187187
to="VulnerabilityReference", through="VulnerabilityRelatedReference"
188188
)
189189

190-
# packages = models.ManyToManyField(
191-
# to="Package",
192-
# through="PackageRelatedVulnerability",
193-
# related_name="all_vulnerabilities",
194-
# )
195-
196190
affecting_packages = models.ManyToManyField(
197191
to="Package",
198192
through="AffectedByPackageRelatedVulnerability",
@@ -452,7 +446,7 @@ def get_fixed_by_package_versions(self, purl: PackageURL, fix=True):
452446
}
453447

454448
if fix:
455-
filter_dict["packagerelatedvulnerability__fix"] = True
449+
filter_dict["fixing_vulnerabilities__isnull"] = False
456450

457451
return Package.objects.filter(**filter_dict).distinct()
458452

@@ -474,15 +468,15 @@ def affected(self):
474468
"""
475469
Return only packages affected by a vulnerability.
476470
"""
477-
return self.filter(packagerelatedvulnerability__fix=False)
471+
return self.filter(affected_by_vulnerabilities__isnull=False)
478472

479473
vulnerable = affected
480474

481475
def fixing(self):
482476
"""
483477
Return only packages fixing a vulnerability .
484478
"""
485-
return self.filter(packagerelatedvulnerability__fix=True)
479+
return self.filter(fixing_vulnerabilities__isnull=False)
486480

487481
def with_vulnerability_counts(self):
488482
return self.annotate(
@@ -585,6 +579,12 @@ def _vulnerable(self, vulnerable=True):
585579
"""
586580
return self.with_is_vulnerable().filter(is_vulnerable=vulnerable)
587581

582+
def vulnerable(self):
583+
"""
584+
Return only packages that are vulnerable.
585+
"""
586+
return self.filter(affected_by_vulnerabilities__isnull=False)
587+
588588

589589
def get_purl_query_lookups(purl):
590590
"""
@@ -606,12 +606,6 @@ class Package(PackageURLMixin):
606606
# https://github.com/package-url/packageurl-python/pull/67
607607
# gets merged
608608

609-
# vulnerabilities = models.ManyToManyField(
610-
# to="Vulnerability",
611-
# through="PackageRelatedVulnerability",
612-
# related_name="all_packages",
613-
# )
614-
615609
affected_by_vulnerabilities = models.ManyToManyField(
616610
to="Vulnerability",
617611
through="AffectedByPackageRelatedVulnerability",
@@ -751,6 +745,10 @@ def next_non_vulnerable_version(self):
751745
next_non_vulnerable, _ = self.get_non_vulnerable_versions()
752746
return next_non_vulnerable.version if next_non_vulnerable else None
753747

748+
@property
749+
def vulnerabilities(self):
750+
return self.affected_by_vulnerabilities.all() | self.fixing_vulnerabilities.all()
751+
754752
@property
755753
def latest_non_vulnerable_version(self):
756754
"""
@@ -880,107 +878,6 @@ def affecting_vulns(self):
880878
)
881879

882880

883-
class PackageRelatedVulnerability(models.Model):
884-
"""
885-
Track the relationship between a Package and Vulnerability.
886-
"""
887-
888-
# TODO: Fix related_name
889-
package = models.ForeignKey(
890-
Package,
891-
on_delete=models.CASCADE,
892-
)
893-
894-
vulnerability = models.ForeignKey(
895-
Vulnerability,
896-
on_delete=models.CASCADE,
897-
)
898-
899-
created_by = models.CharField(
900-
max_length=100,
901-
blank=True,
902-
help_text="Fully qualified name of the improver prefixed with the"
903-
"module name responsible for creating this relation. Eg:"
904-
"vulnerabilities.importers.nginx.NginxBasicImprover",
905-
)
906-
907-
from vulnerabilities.improver import MAX_CONFIDENCE
908-
909-
confidence = models.PositiveIntegerField(
910-
default=MAX_CONFIDENCE,
911-
validators=[MinValueValidator(0), MaxValueValidator(MAX_CONFIDENCE)],
912-
help_text="Confidence score for this relation",
913-
)
914-
915-
fix = models.BooleanField(
916-
default=False,
917-
db_index=True,
918-
help_text="Does this relation fix the specified vulnerability ?",
919-
)
920-
921-
class Meta:
922-
unique_together = ["package", "vulnerability"]
923-
verbose_name_plural = "PackageRelatedVulnerabilities"
924-
indexes = [models.Index(fields=["fix"])]
925-
ordering = ["package", "vulnerability"]
926-
927-
def __str__(self):
928-
return f"{self.package.package_url} {self.vulnerability.vulnerability_id}"
929-
930-
def update_or_create(self, advisory):
931-
"""
932-
Update if supplied record has more confidence than existing record
933-
Create if doesn't exist
934-
"""
935-
try:
936-
existing = PackageRelatedVulnerability.objects.get(
937-
vulnerability=self.vulnerability, package=self.package
938-
)
939-
if self.confidence > existing.confidence:
940-
existing.created_by = self.created_by
941-
existing.confidence = self.confidence
942-
existing.fix = self.fix
943-
existing.save()
944-
# TODO: later we want these to be part of a log field in the DB
945-
logger.info(
946-
f"Confidence improved for {self.package} R {self.vulnerability}, "
947-
f"new confidence: {self.confidence}"
948-
)
949-
self.add_package_vulnerability_changelog(advisory=advisory)
950-
951-
except self.DoesNotExist:
952-
PackageRelatedVulnerability.objects.create(
953-
vulnerability=self.vulnerability,
954-
created_by=self.created_by,
955-
package=self.package,
956-
confidence=self.confidence,
957-
fix=self.fix,
958-
)
959-
960-
logger.info(
961-
f"New relationship {self.package} R {self.vulnerability}, "
962-
f"fix: {self.fix}, confidence: {self.confidence}"
963-
)
964-
965-
self.add_package_vulnerability_changelog(advisory=advisory)
966-
967-
@transaction.atomic
968-
def add_package_vulnerability_changelog(self, advisory):
969-
from vulnerabilities.utils import get_importer_name
970-
971-
importer_name = get_importer_name(advisory)
972-
if self.fix:
973-
change_logger = PackageChangeLog.log_fixing
974-
else:
975-
change_logger = PackageChangeLog.log_affected_by
976-
change_logger(
977-
package=self.package,
978-
importer=importer_name,
979-
source_url=advisory.url or None,
980-
related_vulnerability=str(self.vulnerability),
981-
)
982-
983-
984881
class PackageRelatedVulnerabilityBase(models.Model):
985882
"""
986883
Abstract base class for package-vulnerability relations.

0 commit comments

Comments
 (0)