Skip to content

Commit 691bfbd

Browse files
committed
fix: ensure fixed and affected ranges are valid univers VersionRange
Signed-off-by: Keshav Priyadarshi <git@keshav.space>
1 parent 5d2f421 commit 691bfbd

3 files changed

Lines changed: 54 additions & 7 deletions

File tree

vulnerabilities/importer.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,16 @@ class VulnerabilitySeverity:
5757
published_at: Optional[datetime.datetime] = None
5858
url: Optional[str] = None
5959

60+
def __post_init__(self):
61+
if not self.system:
62+
raise ValueError("system is required for VulnerabilitySeverity")
63+
64+
if not isinstance(self.system, ScoringSystem):
65+
raise TypeError(f"system must be a ScoringSystem, got {type(self.system)!r}")
66+
67+
if not isinstance(self.value, str):
68+
self.value = str(self.value)
69+
6070
def to_dict(self):
6171
data = {
6272
"system": self.system.identifier,
@@ -469,6 +479,42 @@ def __post_init__(self):
469479
"an affected version range, introduced commit patches, or fixed commit patches."
470480
)
471481

482+
if self.affected_version_range is not None and not isinstance(
483+
self.affected_version_range, VersionRange
484+
):
485+
raise TypeError(
486+
f"affected_version_range must be VersionRange or None, got {type(self.affected_version_range)!r}"
487+
)
488+
489+
if self.fixed_version_range is not None and not isinstance(
490+
self.fixed_version_range, VersionRange
491+
):
492+
raise TypeError(
493+
f"fixed_version_range must be VersionRange or None, got {type(self.fixed_version_range)!r}"
494+
)
495+
496+
if not isinstance(self.introduced_by_commit_patches, list):
497+
raise TypeError(
498+
f"introduced_by_commit_patches must be a list, got {type(self.introduced_by_commit_patches)!r}"
499+
)
500+
501+
if not isinstance(self.fixed_by_commit_patches, list):
502+
raise TypeError(
503+
f"fixed_by_commit_patches must be a list, got {type(self.fixed_by_commit_patches)!r}"
504+
)
505+
506+
for item in self.introduced_by_commit_patches:
507+
if not isinstance(item, PackageCommitPatchData):
508+
raise TypeError(
509+
f"introduced_by_commit_patches items must be PackageCommitPatchData, got {type(item)!r}"
510+
)
511+
512+
for item in self.fixed_by_commit_patches:
513+
if not isinstance(item, PackageCommitPatchData):
514+
raise TypeError(
515+
f"fixed_by_commit_patches items must be PackageCommitPatchData, got {type(item)!r}"
516+
)
517+
472518
def __lt__(self, other):
473519
if not isinstance(other, AffectedPackageV2):
474520
return NotImplemented

vulnerabilities/tests/pipelines/test_compute_advisory_todo_v2.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
from django.test import TestCase
1313
from packageurl import PackageURL
14+
from univers.version_range import VersionRange
1415

1516
from vulnerabilities.importer import AdvisoryDataV2
1617
from vulnerabilities.importer import AffectedPackageV2
@@ -30,8 +31,8 @@ def setUp(self):
3031
affected_packages=[
3132
AffectedPackageV2(
3233
package=PackageURL(type="npm", name="package1"),
33-
affected_version_range="vers:npm/>=1.0.0|<2.0.0",
34-
fixed_version_range="vers:npm/2.0.0",
34+
affected_version_range=VersionRange.from_string("vers:npm/>=1.0.0|<2.0.0"),
35+
fixed_version_range=VersionRange.from_string("vers:npm/2.0.0"),
3536
)
3637
],
3738
references=[ReferenceV2(url="https://example.com/vuln1")],
@@ -44,7 +45,7 @@ def setUp(self):
4445
affected_packages=[
4546
AffectedPackageV2(
4647
package=PackageURL(type="npm", name="package1"),
47-
affected_version_range="vers:npm/>=1.0.0|<2.0.0",
48+
affected_version_range=VersionRange.from_string("vers:npm/>=1.0.0|<2.0.0"),
4849
)
4950
],
5051
references=[ReferenceV2(url="https://example.com/vuln1")],
@@ -57,7 +58,7 @@ def setUp(self):
5758
affected_packages=[
5859
AffectedPackageV2(
5960
package=PackageURL(type="npm", name="package1"),
60-
fixed_version_range="vers:npm/2.0.0",
61+
fixed_version_range=VersionRange.from_string("vers:npm/2.0.0"),
6162
)
6263
],
6364
references=[ReferenceV2(url="https://example.com/vuln1")],
@@ -70,8 +71,8 @@ def setUp(self):
7071
affected_packages=[
7172
AffectedPackageV2(
7273
package=PackageURL(type="npm", name="package1"),
73-
affected_version_range="vers:npm/>=1.0.0|<=2.0.0",
74-
fixed_version_range="vers:npm/2.0.1",
74+
affected_version_range=VersionRange.from_string("vers:npm/>=1.0.0|<=2.0.0"),
75+
fixed_version_range=VersionRange.from_string("vers:npm/2.0.1"),
7576
)
7677
],
7778
references=[ReferenceV2(url="https://example.com/vuln1")],

vulnerabilities/tests/pipelines/v2_importers/test_vulnrichment_importer_v2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ def test_parse_cve_advisory(mock_pathlib, mock_vcs_response, mock_fetch_via_vcs)
196196
assert advisory.summary == "Sample PyPI vulnerability"
197197
assert advisory.url == advisory_url
198198
assert len(advisory.severities) == 1
199-
assert advisory.severities[0].value == 5.3
199+
assert advisory.severities[0].value == "5.3"
200200

201201

202202
def test_collect_advisories_with_invalid_json(mock_pathlib, mock_vcs_response, mock_fetch_via_vcs):

0 commit comments

Comments
 (0)