diff options
author | Wei Li <weiwli@google.com> | 2023-05-15 15:11:43 -0700 |
---|---|---|
committer | Wei Li <weiwli@google.com> | 2023-05-23 23:12:36 +0000 |
commit | 6284936f20f564ced4989d7b35974d492859b3c9 (patch) | |
tree | 0b4e1abdc12506f544f3bd03514bc54cbe675c3e | |
parent | a75b82f9d240a3e9c49076cc9025b627591e634d (diff) | |
download | build-6284936f20f564ced4989d7b35974d492859b3c9.tar.gz |
Add upstream package of a prebuilt fork package, which will have the package information from the METADATA file.
Bug: 266726655
Test: CIs
Test: lunch barbet-user && m sbom
(cherry picked from https://android-review.googlesource.com/q/commit:16e7aa3c2ea779ff91a0d88b431a2437964ae1a6)
Merged-In: Ic8eb42c369de8c94c7977b9631ff4b9084dfef01
Change-Id: Ic8eb42c369de8c94c7977b9631ff4b9084dfef01
-rwxr-xr-x | tools/sbom/generate-sbom.py | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/tools/sbom/generate-sbom.py b/tools/sbom/generate-sbom.py index 1e98699a47..2415f7e270 100755 --- a/tools/sbom/generate-sbom.py +++ b/tools/sbom/generate-sbom.py @@ -263,8 +263,8 @@ def get_package_download_location(metadata_file_path): def get_sbom_fragments(installed_file_metadata, metadata_file_path): """Return SPDX fragment of source/prebuilt packages, which usually contains a SOURCE/PREBUILT - package, a UPSTREAM package if it's a source package and a external SBOM document reference if - it's a prebuilt package with sbom_ref defined in its METADATA file. + package, a UPSTREAM package and an external SBOM document reference if sbom_ref defined in its + METADATA file. See go/android-spdx and go/android-sbom-gen for more details. """ @@ -301,25 +301,33 @@ def get_sbom_fragments(installed_file_metadata, metadata_file_path): prebuilt_package = sbom_data.Package(id=prebuilt_package_id, name=name, download_location=sbom_data.VALUE_NONE, - version=args.build_version, + version=version if version else args.build_version, supplier='Organization: ' + args.product_mfr) - packages.append(prebuilt_package) - - if metadata_file_path: - metadata_proto = metadata_file_protos[metadata_file_path] - if metadata_proto.third_party.WhichOneof('sbom') == 'sbom_ref': - sbom_url = metadata_proto.third_party.sbom_ref.url - sbom_checksum = metadata_proto.third_party.sbom_ref.checksum - upstream_element_id = metadata_proto.third_party.sbom_ref.element_id - if sbom_url and sbom_checksum and upstream_element_id: - doc_ref_id = f'DocumentRef-{PKG_UPSTREAM}-{encode_for_spdxid(name)}' - external_doc_ref = sbom_data.DocumentExternalReference(id=doc_ref_id, - uri=sbom_url, - checksum=sbom_checksum) - relationships.append( - sbom_data.Relationship(id1=prebuilt_package_id, - relationship=sbom_data.RelationshipType.VARIANT_OF, - id2=doc_ref_id + ':' + upstream_element_id)) + + upstream_package_id = new_package_id(name, PKG_UPSTREAM) + upstream_package = sbom_data.Package(id=upstream_package_id, name=name, version = version, + supplier=('Organization: ' + homepage) if homepage else sbom_data.VALUE_NOASSERTION, + download_location=download_location) + packages += [prebuilt_package, upstream_package] + relationships.append(sbom_data.Relationship(id1=prebuilt_package_id, + relationship=sbom_data.RelationshipType.VARIANT_OF, + id2=upstream_package_id)) + + if metadata_file_path: + metadata_proto = metadata_file_protos[metadata_file_path] + if metadata_proto.third_party.WhichOneof('sbom') == 'sbom_ref': + sbom_url = metadata_proto.third_party.sbom_ref.url + sbom_checksum = metadata_proto.third_party.sbom_ref.checksum + upstream_element_id = metadata_proto.third_party.sbom_ref.element_id + if sbom_url and sbom_checksum and upstream_element_id: + doc_ref_id = f'DocumentRef-{PKG_UPSTREAM}-{encode_for_spdxid(name)}' + external_doc_ref = sbom_data.DocumentExternalReference(id=doc_ref_id, + uri=sbom_url, + checksum=sbom_checksum) + relationships.append( + sbom_data.Relationship(id1=upstream_package_id, + relationship=sbom_data.RelationshipType.VARIANT_OF, + id2=doc_ref_id + ':' + upstream_element_id)) return external_doc_ref, packages, relationships |