Skip to content

Commit d61a505

Browse files
committed
Update Alpine Linux to use the new AdvisoryDataV2
Update the logger to prevent None from being used as a default value Move the tests to a new file expected-advisories-v3.3.json Signed-off-by: ziad hany <ziadhany2016@gmail.com>
1 parent eff2f9b commit d61a505

File tree

3 files changed

+543
-753
lines changed

3 files changed

+543
-753
lines changed

vulnerabilities/pipelines/v2_importers/alpine_linux_importer.py

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
# See https://aboutcode.org for more information about nexB OSS projects.
88
#
99

10-
import json
1110
import logging
1211
from pathlib import Path
1312
from typing import Any
@@ -20,14 +19,15 @@
2019
from univers.version_range import AlpineLinuxVersionRange
2120
from univers.versions import InvalidVersion
2221

23-
from vulnerabilities.importer import AdvisoryData
22+
from vulnerabilities.importer import AdvisoryDataV2
2423
from vulnerabilities.importer import AffectedPackageV2
2524
from vulnerabilities.importer import ReferenceV2
2625
from vulnerabilities.pipelines import VulnerableCodeBaseImporterPipelineV2
2726
from vulnerabilities.references import WireSharkReferenceV2
2827
from vulnerabilities.references import XsaReferenceV2
2928
from vulnerabilities.references import ZbxReferenceV2
3029
from vulnerabilities.utils import get_advisory_url
30+
from vulnerabilities.utils import load_json
3131

3232

3333
class AlpineLinuxImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
@@ -46,31 +46,27 @@ def steps(cls):
4646
)
4747

4848
def advisories_count(self) -> int:
49+
base_path = Path(self.vcs_response.dest_dir) / "secdb"
4950
return sum(
5051
len(pkg.get("advisories", []))
51-
for data in (
52-
json.loads(p.read_text())
53-
for p in (Path(self.vcs_response.dest_dir) / "secdb").rglob("*.json")
54-
)
52+
for data in (load_json(p) for p in base_path.rglob("*.json"))
5553
for pkg in data.get("packages", [])
5654
)
5755

5856
def clone(self):
5957
self.log(f"Cloning `{self.repo_url}`")
6058
self.vcs_response = fetch_via_vcs(self.repo_url)
6159

62-
def collect_advisories(self) -> Iterable[AdvisoryData]:
60+
def collect_advisories(self) -> Iterable[AdvisoryDataV2]:
6361
base_path = Path(self.vcs_response.dest_dir) / "secdb"
6462
for file_path in base_path.glob("**/*.json"):
6563
advisory_url = get_advisory_url(
6664
file=file_path,
6765
base_path=base_path,
68-
url="https://github.com/aboutcode-org/aboutcode-mirror-alpine-secdb/blob/main/",
66+
url="https://secdb.alpinelinux.org/",
6967
)
7068

71-
with open(file_path) as f:
72-
record = json.load(f)
73-
69+
record = load_json(file_path)
7470
if not record or not record["packages"]:
7571
self.log(
7672
f'"packages" not found in {advisory_url!r}',
@@ -94,35 +90,32 @@ def check_for_attributes(record, logger) -> bool:
9490
attributes = ["distroversion", "reponame", "archs"]
9591
for attribute in attributes:
9692
if attribute not in record:
97-
if logger:
98-
logger(
99-
f'"{attribute!r}" not found in {record!r}',
100-
level=logging.DEBUG,
101-
)
93+
logger(
94+
f'"{attribute!r}" not found in {record!r}',
95+
level=logging.DEBUG,
96+
)
10297
return False
10398
return True
10499

105100

106-
def process_record(record: dict, url: str, logger: callable = None) -> Iterable[AdvisoryData]:
101+
def process_record(record: dict, url: str, logger: callable) -> Iterable[AdvisoryDataV2]:
107102
"""
108103
Return a list of AdvisoryData objects by processing data
109104
present in that `record`
110105
"""
111106
if not record.get("packages"):
112-
if logger:
113-
logger(
114-
f'"packages" not found in this record {record!r}',
115-
level=logging.DEBUG,
116-
)
107+
logger(
108+
f'"packages" not found in this record {record!r}',
109+
level=logging.DEBUG,
110+
)
117111
return []
118112

119113
for package in record["packages"]:
120114
if not package["pkg"]:
121-
if logger:
122-
logger(
123-
f'"pkg" not found in this package {package!r}',
124-
level=logging.DEBUG,
125-
)
115+
logger(
116+
f'"pkg" not found in this package {package!r}',
117+
level=logging.DEBUG,
118+
)
126119
continue
127120
if not check_for_attributes(record, logger):
128121
continue
@@ -142,28 +135,26 @@ def load_advisories(
142135
reponame: str,
143136
archs: List[str],
144137
url: str,
145-
logger: callable = None,
146-
) -> Iterable[AdvisoryData]:
138+
logger: callable,
139+
) -> Iterable[AdvisoryDataV2]:
147140
"""
148141
Yield AdvisoryData by mapping data from `pkg_infos`
149142
and form PURL for AffectedPackages by using
150143
`distroversion`, `reponame`, `archs`
151144
"""
152145
if not pkg_infos.get("name"):
153-
if logger:
154-
logger(
155-
f'"name" is not available in package {pkg_infos!r}',
156-
level=logging.DEBUG,
157-
)
146+
logger(
147+
f'"name" is not available in package {pkg_infos!r}',
148+
level=logging.DEBUG,
149+
)
158150
return []
159151

160152
for version, fixed_vulns in pkg_infos["secfixes"].items():
161153
if not fixed_vulns:
162-
if logger:
163-
logger(
164-
f"No fixed vulnerabilities in version {version!r}",
165-
level=logging.DEBUG,
166-
)
154+
logger(
155+
f"No fixed vulnerabilities in version {version!r}",
156+
level=logging.DEBUG,
157+
)
167158
continue
168159

169160
# fixed_vulns is a list of strings and each string is a space-separated
@@ -207,11 +198,10 @@ def load_advisories(
207198
)
208199

209200
if not isinstance(archs, List):
210-
if logger:
211-
logger(
212-
f"{archs!r} is not of `List` instance",
213-
level=logging.DEBUG,
214-
)
201+
logger(
202+
f"{archs!r} is not of `List` instance",
203+
level=logging.DEBUG,
204+
)
215205
continue
216206

217207
if archs and fixed_version_range:
@@ -246,10 +236,10 @@ def load_advisories(
246236
)
247237

248238
advisory_id = f"{pkg_infos['name']}/{qualifiers['distroversion']}/{version}/{vuln_id}"
249-
yield AdvisoryData(
239+
yield AdvisoryDataV2(
250240
advisory_id=advisory_id,
251241
aliases=aliases,
252-
references_v2=references,
242+
references=references,
253243
affected_packages=affected_packages,
254244
url=url,
255245
)

0 commit comments

Comments
 (0)