1717
1818from django .db .models import Q
1919from django .db .models .query import QuerySet
20+ from fetchcode import package_versions
2021from packageurl import PackageURL
2122from univers .versions import NginxVersion
2223
4142from vulnerabilities .improver import Improver
4243from vulnerabilities .improver import Inference
4344from vulnerabilities .models import Advisory
44- from vulnerabilities .package_managers import GitHubTagsAPI
45- from vulnerabilities .package_managers import GoproxyVersionAPI
46- from vulnerabilities .package_managers import PackageVersion
47- from vulnerabilities .package_managers import VersionAPI
48- from vulnerabilities .package_managers import get_api_package_name
49- from vulnerabilities .package_managers import get_version_fetcher
5045from vulnerabilities .utils import AffectedPackage as LegacyAffectedPackage
5146from vulnerabilities .utils import clean_nginx_git_tag
5247from vulnerabilities .utils import evolve_purl
5853logger = logging .getLogger (__name__ )
5954
6055
61- @dataclasses .dataclass (order = True )
56+ @dataclasses .dataclass (order = True , init = False )
6257class ValidVersionImprover (Improver ):
6358 importer : Importer
6459 ignorable_versions : List [str ] = dataclasses .field (default_factory = list )
6560
66- def __init__ (self ) -> None :
67- self .versions_fetcher_by_purl : Mapping [str , VersionAPI ] = {}
68-
6961 @property
7062 def interesting_advisories (self ) -> QuerySet :
7163 return Advisory .objects .filter (Q (created_by = self .importer .qualified_name )).paginated ()
@@ -74,21 +66,16 @@ def get_package_versions(
7466 self , package_url : PackageURL , until : Optional [datetime ] = None
7567 ) -> List [str ]:
7668 """
77- Return a list of `valid_versions ` for the `package_url`
69+ Return a list of versions published before `until ` for the `package_url`
7870 """
79- api_name = get_api_package_name (package_url )
80- if not api_name :
81- logger .error (f"Could not get versions for { package_url !r} " )
82- return []
83- versions_fetcher = self .versions_fetcher_by_purl .get (package_url )
84- if not versions_fetcher :
85- versions_fetcher = get_version_fetcher (package_url )
86- self .versions_fetcher_by_purl [package_url ] = versions_fetcher ()
87-
88- versions_fetcher = self .versions_fetcher_by_purl [package_url ]
71+ versions = package_versions .versions (str (package_url ))
72+ versions_before_until = []
73+ for version in versions or []:
74+ if until and version .release_date and version .release_date > until :
75+ continue
76+ versions_before_until .append (version .value )
8977
90- self .versions_fetcher_by_purl [package_url ] = versions_fetcher
91- return versions_fetcher .get_until (package_name = api_name , until = until ).valid_versions
78+ return versions_before_until
9279
9380 def get_inferences (self , advisory_data : AdvisoryData ) -> Iterable [Inference ]:
9481 """
@@ -163,15 +150,6 @@ def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
163150 fixed_purl = fixed_purl ,
164151 )
165152 else :
166- if purl .type == "golang" :
167- # Problem with the Golang and Go that they provide full path
168- # FIXME: We need to get the PURL subpath for Go module
169- versions_fetcher = self .versions_fetcher_by_purl .get (purl )
170- if not versions_fetcher :
171- versions_fetcher = GoproxyVersionAPI ()
172- self .versions_fetcher_by_purl [purl ] = versions_fetcher
173- pkg_name = versions_fetcher .module_name_by_package_name .get (pkg_name , pkg_name )
174-
175153 valid_versions = self .get_package_versions (
176154 package_url = purl , until = advisory_data .date_published
177155 )
@@ -248,11 +226,10 @@ def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
248226 )
249227
250228 def get_inferences_from_versions (
251- self , advisory_data : AdvisoryData , all_versions : List [PackageVersion ]
229+ self , advisory_data : AdvisoryData , all_versions : List [str ]
252230 ) -> Iterable [Inference ]:
253231 """
254- Yield inferences given an ``advisory_data`` and a ``all_versions`` of
255- PackageVersion.
232+ Yield inferences given an ``advisory_data`` and a ``all_versions``.
256233 """
257234
258235 try :
@@ -268,9 +245,9 @@ def get_inferences_from_versions(
268245
269246 affected_purls = []
270247 for affected_version_range in affected_version_ranges :
271- for package_version in all_versions :
248+ for version in all_versions :
272249 # FIXME: we should reference an NginxVersion tbd in univers
273- version = NginxVersion (package_version . value )
250+ version = NginxVersion (version )
274251 if is_vulnerable_nginx_version (
275252 version = version ,
276253 affected_version_range = affected_version_range ,
@@ -294,12 +271,12 @@ def get_inferences_from_versions(
294271
295272 def fetch_nginx_version_from_git_tags (self ):
296273 """
297- Yield all nginx PackageVersion from its git tags.
274+ Yield all nginx version from its git tags.
298275 """
299- nginx_versions = GitHubTagsAPI (). fetch ( " nginx/nginx" )
300- for version in nginx_versions :
276+ nginx_versions = package_versions . versions ( "pkg:github/ nginx/nginx" )
277+ for version in nginx_versions or [] :
301278 cleaned = clean_nginx_git_tag (version .value )
302- yield PackageVersion ( value = cleaned , release_date = version . release_date )
279+ yield cleaned
303280
304281
305282class ApacheHTTPDImprover (ValidVersionImprover ):
0 commit comments