@@ -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
589589def 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-
984881class PackageRelatedVulnerabilityBase (models .Model ):
985882 """
986883 Abstract base class for package-vulnerability relations.
0 commit comments