|
42 | 42 | from git import Repo, DiffIndex |
43 | 43 | from packageurl import PackageURL |
44 | 44 | from univers.version_specifier import VersionSpecifier |
| 45 | +from univers.versions import BaseVersion |
| 46 | +from univers.versions import parse_version |
45 | 47 | from univers.versions import version_class_by_package_type |
46 | 48 |
|
47 | 49 | from vulnerabilities.oval_parser import OvalParser |
@@ -76,29 +78,48 @@ def normalized(self): |
76 | 78 |
|
77 | 79 | @dataclasses.dataclass(order=True, frozen=True) |
78 | 80 | 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 | + """ |
80 | 86 | 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 |
83 | 96 |
|
84 | 97 | def to_dict(self): |
85 | 98 | # TODO: VersionSpecifier.__str__ is not working |
86 | 99 | # https://github.com/nexB/univers/issues/7 |
87 | 100 | # Adjust following code when it is fixed |
88 | | - scheme = self.version_specifier.scheme |
| 101 | + scheme = self.affected_version_specifier.scheme |
89 | 102 | 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] |
91 | 104 | ) |
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 | + } |
93 | 110 |
|
94 | 111 | @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, |
100 | 122 | ) |
101 | | - return AffectedPackage(package=package, version_specifier=version_specifier) |
102 | 123 |
|
103 | 124 |
|
104 | 125 | @dataclasses.dataclass(order=True) |
|
0 commit comments