Skip to content

Commit 3d603c6

Browse files
committed
migrate current alpine importer to alpine importer-improver model
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 8d66f64 commit 3d603c6

3 files changed

Lines changed: 76 additions & 90 deletions

File tree

vulnerabilities/importers/alpine_linux.py

Lines changed: 73 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,15 @@
2020
# for any legal advice.
2121
# VulnerableCode is a free software code scanning tool from nexB Inc. and others.
2222
# Visit https://github.com/nexB/vulnerablecode/ for support and download.
23-
from typing import Any
23+
from typing import Any, Iterable
2424
from typing import List
2525
from typing import Mapping
26-
from typing import Set
2726

2827
import requests
2928
import saneyaml
3029
from bs4 import BeautifulSoup
3130

32-
from vulnerabilities.importer import Advisory
31+
from vulnerabilities.importer import AdvisoryData
3332
from vulnerabilities.importer import Importer
3433
from vulnerabilities.importer import Reference
3534
from vulnerabilities.helpers import is_cve
@@ -38,106 +37,96 @@
3837

3938

4039
class AlpineImporter(Importer):
41-
@staticmethod
42-
def fetch_advisory_links():
43-
index_page = BeautifulSoup(requests.get(BASE_URL).content, features="lxml")
40+
def advisory_data(self) -> Iterable[AdvisoryData]:
41+
advisory_links = fetch_advisory_links()
42+
for link in advisory_links:
43+
yield (process_link(link))
4444

45-
alpine_versions = [
46-
link.text for link in index_page.find_all("a") if link.text.startswith("v")
47-
]
4845

49-
advisory_directory_links = [f"{BASE_URL}{version}" for version in alpine_versions]
50-
51-
advisory_links = []
52-
for advisory_directory_link in advisory_directory_links:
53-
advisory_directory_page = requests.get(advisory_directory_link).content
54-
advisory_directory_page = BeautifulSoup(advisory_directory_page, features="lxml")
55-
advisory_links.extend(
56-
[
57-
f"{advisory_directory_link}{anchore_tag.text}"
58-
for anchore_tag in advisory_directory_page.find_all("a")
59-
if anchore_tag.text.endswith("yaml")
60-
]
61-
)
46+
def fetch_advisory_links():
47+
index_page = BeautifulSoup(requests.get(BASE_URL).content, features="lxml")
6248

63-
return advisory_links
49+
alpine_versions = [
50+
link.text for link in index_page.find_all("a") if link.text.startswith("v")
51+
]
6452

65-
def updated_advisories(self) -> Set[Advisory]:
66-
advisories = []
67-
advisory_links = self.fetch_advisory_links()
68-
for link in advisory_links:
69-
advisories.extend(self._process_link(link))
53+
advisory_directory_links = [f"{BASE_URL}{version}" for version in alpine_versions]
7054

71-
return self.batch_advisories(advisories)
55+
for advisory_directory_link in advisory_directory_links:
56+
advisory_directory_page = requests.get(advisory_directory_link).content
57+
advisory_directory_page = BeautifulSoup(
58+
advisory_directory_page, features="lxml"
59+
)
60+
yield [
61+
f"{advisory_directory_link}{anchore_tag.text}"
62+
for anchore_tag in advisory_directory_page.find_all("a")
63+
if anchore_tag.text.endswith("yaml")
64+
]
7265

73-
def _process_link(self, link) -> List[Advisory]:
74-
advisories = []
75-
yaml_response = requests.get(link).content
76-
record = saneyaml.load(yaml_response)
7766

78-
if record["packages"] is None:
79-
return advisories
67+
def process_link(link) -> List[AdvisoryData]:
68+
yaml_response = requests.get(link).content
69+
record = saneyaml.load(yaml_response)
8070

81-
for p in record["packages"]:
82-
advisories.extend(
83-
self._load_advisories(
84-
p["pkg"],
85-
)
86-
)
71+
if record["packages"] is None:
72+
return []
8773

88-
return advisories
74+
for package in record["packages"]:
75+
yield load_advisories(
76+
package["pkg"],
77+
)
8978

90-
@staticmethod
91-
def _load_advisories(
92-
pkg_infos: Mapping[str, Any],
93-
) -> List[Advisory]:
9479

95-
advisories = []
80+
def load_advisories(
81+
pkg_infos: Mapping[str, Any],
82+
) -> List[AdvisoryData]:
9683

97-
for fixed_vulns in pkg_infos["secfixes"].values():
84+
# assert type(pkg_infos["secfixes"]) == Mapping[str, List]
85+
for fixed_vulns in pkg_infos["secfixes"].values():
9886

