1212from typing import List
1313
1414import requests
15- from fetchcode .package_versions import versions
1615from packageurl import PackageURL
17- from univers .version_range import PypiVersionRange
18- from univers .versions import PypiVersion
1916
2017from vulntotal .validator import DataSource
2118from vulntotal .validator import InvalidCVEError
@@ -53,8 +50,7 @@ def datasource_advisory(self, purl) -> Iterable[VendorData]:
5350 return []
5451 advisory = self .fetch_advisory ()
5552 self ._raw_dump .append (advisory )
56- self ._versions = sorted ([PypiVersion (ver .value ) for ver in versions (str (purl ))])
57- return parse_advisory (advisory , purl , self ._versions )
53+ return parse_advisory (advisory , purl )
5854
5955 def datasource_advisory_from_cve (self , cve : str ) -> Iterable [VendorData ]:
6056 if not cve .upper ().startswith ("CVE-" ):
@@ -65,13 +61,10 @@ def datasource_advisory_from_cve(self, cve: str) -> Iterable[VendorData]:
6561
6662 @classmethod
6763 def supported_ecosystem (cls ):
68- # source - @TODO
6964 return {"pypi" : "PyPI" }
7065
7166
72- def parse_advisory (
73- response , purl : PackageURL , all_versions : List [PypiVersion ]
74- ) -> Iterable [VendorData ]:
67+ def parse_advisory (response , purl : PackageURL ) -> Iterable [VendorData ]:
7568 """
7669 Parse response from safetydb API and yield VendorData
7770
@@ -83,14 +76,11 @@ def parse_advisory(
8376 """
8477
8578 for advisory in response .get (purl .name ):
86- vulnerable_version_range_string = "vers:pypi/" + advisory .get ("v" ).replace ("," , "|" )
87- vulnerable_version_range = PypiVersionRange .from_string (vulnerable_version_range_string )
88-
8979 yield VendorData (
9080 purl = PackageURL (purl .type , purl .namespace , purl .name ),
9181 aliases = [advisory .get ("cve" ), advisory .get ("id" )],
9282 affected_versions = sorted (advisory .get ("specs" )),
93- fixed_versions = get_patched_versions ( all_versions , vulnerable_version_range ) ,
83+ fixed_versions = [] ,
9484 )
9585
9686
@@ -109,81 +99,11 @@ def parse_advisory_for_cve(response, cve: str) -> Iterable[VendorData]:
10999 if package == "$meta" :
110100 continue
111101
112- all_versions = sorted (
113- [PypiVersion (ver .value ) for ver in versions (str (PackageURL (type = "pypi" , name = package )))]
114- )
115-
116102 for advisory in advisories :
117103 if advisory .get ("cve" ) == cve :
118- vulnerable_version_range_string = "vers:pypi/" + advisory .get ("v" ).replace ("," , "|" )
119- vulnerable_version_range = PypiVersionRange .from_string (
120- vulnerable_version_range_string
121- )
122-
123104 yield VendorData (
124105 purl = PackageURL (type = "pypi" , name = package ),
125106 aliases = [advisory .get ("cve" ), advisory .get ("id" )],
126107 affected_versions = sorted (advisory .get ("specs" )),
127- fixed_versions = get_patched_versions ( all_versions , vulnerable_version_range ) ,
108+ fixed_versions = [] ,
128109 )
129-
130-
131- def get_patched_versions (
132- all_versions : List [PypiVersion ],
133- vulnerable_version_range : PypiVersionRange ,
134- ):
135- """
136- Get the first patched version from the list of all versions of a package
137-
138- Parameters:
139- all_versions: A list containing PackageVersion of a package
140- vulnerable_version_range: A PypiVersionRange object specifying the vulnerable version range
141-
142- Returns:
143- A PackageVersion object containing the first patched version of the package
144- """
145-
146- # last_patched = None
147- # for version in reversed(all_versions):
148- # if version in vulnerable_version_range:
149- # if last_patched is not None:
150- # return [str(last_patched.value)]
151- # return []
152- # last_patched = version
153- # return []
154-
155- patched_version_ranges : List [str ] = []
156- current_patched_range_start : PypiVersion = None
157- current_patched_range_latest : PypiVersion = None
158-
159- def resolve_patched_range ():
160- if current_patched_range_start is not None :
161- if current_patched_range_latest == current_patched_range_start :
162- patched_version_ranges .append (str (current_patched_range_start .value ))
163- else :
164- patched_version_ranges .append (
165- f">={ current_patched_range_start .value } ,<={ current_patched_range_latest .value } "
166- )
167-
168- for version in all_versions :
169- if version in vulnerable_version_range :
170- resolve_patched_range ()
171- current_patched_range_start = None
172- current_patched_range_latest = None
173- else :
174- if current_patched_range_start is None :
175- current_patched_range_start = version
176- current_patched_range_latest = version
177- resolve_patched_range ()
178-
179- # Remove upper bound from the last fixed range
180- if len (patched_version_ranges ) > 0 :
181- patched_version_ranges [- 1 ] = patched_version_ranges [- 1 ].split ("," )[0 ]
182-
183- # Ensure that >= is only present if there are fragmented fixed ranges
184- # eg. For vulnerable spec "<2.2.5 >=2.3.0 <2.3.2",,fixed range => "2.2.5, >=2.3.2"
185- # eg. For vulnerable spec "<2.2.5", fixed range => "2.2.5
186- if len (patched_version_ranges ) == 1 :
187- patched_version_ranges [- 1 ] = patched_version_ranges [- 1 ][2 :]
188-
189- return patched_version_ranges
0 commit comments