Skip to content

Commit dd85641

Browse files
committed
Migrate kaybee importer
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent ae47361 commit dd85641

2 files changed

Lines changed: 59 additions & 18 deletions

File tree

vulnerabilities/importers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from vulnerabilities.importers import debian_oval
1414
from vulnerabilities.importers import github
1515
from vulnerabilities.importers import gitlab
16+
from vulnerabilities.importers import kaybee
1617
from vulnerabilities.importers import nginx
1718
from vulnerabilities.importers import nvd
1819
from vulnerabilities.importers import openssl
@@ -35,6 +36,7 @@
3536
archlinux.ArchlinuxImporter,
3637
ubuntu.UbuntuImporter,
3738
debian_oval.DebianOvalImporter,
39+
kaybee.KaybeeImporter,
3840
]
3941

4042
IMPORTERS_REGISTRY = {x.qualified_name: x for x in IMPORTERS_REGISTRY}

vulnerabilities/importers/kaybee.py

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

10+
import logging
11+
from pathlib import Path
1012
from typing import Iterable
13+
1114
from packageurl import PackageURL
15+
from univers import version_range
1216

1317
from vulnerabilities.importer import AdvisoryData
18+
from vulnerabilities.importer import AffectedPackage
1419
from vulnerabilities.importer import GitImporter
1520
from vulnerabilities.importer import Reference
16-
from pathlib import Path
1721
from vulnerabilities.utils import load_yaml
18-
from vulnerabilities.utils import nearest_patched_package
22+
23+
logger = logging.getLogger(__name__)
1924

2025

2126
class KaybeeImporter(GitImporter):
2227
spdx_license_expression = "MIT"
2328
license_url = "https://gitlab.com/gitlab-org/advisories-community/-/blob/main/LICENSE"
2429

2530
def __init__(self):
26-
super().__init__(repo_url="git+https://github.com/SAP/project-kb/tree/vulnerability-data")
27-
31+
super().__init__(repo_url="git+https://github.com/SAP/project-kb.git@vulnerability-data")
32+
2833
def advisory_data(self, _keep_clone=True) -> Iterable[AdvisoryData]:
2934
try:
3035
self.clone()
3136
base_path = Path(self.vcs_response.dest_dir)
3237
statements = base_path.glob("statements/**/*.yaml")
3338
for statement_file in statements:
34-
yaml_file_to_advisory(statement_file)
35-
39+
yield yaml_file_to_advisory(statement_file)
40+
3641
finally:
3742
if self.vcs_response and not _keep_clone:
3843
self.vcs_response.delete()
3944

4045

41-
4246
def yaml_file_to_advisory(yaml_path):
4347
references = []
4448

4549
data = load_yaml(yaml_path)
46-
vuln_id = data["vulnerability_id"]
50+
aliases = []
51+
vuln_id = data.get("vulnerability_id")
52+
if vuln_id:
53+
aliases.append(vuln_id)
4754
summary = ""
48-
if data.get("text"):
49-
summary = "\n".join([note["text"] for note in data["notes"]])
55+
notes = data.get("notes")
56+
if notes:
57+
note_texts = []
58+
for note in notes:
59+
note_text = note.get("text")
60+
if note_text:
61+
note_texts.append(note_text)
62+
summary = "\n".join(note_texts)
63+
64+
affected_packages = []
5065

5166
for entry in data.get("artifacts", []):
52-
package = PackageURL.from_string(entry["id"])
53-
if entry["affected"]:
54-
impacted_packages.append(package)
67+
purl = entry.get("id")
68+
if not purl:
69+
continue
70+
package = PackageURL.from_string(purl)
71+
version = package.version
72+
affected_version_range = None
73+
fixed_version = None
74+
vrc = version_range.RANGE_CLASS_BY_SCHEMES.get(package.type)
75+
if not vrc:
76+
logger.warning(f"Unknown package type {package.type} for {purl} in {vuln_id}")
77+
continue
78+
if entry.get("affected"):
79+
affected_version_range = vrc.from_versions([version])
5580
else:
56-
resolved_packages.append(package)
81+
fixed_version = vrc.version_class(version)
82+
versionless_purl = PackageURL(
83+
type=package.type,
84+
namespace=package.namespace,
85+
name=package.name,
86+
qualifiers=package.qualifiers,
87+
subpath=package.subpath,
88+
)
89+
affected_packages.append(
90+
AffectedPackage(
91+
package=versionless_purl,
92+
affected_version_range=affected_version_range,
93+
fixed_version=fixed_version,
94+
)
95+
)
5796

58-
for fix in data.get("fixes", []):
59-
for commit in fix["commits"]:
97+
for fix in data.get("fixes") or []:
98+
for commit in fix.get("commits") or []:
6099
references.append(Reference(url=f"{commit['repository']}/{commit['id']}"))
61100

62101
return AdvisoryData(
63-
vulnerability_id=vuln_id,
102+
aliases=aliases,
64103
summary=summary,
65-
affected_packages=nearest_patched_package(impacted_packages, resolved_packages),
104+
affected_packages=affected_packages,
66105
references=references,
67106
)

0 commit comments

Comments
 (0)