2020# VulnerableCode is a free software code scanning tool from nexB Inc. and others.
2121# Visit https://github.com/nexB/vulnerablecode/ for support and download.
2222
23- import pickle
2423import dataclasses
2524import logging
2625import os
4746from vulnerabilities .oval_parser import OvalParser
4847from vulnerabilities .severity_systems import ScoringSystem
4948from vulnerabilities .helpers import is_cve
49+ from vulnerabilities .helpers import nearest_patched_package
50+ from vulnerabilities .helpers import AffectedPackage
5051
5152logger = logging .getLogger (__name__ )
5253
@@ -87,17 +88,14 @@ class Advisory:
8788
8889 summary : str
8990 vulnerability_id : Optional [str ] = None
90- impacted_package_urls : Iterable [PackageURL ] = dataclasses .field (default_factory = list )
91- resolved_package_urls : Iterable [PackageURL ] = dataclasses .field (default_factory = list )
91+ affected_packages : List [AffectedPackage ] = dataclasses .field (default_factory = list )
9292 references : List [Reference ] = dataclasses .field (default_factory = list )
9393
9494 def __post_init__ (self ):
9595 if self .vulnerability_id and not is_cve (self .vulnerability_id ):
9696 raise ValueError ("CVE expected, found: {}" .format (self .vulnerability_id ))
9797
9898 def normalized (self ):
99- impacted_package_urls = {package_url for package_url in self .impacted_package_urls }
100- resolved_package_urls = {package_url for package_url in self .resolved_package_urls }
10199 references = sorted (
102100 self .references , key = lambda reference : (reference .reference_id , reference .url )
103101 )
@@ -107,8 +105,7 @@ def normalized(self):
107105 return Advisory (
108106 summary = self .summary ,
109107 vulnerability_id = self .vulnerability_id ,
110- impacted_package_urls = impacted_package_urls ,
111- resolved_package_urls = resolved_package_urls ,
108+ affected_packages = sorted (self .affected_packages ),
112109 references = references ,
113110 )
114111
@@ -531,9 +528,8 @@ def get_data_from_xml_doc(self, xml_doc: ET.ElementTree, pkg_metadata={}) -> Lis
531528 # connected/linked to an OvalDefinition
532529 vuln_id = definition_data ["vuln_id" ]
533530 description = definition_data ["description" ]
534- affected_purls = set ()
535- safe_purls = set ()
536531 references = [Reference (url = url ) for url in definition_data ["reference_urls" ]]
532+ affected_packages = []
537533 for test_data in definition_data ["test_data" ]:
538534 for package_name in test_data ["package_list" ]:
539535 if package_name and len (package_name ) >= 50 :
@@ -552,35 +548,31 @@ def get_data_from_xml_doc(self, xml_doc: ET.ElementTree, pkg_metadata={}) -> Lis
552548 # FIXME: we should not drop data this way
553549 # This filter is for filtering out long versions.
554550 # 50 is limit because that's what db permits atm.
555- all_versions = set ( filter ( lambda x : len (x ) < 50 , all_versions ))
551+ all_versions = [ version for version in all_versions if len (version ) < 50 ]
556552 if not all_versions :
557553 continue
558- affected_versions = set (
559- filter (lambda x : version_class (x ) in affected_version_range , all_versions )
560- )
561- safe_versions = all_versions - affected_versions
562554
563- for version in affected_versions :
555+ affected_purls = []
556+ safe_purls = []
557+ for version in all_versions :
564558 purl = self .create_purl (
565559 pkg_name = package_name ,
566560 pkg_version = version ,
567561 pkg_data = pkg_metadata ,
568562 )
569- affected_purls .add (purl )
563+ if version_class (version ) in affected_version_range :
564+ affected_purls .append (purl )
565+ else :
566+ safe_purls .append (purl )
570567
571- for version in safe_versions :
572- purl = self .create_purl (
573- pkg_name = package_name ,
574- pkg_version = version ,
575- pkg_data = pkg_metadata ,
576- )
577- safe_purls .add (purl )
568+ affected_packages .extend (
569+ nearest_patched_package (affected_purls , safe_purls ),
570+ )
578571
579572 all_adv .append (
580573 Advisory (
581574 summary = description ,
582- impacted_package_urls = affected_purls ,
583- resolved_package_urls = safe_purls ,
575+ affected_packages = affected_packages ,
584576 vulnerability_id = vuln_id ,
585577 references = references ,
586578 )
0 commit comments