9 from typing
import Dict, Union
14 Parser to classify each component based on it's type.
15 Ex: If purl is pkg:pypi/django@1.11.1,
16 it is a pypi package and should belong to python_components.
20 Initialize components list and load the sbom_data.
22 sbom_file: str | Path to sbom file
24 with open(sbom_file,
'r')
as file:
33 Classify components based on it's type
35 for component
in self.
sbom_datasbom_data.
get(
'components',[]):
36 purl = component.get(
'purl')
52 Extracts the package type from the purl.
53 Example purl: pkg:pypi/django@1.11.1
54 The type here is 'pypi'.
56 purl: str | Purl of the package to scan
58 purl_type: str | Type of component or None
62 if purl.startswith(
"pkg:"):
63 purl_type = purl.split(
':')[1].split(
'/')[0]
66 except Exception
as e:
72 Python Parser to parse the python sboms to generate download urls from
73 cyclonedx format sbom files.
78 Returns list of package name and version from SBOM component.
80 components: list[Dict]
82 list[str, str]: Name and versions of packages from sbom file
84 return [(comp[
'name'], comp[
'version'])
for comp
in components]
88 Generate JSON REST API Endpoint to fetch download url.
90 package_name: str Name of package
91 version: str Version of paclage
93 JSON REST API endpoint tp fetch metadata of package
95 return f
"https://pypi.org/pypi/{package_name}/{version}/json"
97 def parse_components(self, components: list[Dict]) -> Union[list[tuple[str,str]],
None]:
99 Parse SBOM file for package name and download url of package.
101 sbom_file: str Path to sbom_file
103 list of tuples with package_name and download_url of that package
108 for package_name, version
in packages:
110 print(f
"API endpoint for {package_name} : {api_endpoint}")
111 response = requests.get(api_endpoint)
113 if response.status_code == 200:
114 data = response.json()
118 for url_info
in data.get(
'urls', []):
119 if url_info.get(
'packagetype') ==
'sdist':
120 sdist_url = url_info.get(
'url')
121 elif url_info.get(
'packagetype') ==
'bdist_wheel':
122 wheel_url = url_info.get(
'url')
125 download_url = sdist_url
if sdist_url
else wheel_url
127 download_urls.append((package_name, download_url))
129 print(f
"No suitable download URL found for {package_name} {version}")
131 print(f
"Failed to retrieve data for {package_name} {version}")
133 return download_urls
if download_urls
else None
def classify_components(self)
Union[str, None] _extract_type(self, str purl)
def __init__(self, str sbom_file)
str __generate_api_endpoint(self, str package_name, str version)
Union[list[tuple[str, str]], None] parse_components(self, list[Dict] components)
list[str, str] __process_components(self, list[Dict] components)