diff --git a/syft/sbom/sbom.go b/syft/sbom/sbom.go index 0631bd08a..6c3e8e9f4 100644 --- a/syft/sbom/sbom.go +++ b/syft/sbom/sbom.go @@ -23,3 +23,37 @@ type Artifacts struct { Secrets map[source.Coordinates][]file.SearchResult Distro *distro.Distro } + +func AllCoordinates(sbom SBOM) []source.Coordinates { + set := source.NewCoordinateSet() + for coordinates := range sbom.Artifacts.FileMetadata { + set.Add(coordinates) + } + for coordinates := range sbom.Artifacts.FileContents { + set.Add(coordinates) + } + for coordinates := range sbom.Artifacts.FileClassifications { + set.Add(coordinates) + } + for coordinates := range sbom.Artifacts.FileDigests { + set.Add(coordinates) + } + for _, relationship := range sbom.Relationships { + for _, coordinates := range extractCoordinates(relationship) { + set.Add(coordinates) + } + } + return set.ToSlice() +} + +func extractCoordinates(relationship artifact.Relationship) (results []source.Coordinates) { + if coordinates, exists := relationship.From.(source.Coordinates); exists { + results = append(results, coordinates) + } + + if coordinates, exists := relationship.To.(source.Coordinates); exists { + results = append(results, coordinates) + } + + return results +}