Skip to content

Commit 377cf0f

Browse files
authored
refactor: sbom_manager (#4237)
refactored sbom_manager to have similar structure to vex_manager. * swid parsing is moved to sbomparse class
1 parent fbe2d13 commit 377cf0f

File tree

10 files changed

+591
-583
lines changed

10 files changed

+591
-583
lines changed

cve_bin_tool/cli.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@
7070
from cve_bin_tool.merge import MergeReports
7171
from cve_bin_tool.output_engine import OutputEngine
7272
from cve_bin_tool.package_list_parser import PackageListParser
73-
from cve_bin_tool.sbom_detection import sbom_detection
74-
from cve_bin_tool.sbom_manager import SBOMManager
73+
from cve_bin_tool.sbom_manager.parse import SBOMParse
74+
from cve_bin_tool.sbom_manager.sbom_detection import sbom_detection
7575
from cve_bin_tool.util import ProductInfo
7676
from cve_bin_tool.version import VERSION
7777
from cve_bin_tool.version_scanner import VersionScanner
@@ -1048,13 +1048,13 @@ def main(argv=None):
10481048
if args["sbom_file"]:
10491049
sbom_root = args["sbom_file"]
10501050
# Process SBOM file
1051-
sbom_list = SBOMManager(
1051+
sbom_list = SBOMParse(
10521052
args["sbom_file"],
10531053
sbom_type=args["sbom"],
10541054
logger=LOGGER,
10551055
validate=not args["disable_validation_check"],
10561056
)
1057-
parsed_data = sbom_list.scan_file()
1057+
parsed_data = sbom_list.parse_sbom()
10581058
LOGGER.info(
10591059
f"The number of products to process from SBOM - {len(parsed_data)}"
10601060
)

cve_bin_tool/output_engine/__init__.py

Lines changed: 17 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,13 @@
1313
from pathlib import Path
1414
from typing import IO, Any
1515

16-
from lib4sbom.data.package import SBOMPackage
17-
from lib4sbom.data.relationship import SBOMRelationship
18-
from lib4sbom.generator import SBOMGenerator
19-
from lib4sbom.sbom import SBOM
20-
21-
from ..cve_scanner import CVEData
22-
from ..cvedb import CVEDB
23-
from ..error_handler import ErrorHandler, ErrorMode
24-
from ..log import LOGGER
25-
from ..util import ProductInfo, Remarks, VersionInfo
26-
from ..version import VERSION
27-
from .console import output_console
28-
from .html import output_html
29-
from .util import (
16+
from cve_bin_tool.cve_scanner import CVEData
17+
from cve_bin_tool.cvedb import CVEDB
18+
from cve_bin_tool.error_handler import ErrorHandler, ErrorMode
19+
from cve_bin_tool.log import LOGGER
20+
from cve_bin_tool.output_engine.console import output_console
21+
from cve_bin_tool.output_engine.html import output_html
22+
from cve_bin_tool.output_engine.util import (
3023
add_extension_if_not,
3124
format_output,
3225
format_path,
@@ -35,6 +28,9 @@
3528
get_cve_summary,
3629
intermediate_output,
3730
)
31+
from cve_bin_tool.sbom_manager.generate import SBOMGenerate
32+
from cve_bin_tool.util import ProductInfo, Remarks, VersionInfo
33+
from cve_bin_tool.version import VERSION
3834

3935

4036
def output_json(
@@ -794,13 +790,15 @@ def output_cves(self, outfile, output_type="console"):
794790
if self.vex_filename != "":
795791
self.generate_vex(self.all_cve_data, self.vex_filename)
796792
if self.sbom_filename != "":
797-
self.generate_sbom(
793+
sbomgen = SBOMGenerate(
798794
self.all_product_data,
799-
filename=self.sbom_filename,
800-
sbom_type=self.sbom_type,
801-
sbom_format=self.sbom_format,
802-
sbom_root=self.sbom_root,
795+
self.sbom_filename,
796+
self.sbom_type,
797+
self.sbom_format,
798+
self.sbom_root,
799+
self.logger,
803800
)
801+
sbomgen.generate_sbom()
804802

805803
def generate_vex(self, all_cve_data: dict[ProductInfo, CVEData], filename: str):
806804
"""Generate a vex file and create vulnerability entry."""
@@ -906,78 +904,6 @@ def generate_vex(self, all_cve_data: dict[ProductInfo, CVEData], filename: str):
906904
with open(filename, "w") as outfile:
907905
json.dump(vex_output, outfile, indent=" ")
908906

909-
def generate_sbom(
910-
self,
911-
all_product_data,
912-
filename="",
913-
sbom_type="spdx",
914-
sbom_format="tag",
915-
sbom_root="CVE-SCAN",
916-
):
917-
"""Create SBOM package and generate SBOM file."""
918-
# Create SBOM
919-
sbom_relationships = []
920-
my_package = SBOMPackage()
921-
sbom_relationship = SBOMRelationship()
922-
923-
# Create root package
924-
my_package.initialise()
925-
root_package = f'CVEBINTOOL-{Path(sbom_root).name.replace(".", "-")}'
926-
parent = f"SBOM_{root_package}"
927-
my_package.set_name(root_package)
928-
my_package.set_type("application")
929-
my_package.set_filesanalysis(False)
930-
my_package.set_downloadlocation(sbom_root)
931-
license = "NOASSERTION"
932-
my_package.set_licensedeclared(license)
933-
my_package.set_licenseconcluded(license)
934-
my_package.set_supplier("UNKNOWN", "NOASSERTION")
935-
936-
# Store package data
937-
self.sbom_packages[(my_package.get_name(), my_package.get_value("version"))] = (
938-
my_package.get_package()
939-
)
940-
sbom_relationship.initialise()
941-
sbom_relationship.set_relationship(parent, "DESCRIBES", root_package)
942-
sbom_relationships.append(sbom_relationship.get_relationship())
943-
944-
# Add dependent products
945-
for product_data in all_product_data:
946-
my_package.initialise()
947-
my_package.set_name(product_data.product)
948-
my_package.set_version(product_data.version)
949-
if product_data.vendor.casefold() != "UNKNOWN".casefold():
950-
my_package.set_supplier("Organization", product_data.vendor)
951-
my_package.set_licensedeclared(license)
952-
my_package.set_licenseconcluded(license)
953-
if not (
954-
(my_package.get_name(), my_package.get_value("version"))
955-
in self.sbom_packages
956-
and product_data.vendor == "unknown"
957-
):
958-
location = product_data.location
959-
my_package.set_evidence(location) # Set location directly
960-
self.sbom_packages[
961-
(my_package.get_name(), my_package.get_value("version"))
962-
] = my_package.get_package()
963-
sbom_relationship.initialise()
964-
sbom_relationship.set_relationship(
965-
root_package, "DEPENDS_ON", product_data.product
966-
)
967-
sbom_relationships.append(sbom_relationship.get_relationship())
968-
969-
# Generate SBOM
970-
my_sbom = SBOM()
971-
my_sbom.add_packages(self.sbom_packages)
972-
my_sbom.add_relationships(sbom_relationships)
973-
my_generator = SBOMGenerator(
974-
sbom_type=sbom_type,
975-
format=sbom_format,
976-
application="cve-bin-tool",
977-
version=VERSION,
978-
)
979-
my_generator.generate(parent, my_sbom.get_sbom(), filename=filename)
980-
981907
def output_file_wrapper(self, output_types=["console"]):
982908
"""Call output_file method for all output types."""
983909
for output_type in output_types:

0 commit comments

Comments
 (0)