Skip to content

Commit 64dc907

Browse files
committed
add support for all osv ecosystems
Signed-off-by: ziadhany <ziadhany2016@gmail.com>
1 parent 377826e commit 64dc907

2 files changed

Lines changed: 44 additions & 10 deletions

File tree

vulnerabilities/importers/osv.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ def parse_advisory_data(raw_data: dict, supported_ecosystem) -> Optional[Advisor
6464
)
6565

6666
for fixed_range in affected_pkg.get("ranges") or []:
67-
fixed_version = get_fixed_versions(fixed_range=fixed_range, raw_id=raw_id)
67+
fixed_version = get_fixed_versions(
68+
fixed_range=fixed_range, raw_id=raw_id, supported_ecosystem=supported_ecosystem
69+
)
6870

6971
for version in fixed_version:
7072
affected_packages.append(
@@ -199,18 +201,19 @@ def get_affected_version_range(affected_pkg, raw_id, supported_ecosystem):
199201
)
200202

201203

202-
def get_fixed_versions(fixed_range, raw_id) -> List[Version]:
204+
def get_fixed_versions(fixed_range, raw_id, supported_ecosystem) -> List[Version]:
203205
"""
204206
Return a list of unique fixed univers Versions given a ``fixed_range``
205207
univers VersionRange and a ``raw_id``.
206208
207209
For example::
208210
209-
>>> get_fixed_versions(fixed_range={}, raw_id="GHSA-j3f7-7rmc-6wqj")
211+
>>> get_fixed_versions(fixed_range={}, raw_id="GHSA-j3f7-7rmc-6wqj", supported_ecosystem="pypi",)
210212
[]
211213
>>> get_fixed_versions(
212214
... fixed_range={"type": "ECOSYSTEM", "events": [{"fixed": "1.7.0"}]},
213-
... raw_id="GHSA-j3f7-7rmc-6wqj"
215+
... raw_id="GHSA-j3f7-7rmc-6wqj",
216+
... supported_ecosystem="pypi",
214217
... )
215218
[PypiVersion(string='1.7.0')]
216219
"""
@@ -221,21 +224,32 @@ def get_fixed_versions(fixed_range, raw_id) -> List[Version]:
221224

222225
fixed_range_type = fixed_range["type"]
223226

224-
for version in extract_fixed_versions(fixed_range):
227+
version_class = None
228+
try:
229+
version_class = RANGE_CLASS_BY_SCHEMES[supported_ecosystem].version_class
230+
except KeyError:
231+
logger.error(
232+
f"Unknown version range for ecosystem {supported_ecosystem} for OSV id: {raw_id!r}"
233+
)
225234

226-
# FIXME: ECOSYSTEM does not imply PyPI!!!!
235+
for version in extract_fixed_versions(fixed_range):
227236
if fixed_range_type == "ECOSYSTEM":
228237
try:
229-
fixed_versions.append(PypiVersion(version))
238+
if not version_class:
239+
raise InvalidVersion(
240+
f"Unsupported version for ecosystem: {supported_ecosystem}"
241+
)
242+
fixed_versions.append(version_class(version))
230243
except InvalidVersion:
231-
logger.error(f"Invalid PypiVersion: {version!r} for OSV id: {raw_id!r}")
244+
logger.error(
245+
f"Invalid version class: {version_class} - {version!r} for OSV id: {raw_id!r}"
246+
)
232247

233248
elif fixed_range_type == "SEMVER":
234249
try:
235250
fixed_versions.append(SemverVersion(version))
236251
except InvalidVersion:
237252
logger.error(f"Invalid SemverVersion: {version!r} for OSV id: {raw_id!r}")
238-
239253
else:
240254
logger.error(f"Unsupported fixed version type: {version!r} for OSV id: {raw_id!r}")
241255

vulnerabilities/tests/test_osv.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from univers.version_constraint import VersionConstraint
1414
from univers.version_range import PypiVersionRange
1515
from univers.versions import PypiVersion
16+
from univers.versions import SemverVersion
1617

1718
from vulnerabilities.importer import Reference
1819
from vulnerabilities.importer import VulnerabilitySeverity
@@ -349,12 +350,18 @@ def test_get_affected_version_range(self):
349350
assert results == expected
350351

351352
def test_get_fixed_versions1(self):
352-
assert get_fixed_versions(fixed_range={}, raw_id="GHSA-j3f7-7rmc-6wqj") == []
353+
assert (
354+
get_fixed_versions(
355+
fixed_range={}, raw_id="GHSA-j3f7-7rmc-6wqj", supported_ecosystem="pypi"
356+
)
357+
== []
358+
)
353359

354360
def test_get_fixed_versions2(self):
355361
results = get_fixed_versions(
356362
fixed_range={"type": "ECOSYSTEM", "events": [{"introduced": "0"}, {"fixed": "1.7.0"}]},
357363
raw_id="GHSA-j3f7-7rmc-6wqj",
364+
supported_ecosystem="pypi",
358365
)
359366
assert results == [PypiVersion("1.7.0")]
360367

@@ -370,6 +377,19 @@ def test_get_fixed_versions3(self):
370377
],
371378
},
372379
raw_id="GHSA-j3f7-7rmc-6wqj",
380+
supported_ecosystem="pypi",
373381
)
374382

375383
assert results == [PypiVersion("9.0.0"), PypiVersion("9.0.1")]
384+
385+
def test_get_fixed_versions4(self):
386+
results = get_fixed_versions(
387+
fixed_range={
388+
"type": "ECOSYSTEM",
389+
"events": [{"introduced": "0"}, {"fixed": "6.5.4"}],
390+
},
391+
raw_id="GHSA-r9p9-mrjm-926w",
392+
supported_ecosystem="npm",
393+
)
394+
395+
assert results == [SemverVersion("6.5.4")]

0 commit comments

Comments
 (0)