|
7 | 7 | # See https://aboutcode.org for more information about nexB OSS projects. |
8 | 8 | # |
9 | 9 |
|
| 10 | +from typing import Iterable |
| 11 | + |
10 | 12 | from vulnerabilities import severity_systems |
11 | 13 | from vulnerabilities.importer import AdvisoryData |
12 | 14 | from vulnerabilities.importer import Importer |
13 | 15 | from vulnerabilities.importer import Reference |
14 | 16 | from vulnerabilities.importer import VulnerabilitySeverity |
15 | 17 | from vulnerabilities.utils import fetch_yaml |
| 18 | +from vulnerabilities.utils import is_cve |
16 | 19 |
|
17 | 20 | URL = "https://ftp.suse.com/pub/projects/security/yaml/suse-cvss-scores.yaml" |
18 | 21 |
|
19 | 22 |
|
20 | 23 | class SUSESeverityScoreImporter(Importer): |
21 | | - def updated_advisories(self): |
22 | | - advisories = [] |
| 24 | + |
| 25 | + spdx_license_expression = "CC-BY-4.0" |
| 26 | + license_url = "https://ftp.suse.com/pub/projects/security/yaml/LICENSE" |
| 27 | + |
| 28 | + def advisory_data(self) -> Iterable[AdvisoryData]: |
23 | 29 | score_data = fetch_yaml(URL) |
24 | | - advisories.append(self.to_advisory(score_data)) |
25 | | - return advisories |
| 30 | + yield from self.to_advisory(score_data) |
26 | 31 |
|
27 | | - @staticmethod |
28 | | - def to_advisory(score_data): |
| 32 | + def to_advisory(self, score_data): |
29 | 33 | systems_by_version = { |
30 | 34 | "2.0": severity_systems.CVSSV2, |
31 | 35 | "3": severity_systems.CVSSV3, |
32 | 36 | "3.1": severity_systems.CVSSV31, |
33 | 37 | } |
34 | | - advisories = [] |
35 | 38 |
|
36 | | - for cve_id in score_data: |
| 39 | + for cve_id in score_data or []: |
37 | 40 | severities = [] |
38 | | - for cvss_score in score_data[cve_id]["cvss"]: |
39 | | - cvss_version = cvss_score["version"] |
40 | | - scoring_system = systems_by_version[cvss_version] |
41 | | - base_score = str(cvss_score["score"]) |
42 | | - vector = str(cvss_score.get("vector", "")) |
| 41 | + for cvss_score in score_data[cve_id].get("cvss") or []: |
| 42 | + cvss_version = cvss_score.get("version") or "" |
| 43 | + scoring_system = systems_by_version.get(cvss_version) |
| 44 | + if not scoring_system: |
| 45 | + continue |
| 46 | + base_score = str(cvss_score.get("score") or "") |
| 47 | + vector = str(cvss_score.get("vector") or "") |
43 | 48 | score = VulnerabilitySeverity( |
44 | 49 | system=scoring_system, |
45 | 50 | value=base_score, |
46 | 51 | scoring_elements=vector, |
47 | 52 | ) |
48 | 53 | severities.append(score) |
49 | 54 |
|
50 | | - advisories.append( |
51 | | - AdvisoryData( |
52 | | - vulnerability_id=cve_id, |
53 | | - summary="", |
54 | | - references=[Reference(url=URL, severities=severities)], |
55 | | - ) |
| 55 | + if not is_cve(cve_id): |
| 56 | + continue |
| 57 | + |
| 58 | + yield AdvisoryData( |
| 59 | + aliases=[cve_id], |
| 60 | + summary="", |
| 61 | + references=[Reference(url=URL, severities=severities)], |
56 | 62 | ) |
57 | | - return advisories |
|
0 commit comments