Skip to content

Commit 1b13e12

Browse files
committed
[WIP] Use OSV design for AffectedPackages
AffectedPackges now contains all affected versions and one fix version. This is inspired from the design documented at https://docs.google.com/document/d/1sylBGNooKtf220RHQn1I8pZRmqXZQADDQ_TOABrKTpA Under "Format Overview", along the lines of: "affects": { "ranges": [ { "type": string, "repo": string, "introduced": string, "fixed": string } ], "versions": [ string ] }, Signed-off-by: Hritik Vijay <hritikxx8@gmail.com>
1 parent f05bb8c commit 1b13e12

1 file changed

Lines changed: 33 additions & 12 deletions

File tree

vulnerabilities/data_source.py

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
from git import Repo, DiffIndex
4343
from packageurl import PackageURL
4444
from univers.version_specifier import VersionSpecifier
45+
from univers.versions import BaseVersion
46+
from univers.versions import parse_version
4547
from univers.versions import version_class_by_package_type
4648

4749
from vulnerabilities.oval_parser import OvalParser
@@ -76,29 +78,48 @@ def normalized(self):
7678

7779
@dataclasses.dataclass(order=True, frozen=True)
7880
class AffectedPackage:
79-
# this package MUST NOT have a version
81+
# TODO: Tweak after https://github.com/nexB/univers/issues/8
82+
"""
83+
Contains a range of affected versions and a fixed verison of a given package
84+
The PackageURL supplied must *not* have a version
85+
"""
8086
package: PackageURL
81-
# the version specifier contains the version scheme as is: semver:>=1,3,4
82-
version_specifier: VersionSpecifier
87+
affected_version_specifier: VersionSpecifier
88+
fixed_version: Optional[BaseVersion]
89+
90+
def __post_init__(self):
91+
if self.package.version:
92+
raise ValueError
93+
94+
if self.affected_version_specifier.scheme != self.fixed_version.scheme:
95+
raise ValueError
8396

8497
def to_dict(self):
8598
# TODO: VersionSpecifier.__str__ is not working
8699
# https://github.com/nexB/univers/issues/7
87100
# Adjust following code when it is fixed
88-
scheme = self.version_specifier.scheme
101+
scheme = self.affected_version_specifier.scheme
89102
ranges = ",".join(
90-
[f"{rng.operator}{rng.version.value}" for rng in self.version_specifier.ranges]
103+
[f"{rng.operator}{rng.version.value}" for rng in self.affected_version_specifier.ranges]
91104
)
92-
return {"package": self.package, "version_specifier": f"{scheme}:{ranges}"}
105+
return {
106+
"package": self.package,
107+
"affected_version_specifier": f"{scheme}:{ranges}",
108+
"fixed_version": self.fixed_version,
109+
}
93110

94111
@staticmethod
95-
def from_dict(affected_package_dict):
96-
affected_package = AffectedPackage(**affected_package_dict)
97-
package = PackageURL(*affected_package.package)
98-
version_specifier = VersionSpecifier.from_version_spec_string(
99-
affected_package.version_specifier
112+
def from_dict(aff_pkg: dict):
113+
package = PackageURL(*aff_pkg["package"])
114+
affected_version_specifier = VersionSpecifier.from_version_spec_string(
115+
aff_pkg["affected_version_specifier"]
116+
)
117+
fixed_version = parse_version(aff_pkg["fixed_version"])
118+
return AffectedPackage(
119+
package=package,
120+
affected_version_specifier=affected_version_specifier,
121+
fixed_version=fixed_version,
100122
)
101-
return AffectedPackage(package=package, version_specifier=version_specifier)
102123

103124

104125
@dataclasses.dataclass(order=True)

0 commit comments

Comments
 (0)