9 from typing
import Dict, Union
10 from packageurl.contrib
import purl2url
15 Parser to classify each component based on it's type.
16 Ex: If purl is pkg:pypi/django@1.11.1,
17 it is a pypi package and should belong to python_components.
21 Initialize components list and load the sbom_data.
23 sbom_file: str | Path to sbom file
25 with open(sbom_file,
'r')
as file:
34 Classify components based on it's type
36 for component
in self.
sbom_datasbom_data.
get(
'components',[]):
37 purl = component.get(
'purl')
53 Extracts the package type from the purl.
54 Example purl: pkg:pypi/django@1.11.1
55 The type here is 'pypi'.
57 purl: str | Purl of the package to scan
59 purl_type: str | Type of component or None
63 if purl.startswith(
"pkg:"):
64 purl_type = purl.split(
':')[1].split(
'/')[0]
73 Python Parser to parse the python sboms to generate download urls from
74 cyclonedx format sbom files.
79 Returns list of package name and version from SBOM component.
81 components: list[Dict]
83 list[str, str]: Name and versions of packages from sbom file
85 return [(comp[
'name'], comp[
'version'])
for comp
in components]
89 Generate JSON REST API Endpoint to fetch download url.
91 package_name: str Name of package
92 version: str Version of paclage
94 JSON REST API endpoint tp fetch metadata of package
96 return f
"https://pypi.org/pypi/{package_name}/{version}/json"
98 def parse_components(self, components: list[Dict]) -> Union[list[tuple[str,str]],
None]:
100 Parse SBOM file for package name and download url of package.
102 sbom_file: str Path to sbom_file
104 list of tuples with package_name and download_url of that package
109 for package_name, version
in packages:
111 print(f
"API endpoint for {package_name} : {api_endpoint}")
112 response = requests.get(api_endpoint)
114 if response.status_code == 200:
115 data = response.json()
119 for url_info
in data.get(
'urls', []):
120 if url_info.get(
'packagetype') ==
'sdist':
121 sdist_url = url_info.get(
'url')
122 elif url_info.get(
'packagetype') ==
'bdist_wheel':
123 wheel_url = url_info.get(
'url')
126 download_url = sdist_url
if sdist_url
else wheel_url
128 download_urls.append((package_name, download_url))
130 print(f
"No suitable download URL found for {package_name} {version}")
132 print(f
"Failed to retrieve data for {package_name} {version}")
134 return download_urls
if download_urls
else None
139 NPM Parser to parse the python sboms to generate download urls from
140 cyclonedx format sbom files.
145 Get download url from purl for NPM Packages
151 return purl2url.get_download_url(purl)
155 Parse the components to extract the tuple of (<package_name>, <download_url>)
157 components: list[Dict]
159 List[tuple(str,str)] (<package_name>, <download_url>)
162 for comp
in components:
167 download_urls.append((name, download_url))
168 except Exception
as e:
169 print(f
"Invalid Download URL for NPM package: {name} :: {e}")
171 return download_urls
if download_urls
else None
Union[list[tuple[str, str]], None] parse_components(self, list[Dict] components)
def _get_download_url(self, str purl)
def classify_components(self)
Union[str, None] _extract_type(self, str purl)
def __init__(self, str sbom_file)
Union[list[tuple[str, str]], None] parse_components(self, list[Dict] components)
str _generate_api_endpoint(self, str package_name, str version)
list[str, str] _process_components(self, list[Dict] components)