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
@@ -63,8 +58,8 @@ class 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 ] = {}
61+ def __init__ (self ):
62+ pass
6863
6964 @property
7065 def interesting_advisories (self ) -> QuerySet :
@@ -74,21 +69,16 @@ def get_package_versions(
7469 self , package_url : PackageURL , until : Optional [datetime ] = None
7570 ) -> List [str ]:
7671 """
77- Return a list of `valid_versions ` for the `package_url`
72+ Return a list of versions published before `until ` for the `package_url`
7873 """
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 ]
74+ versions = package_versions .versions (str (package_url ))
75+ versions_before_until = set ()
76+ for version in versions :
77+ if until and version .release_date and version .release_date > until :
78+ continue
79+ versions_before_until .add (version .value )
8980
90- self .versions_fetcher_by_purl [package_url ] = versions_fetcher
91- return versions_fetcher .get_until (package_name = api_name , until = until ).valid_versions
81+ return versions_before_until
9282
9383 def get_inferences (self , advisory_data : AdvisoryData ) -> Iterable [Inference ]:
9484 """
@@ -248,11 +238,10 @@ def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
248238 )
249239
250240 def get_inferences_from_versions (
251- self , advisory_data : AdvisoryData , all_versions : List [PackageVersion ]
241+ self , advisory_data : AdvisoryData , all_versions : List [str ]
252242 ) -> Iterable [Inference ]:
253243 """
254- Yield inferences given an ``advisory_data`` and a ``all_versions`` of
255- PackageVersion.
244+ Yield inferences given an ``advisory_data`` and a ``all_versions``.
256245 """
257246
258247 try :
@@ -268,9 +257,9 @@ def get_inferences_from_versions(
268257
269258 affected_purls = []
270259 for affected_version_range in affected_version_ranges :
271- for package_version in all_versions :
260+ for version in all_versions :
272261 # FIXME: we should reference an NginxVersion tbd in univers
273- version = NginxVersion (package_version . value )
262+ version = NginxVersion (version )
274263 if is_vulnerable_nginx_version (
275264 version = version ,
276265 affected_version_range = affected_version_range ,
@@ -294,12 +283,12 @@ def get_inferences_from_versions(
294283
295284 def fetch_nginx_version_from_git_tags (self ):
296285 """
297- Yield all nginx PackageVersion from its git tags.
286+ Yield all nginx version from its git tags.
298287 """
299- nginx_versions = GitHubTagsAPI (). fetch ( " nginx/nginx" )
288+ nginx_versions = package_versions . versions ( "pkg:github/ nginx/nginx" )
300289 for version in nginx_versions :
301290 cleaned = clean_nginx_git_tag (version .value )
302- yield PackageVersion ( value = cleaned , release_date = version . release_date )
291+ yield cleaned
303292
304293
305294class ApacheHTTPDImprover (ValidVersionImprover ):
0 commit comments