99-
if fixed_vulns is None:
100-
continue
87+
if fixed_vulns is None:
88+
continue
10189

102-
for vuln_ids in fixed_vulns:
103-
vuln_ids = vuln_ids.split()
104-
references = []
105-
for reference_id in vuln_ids[1:]:
90+
for vuln_ids in fixed_vulns:
91+
vuln_ids = vuln_ids.split()
92+
references = []
93+
for reference_id in vuln_ids[1:]:
10694

107-
if reference_id.startswith("XSA"):
108-
xsa_id = reference_id.split("-")[-1]
109-
references.append(
110-
Reference(
111-
reference_id=reference_id,
112-
url="https://xenbits.xen.org/xsa/advisory-{}.html".format(xsa_id),
113-
)
95+
if reference_id.startswith("XSA"):
96+
xsa_id = reference_id.split("-")[-1]
97+
references.append(
98+
Reference(
99+
reference_id=reference_id,
100+
url="https://xenbits.xen.org/xsa/advisory-{}.html".format(
101+
xsa_id
102+
),
114103
)
104+
)
115105

116-
elif reference_id.startswith("ZBX"):
117-
references.append(
118-
Reference(
119-
reference_id=reference_id,
120-
url="https://support.zabbix.com/browse/{}".format(reference_id),
121-
)
106+
elif reference_id.startswith("ZBX"):
107+
references.append(
108+
Reference(
109+
reference_id=reference_id,
110+
url="https://support.zabbix.com/browse/{}".format(
111+
reference_id
112+
),
122113
)
114+
)
123115

124-
elif reference_id.startswith("wnpa-sec"):
125-
references.append(
126-
Reference(
127-
reference_id=reference_id,
128-
url="https://www.wireshark.org/security/{}.html".format(
129-
reference_id
130-
),
131-
)
116+
elif reference_id.startswith("wnpa-sec"):
117+
references.append(
118+
Reference(
119+
reference_id=reference_id,
120+
url="https://www.wireshark.org/security/{}.html".format(
121+
reference_id
122+
),
132123
)
133-
134-
# TODO: Handle the CVE-????-????? case
135-
advisories.append(
136-
Advisory(
137-
summary="",
138-
references=references,
139-
vulnerability_id=vuln_ids[0] if is_cve(vuln_ids[0]) else "",
140124
)
141-
)
142125

143-
return advisories
126+
# TODO: Handle the CVE-????-????? case
127+
yield AdvisoryData(
128+
summary="",
129+
references=references,
130+
affected_packages=[],
131+
aliases=[vuln_ids[0] if is_cve(vuln_ids[0]) else ""],
132+
)

vulnerabilities/importers/nginx.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020
# VulnerableCode is a free software tool from nexB Inc. and others.
2121
# Visit https://github.com/nexB/vulnerablecode/ for support and download.
2222

23-
import dataclasses
24-
import datetime
2523
from typing import Iterable
2624
import logging
2725

@@ -40,7 +38,6 @@
4038
from vulnerabilities.importer import VulnerabilitySeverity
4139
from vulnerabilities.improver import Inference
4240
from vulnerabilities.improver import Improver
43-
from vulnerabilities.helpers import nearest_patched_package
4441
from vulnerabilities.models import Advisory
4542
from vulnerabilities.package_managers import GitHubTagsAPI
4643
from vulnerabilities.package_managers import Version

vulnerabilities/improvers/default.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Iterable
1+
from typing import Iterable, Tuple
22
from typing import List
33
from itertools import chain
44

@@ -38,7 +38,7 @@ def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
3838
)
3939

4040

41-
def get_exact_purls(affected_package: AffectedPackage) -> (List[PackageURL], PackageURL):
41+
def get_exact_purls(affected_package: AffectedPackage) -> Tuple[List[PackageURL], PackageURL]:
4242
"""
4343
Return a list of affected purls and the fixed package found in the ``affected_package``
4444
AffectedPackage disregarding any ranges.
@@ -67,7 +67,7 @@ def get_exact_purls(affected_package: AffectedPackage) -> (List[PackageURL], Pac
6767
range_versions = [c.version for c in vr.constraints if c]
6868
resolved_versions = [v for v in range_versions if v and v in vr]
6969

70-
affected_purls = []
70+
affected_purls: List[PackageURL] = []
7171
for version in resolved_versions:
7272
affected_purl = affected_package.package._replace(version=str(version))
7373
affected_purls.append(affected_purl)

0 commit comments

Comments
 (0)