Skip to content

Commit 71a3d75

Browse files
committed
Update importers to handle VersionResponse
Recent time travel heuristics need published date of versions, thus Version dataclass was created. Some of the importers got bugged by this new system and were crashing. This fix is a part of # 467 Importers bugged: - nginx - debian_oval - ubuntu Signed-off-by: Hritik Vijay <hritikxx8@gmail.com>
1 parent 119d883 commit 71a3d75

5 files changed

Lines changed: 23 additions & 9 deletions

File tree

vulnerabilities/data_source.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ def updated_advisories(self) -> List[Advisory]:
483483
except Exception:
484484
logger.error(
485485
f"Failed to get updated_advisories: {oval_file!r} "
486-
"with {metadata!r}:\n" + traceback.format_exc()
486+
f"with {metadata!r}:\n" + traceback.format_exc()
487487
)
488488
continue
489489

@@ -538,7 +538,7 @@ def get_data_from_xml_doc(self, xml_doc: ET.ElementTree, pkg_metadata={}) -> Lis
538538
affected_version_range = VersionSpecifier.from_scheme_version_spec_string(
539539
version_scheme, affected_version_range
540540
)
541-
all_versions = self.pkg_manager_api.get(package_name)
541+
all_versions = self.pkg_manager_api.get(package_name).valid_versions
542542

543543
# FIXME: what is this 50 DB limit? that's too small for versions
544544
# FIXME: we should not drop data this way

vulnerabilities/importers/nginx.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from vulnerabilities.data_source import DataSourceConfiguration
3535
from vulnerabilities.data_source import Reference
3636
from vulnerabilities.package_managers import GitHubTagsAPI
37+
from vulnerabilities.package_managers import Version
3738
from vulnerabilities.helpers import nearest_patched_package
3839

3940

@@ -53,10 +54,14 @@ def set_api(self):
5354

5455
# For some reason nginx tags it's releases are in the form of `release-1.2.3`
5556
# Chop off the `release-` part here.
56-
for index, version in enumerate(self.version_api.cache["nginx/nginx"].valid_versions):
57-
self.version_api.cache["nginx/nginx"].valid_versions[index] = version.replace(
58-
"release-", ""
57+
normalized_versions = set()
58+
while self.version_api.cache["nginx/nginx"]:
59+
version = self.version_api.cache["nginx/nginx"].pop()
60+
normalized_version = Version(
61+
version.value.replace("release-", ""), version.release_date
5962
)
63+
normalized_versions.add(normalized_version)
64+
self.version_api.cache["nginx/nginx"] = normalized_versions
6065

6166
def updated_advisories(self):
6267
advisories = []

vulnerabilities/package_managers.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,12 @@ async def fetch(self, pkg, session):
9898
self.cache[pkg] = {}
9999
break
100100
for release in resp_json["entries"]:
101-
all_versions.add(release["source_package_version"].replace("0:", ""))
101+
all_versions.add(
102+
Version(
103+
value=release["source_package_version"].replace("0:", ""),
104+
release_date=release["date_published"],
105+
)
106+
)
102107
if resp_json.get("next_collection_link"):
103108
url = resp_json["next_collection_link"]
104109
else:
@@ -233,7 +238,7 @@ async def fetch(self, pkg, session, retry_count=5):
233238
self.cache[pkg] = {}
234239
return
235240
for release in resp_json["versions"]:
236-
all_versions.add(release["version"].replace("0:", ""))
241+
all_versions.add(Version(value=release["version"].replace("0:", "")))
237242

238243
self.cache[pkg] = all_versions
239244
# TODO : Handle ServerDisconnectedError by using some sort of

vulnerabilities/tests/test_debian_oval.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from packageurl import PackageURL
77

88
from vulnerabilities.importers.debian_oval import DebianOvalDataSource
9+
from vulnerabilities.package_managers import VersionResponse
910
from vulnerabilities.data_source import Advisory
1011
from vulnerabilities.helpers import AffectedPackage
1112

@@ -30,7 +31,9 @@ def setUpClass(cls):
3031

3132
@patch(
3233
"vulnerabilities.importers.debian_oval.DebianVersionAPI.get",
33-
return_value={"1.11.1+dfsg-5+deb7u1", "0.11.1+dfsg-5+deb7u1", "2.3.9"},
34+
return_value=VersionResponse(
35+
valid_versions={"1.11.1+dfsg-5+deb7u1", "0.11.1+dfsg-5+deb7u1", "2.3.9"}
36+
),
3437
)
3538
@patch("vulnerabilities.importers.debian_oval.DebianVersionAPI.load_api", new=mock)
3639
def test_get_data_from_xml_doc(self, mock_write):

vulnerabilities/tests/test_ubuntu.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from vulnerabilities.oval_parser import OvalParser
1212
from vulnerabilities.importers.ubuntu import UbuntuDataSource
13+
from vulnerabilities.package_managers import VersionResponse
1314
from vulnerabilities.data_source import Advisory
1415
from vulnerabilities.data_source import Reference
1516
from vulnerabilities.helpers import AffectedPackage
@@ -182,7 +183,7 @@ def setUpClass(cls):
182183

183184
@patch(
184185
"vulnerabilities.importers.ubuntu.LaunchpadVersionAPI.get",
185-
return_value={"0.3.0", "0.2.0", "2.14-2"},
186+
return_value=VersionResponse(valid_versions={"0.3.0", "0.2.0", "2.14-2"}),
186187
)
187188
@patch("vulnerabilities.importers.ubuntu.LaunchpadVersionAPI.load_api", new=mock)
188189
def test_get_data_from_xml_doc(self, mock_write):

0 commit comments

Comments
 (0)