Sat, 04 Jun 2022 16:57:02 +0200
CycloneDX
- added capability to list dependencies in the SBOM file
9117
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1 | # -*- coding: utf-8 -*- |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
3 | # Copyright (c) 2022 Detlev Offenbach <detlev@die-offenbachs.de> |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4 | # |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6 | """ |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7 | Module implementing the interface to CycloneDX. |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8 | """ |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
10 | import os |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12 | from PyQt6.QtCore import QCoreApplication |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13 | from PyQt6.QtWidgets import QDialog |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15 | from EricWidgets.EricApplication import ericApp |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16 | from EricWidgets import EricMessageBox |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18 | from packageurl import PackageURL |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20 | from cyclonedx.model import LicenseChoice |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21 | from cyclonedx.model.bom import Bom |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22 | from cyclonedx.model.component import Component |
9119 | 23 | from cyclonedx.model.vulnerability import Vulnerability, VulnerabilitySource |
9117
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24 | from cyclonedx.output import ( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25 | OutputFormat, SchemaVersion, get_instance as get_output_instance |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26 | ) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27 | from cyclonedx.parser import BaseParser |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29 | from cyclonedx_py.parser.pipenv import PipEnvFileParser |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30 | from cyclonedx_py.parser.poetry import PoetryFileParser |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31 | from cyclonedx_py.parser.requirements import RequirementsFileParser |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32 | |
9119 | 33 | from PipInterface.PipVulnerabilityChecker import ( |
34 | Package, VulnerabilityCheckError | |
35 | ) | |
36 | ||
9117
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38 | class CycloneDXEnvironmentParser(BaseParser): |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39 | """ |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40 | Class implementing a parser to get package data for a named environment. |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41 | """ |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42 | def __init__(self, venvName): |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43 | """ |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44 | Constructor |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46 | @param venvName name of the virtual environment |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47 | @type str |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48 | """ |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49 | super().__init__() |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51 | pip = ericApp().getObject("Pip") |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52 | packages = pip.getLicenses(venvName) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53 | for package in packages: |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54 | comp = Component( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55 | name=package["Name"], |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56 | version=package["Version"], |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57 | author=package["Author"], |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58 | description=package["Description"], |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59 | purl=PackageURL( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60 | type='pypi', |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61 | name=package["Name"], |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62 | version=package["Version"] |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63 | ) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64 | ) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65 | for lic in package["License"].split(";"): |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66 | comp.licenses.add( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67 | LicenseChoice(license_expression=lic.strip()) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68 | ) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70 | self._components.append(comp) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73 | def createCycloneDXFile(venvName): |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74 | """ |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75 | Function to create a CyccloneDX SBOM file. |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77 | @param venvName name of the virtual environment |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78 | @type str |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79 | @exception RuntimeError raised to indicate illegal creation parameters |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80 | """ |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81 | from .CycloneDXConfigDialog import CycloneDXConfigDialog |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82 | dlg = CycloneDXConfigDialog(venvName) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83 | if dlg.exec() == QDialog.DialogCode.Accepted: |
9119 | 84 | (inputSource, inputFile, fileFormat, schemaVersion, sbomFile, |
9122 | 85 | withVulnerabilities, withDependencies) = dlg.getData() |
9117
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86 | |
9119 | 87 | # check error conditions first |
9117
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88 | if inputSource not in ("environment", "pipenv", "poetry", |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89 | "requirements"): |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90 | raise RuntimeError("Unsupported input source given.") |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91 | if fileFormat not in ("XML", "JSON"): |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92 | raise RuntimeError("Unsupported SBOM file format given.") |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94 | if inputSource == "environment": |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95 | parser = CycloneDXEnvironmentParser(venvName) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96 | else: |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97 | # all other parsers need an input file |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98 | if not os.path.isfile(inputFile): |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99 | EricMessageBox.warning( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100 | None, |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101 | QCoreApplication.translate( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102 | "CycloneDX", "CycloneDX - SBOM Creation"), |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103 | QCoreApplication.translate( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104 | "CycloneDX", |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105 | "<p>The configured input file <b>{0}</b> does not" |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106 | " exist. Aborting...</p>" |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107 | ).format(inputFile) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108 | ) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109 | return |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111 | if inputSource == "pipenv": |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112 | parser = PipEnvFileParser(pipenv_lock_filename=inputFile) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113 | elif inputSource == "poetry": |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114 | parser = PoetryFileParser(poetry_lock_filename=inputFile) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115 | elif inputSource == "requirements": |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116 | parser = RequirementsFileParser(requirements_file=inputFile) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117 | |
9119 | 118 | if withVulnerabilities: |
119 | addCycloneDXVulnerabilities(parser) | |
120 | ||
9122 | 121 | if withDependencies: |
122 | addCycloneDXDependencies(parser, venvName) | |
123 | ||
9117
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124 | if fileFormat == "XML": |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125 | outputFormat = OutputFormat.XML |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
126 | elif fileFormat == "JSON": |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127 | outputFormat = OutputFormat.JSON |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
129 | if parser.has_warnings(): |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130 | excludedList = ["<li>{0}</li>".format(warning.get_item()) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131 | for warning in parser.get_warnings()] |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132 | EricMessageBox.warning( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133 | None, |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134 | QCoreApplication.translate( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135 | "CycloneDX", "CycloneDX - SBOM Creation"), |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136 | QCoreApplication.translate( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137 | "CycloneDX", |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138 | "<p>Some of the dependencies do not have pinned version" |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139 | " numbers.<ul>{0}</ul>The above listed packages will NOT" |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140 | " be included in the generated CycloneDX SBOM file as" |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141 | " version is a mandatory field.</p>" |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142 | ).format("".join(excludedList)) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143 | ) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145 | bom = Bom.from_parser(parser=parser) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146 | output = get_output_instance( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147 | bom=bom, |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148 | output_format=outputFormat, |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149 | schema_version=SchemaVersion['V{0}'.format( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150 | schemaVersion.replace('.', '_') |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151 | )] |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152 | ) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153 | output.output_to_file(filename=sbomFile, allow_overwrite=True) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154 | |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155 | EricMessageBox.information( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156 | None, |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157 | QCoreApplication.translate( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158 | "CycloneDX", "CycloneDX - SBOM Creation"), |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159 | QCoreApplication.translate( |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160 | "CycloneDX", |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161 | "<p>The SBOM data was written to file <b>{0}</b>.</p>" |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162 | ).format(sbomFile) |
c6afba2049cf
CycloneDX Interface
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
163 | ) |
9119 | 164 | |
165 | ||
166 | def addCycloneDXVulnerabilities(parser): | |
167 | """ | |
168 | Function to add vulnerability data to the list of created components. | |
169 | ||
170 | @param parser reference to the parser object containing the list of | |
171 | components | |
172 | @type BaseParser | |
173 | """ | |
174 | components = parser.get_components() | |
175 | ||
176 | packages = [ | |
177 | Package(name=component.name, version=component.version) | |
178 | for component in components | |
179 | ] | |
180 | ||
181 | pip = ericApp().getObject("Pip") | |
182 | error, vulnerabilities = pip.getVulnerabilityChecker().check(packages) | |
183 | ||
184 | if error == VulnerabilityCheckError.OK: | |
185 | for package in vulnerabilities: | |
186 | component = findCyccloneDXComponent(components, package) | |
187 | if component: | |
188 | for vuln in vulnerabilities[package]: | |
189 | component.add_vulnerability(Vulnerability( | |
190 | id=vuln.cve, | |
191 | description=vuln.advisory, | |
192 | recommendation="upgrade required", | |
193 | source=VulnerabilitySource(name="pyup.io") | |
194 | )) | |
195 | ||
196 | ||
9122 | 197 | def addCycloneDXDependencies(parser, venvName): |
198 | """ | |
199 | Function to add dependency data to the list of created components. | |
200 | ||
201 | @param parser reference to the parser object containing the list of | |
202 | components | |
203 | @type BaseParser | |
204 | @param venvName name of the virtual environment | |
205 | @type str | |
206 | """ | |
207 | components = parser.get_components() | |
208 | ||
209 | pip = ericApp().getObject("Pip") | |
210 | dependencies = pip.getDependencyTree(venvName) | |
211 | for dependency in dependencies: | |
212 | _addCycloneDXDependency(dependency, components) | |
213 | ||
214 | ||
215 | def _addCycloneDXDependency(dependency, components): | |
216 | """ | |
217 | Function to add a dependency to the given list of components. | |
218 | ||
219 | @param dependency dependency to be added | |
220 | @type dict | |
221 | @param components list of components | |
222 | @type list of Component | |
223 | """ | |
224 | component = findCyccloneDXComponent(components, dependency["package_name"]) | |
225 | if component is not None: | |
226 | bomRefs = component.dependencies | |
227 | for dep in dependency["dependencies"]: | |
228 | depComponent = findCyccloneDXComponent( | |
229 | components, dep["package_name"]) | |
230 | if depComponent is not None: | |
231 | bomRefs.add(depComponent.bom_ref) | |
232 | # recursively add sub-dependencies | |
233 | _addCycloneDXDependency(dep, components) | |
234 | component.dependencies = bomRefs | |
235 | ||
236 | ||
9119 | 237 | def findCyccloneDXComponent(components, name): |
238 | """ | |
239 | Function to find a component in a given list of components. | |
240 | ||
241 | @param components list of components to scan | |
242 | @type list of Component | |
243 | @param name name of the component to search for | |
244 | @type str | |
245 | @return reference to the found component or None | |
246 | @rtype Component or None | |
247 | """ | |
248 | for component in components: | |
249 | if component.name == name: | |
250 | return component | |
251 | ||
252 | return None |