Skip to content

Commit e993302

Browse files
ruromeroclaude
andcommitted
fix: place root component only in metadata.component, not in components[]
Per CycloneDX spec, the root component belongs in metadata.component only. Previously it was duplicated in the components[] array, causing SBOM parity issues between Java and JavaScript clients. - Remove root component addition from addRoot() - Update addDependency() to skip adding root as a component - Update all 70 expected SBOM test fixtures to reflect the change Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent c77e471 commit e993302

71 files changed

Lines changed: 10 additions & 677 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/main/java/io/github/guacsec/trustifyda/sbom/CycloneDXSbom.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ public Sbom addRoot(PackageURL rootRef, String license) {
136136
}
137137
}
138138
bom.getMetadata().setComponent(rootComponent);
139-
bom.getComponents().add(rootComponent);
140139
bom.getDependencies().add(newDependency(rootRef));
141140
return this;
142141
}
@@ -266,13 +265,12 @@ public Sbom addDependency(PackageURL sourceRef, PackageURL targetRef, String s)
266265
if (s != null) {
267266
scope = Component.Scope.valueOf(s.toUpperCase());
268267
}
268+
String rootCoordinates = root != null ? root.getCoordinates() : null;
269269
Component srcComp = newComponent(sourceRef, scope);
270+
boolean isRootSource = srcComp.getBomRef().equals(rootCoordinates);
270271
Dependency srcDep;
271-
if (bom.getComponents().stream().noneMatch(c -> c.getBomRef().equals(srcComp.getBomRef()))) {
272-
bom.addComponent(srcComp);
273-
srcDep = newDependency(sourceRef);
274-
bom.addDependency(srcDep);
275-
} else {
272+
if (isRootSource
273+
|| bom.getComponents().stream().anyMatch(c -> c.getBomRef().equals(srcComp.getBomRef()))) {
276274
Optional<Dependency> existingDep =
277275
bom.getDependencies().stream()
278276
.filter(d -> d.getRef().equals(srcComp.getBomRef()))
@@ -283,13 +281,18 @@ public Sbom addDependency(PackageURL sourceRef, PackageURL targetRef, String s)
283281
srcDep = newDependency(sourceRef);
284282
bom.addDependency(srcDep);
285283
}
284+
} else {
285+
bom.addComponent(srcComp);
286+
srcDep = newDependency(sourceRef);
287+
bom.addDependency(srcDep);
286288
}
287289
Dependency targetDep = newDependency(targetRef);
288290
srcDep.addDependency(targetDep);
289291
if (bom.getDependencies().stream().noneMatch(d -> d.getRef().equals(targetDep.getRef()))) {
290292
bom.addDependency(targetDep);
291293
}
292-
if (bom.getComponents().stream().noneMatch(c -> c.getBomRef().equals(targetDep.getRef()))) {
294+
if (!targetDep.getRef().equals(rootCoordinates)
295+
&& bom.getComponents().stream().noneMatch(c -> c.getBomRef().equals(targetDep.getRef()))) {
293296
bom.addComponent(newComponent(targetRef, scope));
294297
}
295298
return this;

src/test/resources/msc/golang/expected_sbom_ca.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,6 @@
1313
}
1414
},
1515
"components" : [
16-
{
17-
"type" : "application",
18-
"bom-ref" : "pkg:golang/github.com/sample/demo-app@v0.0.0",
19-
"group" : "github.com/sample",
20-
"name" : "demo-app",
21-
"version" : "v0.0.0",
22-
"purl" : "pkg:golang/github.com/sample/demo-app@v0.0.0"
23-
},
2416
{
2517
"type" : "library",
2618
"bom-ref" : "pkg:golang/github.com/gin-gonic/gin@v1.6.0",

src/test/resources/msc/golang/mvs_logic/expected_sbom_stack_analysis.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,6 @@
1313
}
1414
},
1515
"components": [
16-
{
17-
"type": "application",
18-
"bom-ref": "pkg:golang/github.com/rhecosystemappeng/saasi/deployer@v0.0.0",
19-
"group": "github.com/rhecosystemappeng/saasi",
20-
"name": "deployer",
21-
"version": "v0.0.0",
22-
"purl": "pkg:golang/github.com/rhecosystemappeng/saasi/deployer@v0.0.0"
23-
},
2416
{
2517
"type": "library",
2618
"bom-ref": "pkg:golang/cloud.google.com/go@v0.52.0",

src/test/resources/tst_manifests/golang/go_mod_light_no_ignore/expected_sbom_component_analysis.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,6 @@
1414
}
1515
},
1616
"components" : [
17-
{
18-
"type" : "application",
19-
"bom-ref" : "pkg:golang/golang.org/x/example@v0.0.0",
20-
"group" : "golang.org/x",
21-
"name" : "example",
22-
"version" : "v0.0.0",
23-
"purl" : "pkg:golang/golang.org/x/example@v0.0.0"
24-
},
2517
{
2618
"type" : "library",
2719
"bom-ref" : "pkg:golang/github.com/spf13/cobra@v0.0.5",

src/test/resources/tst_manifests/golang/go_mod_light_no_ignore/expected_sbom_stack_analysis.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,6 @@
1313
}
1414
},
1515
"components": [
16-
{
17-
"type": "application",
18-
"bom-ref": "pkg:golang/golang.org/x/example@v0.0.0",
19-
"group": "golang.org/x",
20-
"name": "example",
21-
"version": "v0.0.0",
22-
"purl": "pkg:golang/golang.org/x/example@v0.0.0"
23-
},
2416
{
2517
"type": "library",
2618
"bom-ref": "pkg:golang/github.com/spf13/viper@v1.3.2",

src/test/resources/tst_manifests/golang/go_mod_no_ignore/expected_sbom_component_analysis.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,6 @@
1414
}
1515
},
1616
"components" : [
17-
{
18-
"type" : "application",
19-
"bom-ref" : "pkg:golang/github.com/rhecosystemappeng/saasi/deployer@v0.0.0",
20-
"group" : "github.com/rhecosystemappeng/saasi",
21-
"name" : "deployer",
22-
"version" : "v0.0.0",
23-
"purl" : "pkg:golang/github.com/rhecosystemappeng/saasi/deployer@v0.0.0"
24-
},
2517
{
2618
"type" : "library",
2719
"bom-ref" : "pkg:golang/github.com/davecgh/go-spew@v1.1.1",

src/test/resources/tst_manifests/golang/go_mod_no_ignore/expected_sbom_stack_analysis.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,6 @@
1313
}
1414
},
1515
"components": [
16-
{
17-
"type": "application",
18-
"bom-ref": "pkg:golang/github.com/rhecosystemappeng/saasi/deployer@v0.0.0",
19-
"group": "github.com/rhecosystemappeng/saasi",
20-
"name": "deployer",
21-
"version": "v0.0.0",
22-
"purl": "pkg:golang/github.com/rhecosystemappeng/saasi/deployer@v0.0.0"
23-
},
2416
{
2517
"type": "library",
2618
"bom-ref": "pkg:golang/github.com/stretchr/testify@v1.8.3",

src/test/resources/tst_manifests/golang/go_mod_no_path/expected_sbom_component_analysis.json

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,6 @@
1313
}
1414
},
1515
"components" : [
16-
{
17-
"type" : "application",
18-
"bom-ref" : "pkg:golang/rhda-test@v0.0.0",
19-
"name" : "rhda-test",
20-
"version" : "v0.0.0",
21-
"purl" : "pkg:golang/rhda-test@v0.0.0"
22-
},
2316
{
2417
"type" : "library",
2518
"bom-ref" : "pkg:golang/github.com/emicklei/go-restful/v3@v3.0.0",

src/test/resources/tst_manifests/golang/go_mod_no_path/expected_sbom_stack_analysis.json

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,6 @@
1212
}
1313
},
1414
"components": [
15-
{
16-
"type": "application",
17-
"bom-ref": "pkg:golang/rhda-test@v0.0.0",
18-
"name": "rhda-test",
19-
"version": "v0.0.0",
20-
"purl": "pkg:golang/rhda-test@v0.0.0"
21-
},
2215
{
2316
"type": "library",
2417
"bom-ref": "pkg:golang/github.com/json-iterator/go@v1.1.9",

src/test/resources/tst_manifests/golang/go_mod_with_all_ignore/expected_sbom_component_analysis.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,6 @@
1313
}
1414
},
1515
"components": [
16-
{
17-
"type": "application",
18-
"bom-ref": "pkg:golang/github.com/devfile-samples/devfile-sample-go-basic@v0.0.0",
19-
"group": "github.com/devfile-samples",
20-
"name": "devfile-sample-go-basic",
21-
"version": "v0.0.0",
22-
"purl": "pkg:golang/github.com/devfile-samples/devfile-sample-go-basic@v0.0.0"
23-
},
2416
{
2517
"type": "library",
2618
"bom-ref": "pkg:golang/github.com/miekg/dns@v1.1.12",

0 commit comments

Comments
 (0)