Unexport types and functions cataloger packages (#2530)

* unexport as many types and functions from cataloger packages as possible

Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>

* capture type and signature information in convention test

Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>

* check that we return pkg.Cataloger from constructors

Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>

---------

Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
This commit is contained in:
Alex Goodman
2024-01-24 16:12:46 -05:00
committed by GitHub
parent e0e1c4ba0a
commit 11c0b1c234
12 changed files with 386 additions and 40 deletions
+8 -8
View File
@@ -1,5 +1,5 @@
/*
Package binary provides a concrete Cataloger implementations for surfacing possible packages based on signatures found within binary files.
Package binary provides a concrete cataloger implementations for surfacing possible packages based on signatures found within binary files.
*/
package binary
@@ -26,7 +26,7 @@ func DefaultCatalogerConfig() CatalogerConfig {
}
func NewCataloger(cfg CatalogerConfig) pkg.Cataloger {
return &Cataloger{
return &cataloger{
classifiers: cfg.Classifiers,
}
}
@@ -40,23 +40,23 @@ func (cfg CatalogerConfig) MarshalJSON() ([]byte, error) {
return json.Marshal(names)
}
// Cataloger is the cataloger responsible for surfacing evidence of a very limited set of binary files,
// which have been identified by the classifiers. The Cataloger is _NOT_ a place to catalog any and every
// cataloger is the cataloger responsible for surfacing evidence of a very limited set of binary files,
// which have been identified by the classifiers. The cataloger is _NOT_ a place to catalog any and every
// binary, but rather the specific set that has been curated to be important, predominantly related to toolchain-
// related runtimes like Python, Go, Java, or Node. Some exceptions can be made for widely-used binaries such
// as busybox.
type Cataloger struct {
type cataloger struct {
classifiers []Classifier
}
// Name returns a string that uniquely describes the Cataloger
func (c Cataloger) Name() string {
// Name returns a string that uniquely describes the cataloger
func (c cataloger) Name() string {
return catalogerName
}
// Catalog is given an object to resolve file references and content, this function returns any discovered Packages
// after analyzing the catalog source.
func (c Cataloger) Catalog(_ context.Context, resolver file.Resolver) ([]pkg.Package, []artifact.Relationship, error) {
func (c cataloger) Catalog(_ context.Context, resolver file.Resolver) ([]pkg.Package, []artifact.Relationship, error) {
var packages []pkg.Package
var relationships []artifact.Relationship
@@ -16,10 +16,6 @@ import (
var _ generic.Parser = parseConanfile
type Conanfile struct {
Requires []string `toml:"requires"`
}
// parseConanfile is a parser function for conanfile.txt contents, returning all packages discovered.
func parseConanfile(_ context.Context, _ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) {
r := bufio.NewReader(reader)
+2 -2
View File
@@ -25,7 +25,7 @@ import (
"github.com/anchore/syft/syft/pkg/cataloger/internal/unionreader"
)
const GOARCH = "GOARCH"
const goArch = "GOARCH"
var (
// errUnrecognizedFormat is returned when a given executable file doesn't
@@ -154,7 +154,7 @@ func extractVersionFromLDFlags(ldflags string) (majorVersion string, fullVersion
func getGOARCH(settings []debug.BuildSetting) string {
for _, s := range settings {
if s.Key == GOARCH {
if s.Key == goArch {
return s.Value
}
}
+1 -1
View File
@@ -9,7 +9,7 @@ import (
)
// NewArchiveCataloger returns a new Java archive cataloger object for detecting packages with archives (jar, war, ear, par, sar, jpi, hpi, and native-image formats)
func NewArchiveCataloger(cfg ArchiveCatalogerConfig) *generic.Cataloger {
func NewArchiveCataloger(cfg ArchiveCatalogerConfig) pkg.Cataloger {
gap := newGenericArchiveParserAdapter(cfg)
c := generic.NewCataloger("java-archive-cataloger").
@@ -92,7 +92,7 @@ type nativeImagePE struct {
header exportPrefixPE
}
type NativeImageCataloger struct{}
type nativeImageCataloger struct{}
const nativeImageCatalogerName = "graalvm-native-image-cataloger"
const nativeImageSbomSymbol = "sbom"
@@ -104,11 +104,11 @@ const nativeImageMissingExportedDataDirectoryError = "exported data directory is
// NewNativeImageCataloger returns a new Native Image cataloger object.
func NewNativeImageCataloger() pkg.Cataloger {
return &NativeImageCataloger{}
return &nativeImageCataloger{}
}
// Name returns a string that uniquely describes a native image cataloger
func (c *NativeImageCataloger) Name() string {
func (c *nativeImageCataloger) Name() string {
return nativeImageCatalogerName
}
@@ -571,7 +571,7 @@ func fetchPkgs(reader unionreader.UnionReader, filename string) []pkg.Package {
}
// Catalog attempts to find any native image executables reachable from a resolver.
func (c *NativeImageCataloger) Catalog(_ context.Context, resolver file.Resolver) ([]pkg.Package, []artifact.Relationship, error) {
func (c *nativeImageCataloger) Catalog(_ context.Context, resolver file.Resolver) ([]pkg.Package, []artifact.Relationship, error) {
var pkgs []pkg.Package
fileMatches, err := resolver.FilesByMIMEType(internal.ExecutableMIMETypeSet.List()...)
if err != nil {
@@ -13,8 +13,8 @@ import (
const gradleLockfileGlob = "**/gradle.lockfile*"
// LockfileDependency represents a single dependency in the gradle.lockfile file
type LockfileDependency struct {
// lockfileDependency represents a single dependency in the gradle.lockfile file
type lockfileDependency struct {
Group string
Name string
Version string
@@ -27,7 +27,7 @@ func parseGradleLockfile(_ context.Context, _ file.Resolver, _ *generic.Environm
scanner := bufio.NewScanner(reader)
// Create slices to hold the dependencies and plugins
dependencies := []LockfileDependency{}
dependencies := []lockfileDependency{}
// Loop over all lines in the file
for scanner.Scan() {
@@ -43,7 +43,7 @@ func parseGradleLockfile(_ context.Context, _ file.Resolver, _ *generic.Environm
// we have a version directly specified
if len(parts) == 3 {
// Create a new Dependency struct and add it to the dependencies slice
dep := LockfileDependency{Group: parts[0], Name: parts[1], Version: parts[2]}
dep := lockfileDependency{Group: parts[0], Name: parts[1], Version: parts[2]}
dependencies = append(dependencies, dep)
}
}
+7 -7
View File
@@ -15,17 +15,17 @@ import (
"github.com/anchore/syft/syft/pkg/cataloger/generic"
)
var _ pkg.Cataloger = (*LinuxKernelCataloger)(nil)
var _ pkg.Cataloger = (*linuxKernelCataloger)(nil)
type LinuxKernelCatalogerConfig struct {
CatalogModules bool `yaml:"catalog-modules" json:"catalog-modules" mapstructure:"catalog-modules"`
}
type LinuxKernelCataloger struct {
type linuxKernelCataloger struct {
cfg LinuxKernelCatalogerConfig
}
func DefaultLinuxCatalogerConfig() LinuxKernelCatalogerConfig {
func DefaultLinuxKernelCatalogerConfig() LinuxKernelCatalogerConfig {
return LinuxKernelCatalogerConfig{
CatalogModules: true,
}
@@ -45,17 +45,17 @@ var kernelModuleGlobs = []string{
}
// NewLinuxKernelCataloger returns a new kernel files cataloger object.
func NewLinuxKernelCataloger(cfg LinuxKernelCatalogerConfig) *LinuxKernelCataloger {
return &LinuxKernelCataloger{
func NewLinuxKernelCataloger(cfg LinuxKernelCatalogerConfig) pkg.Cataloger {
return &linuxKernelCataloger{
cfg: cfg,
}
}
func (l LinuxKernelCataloger) Name() string {
func (l linuxKernelCataloger) Name() string {
return "linux-kernel-cataloger"
}
func (l LinuxKernelCataloger) Catalog(ctx context.Context, resolver file.Resolver) ([]pkg.Package, []artifact.Relationship, error) {
func (l linuxKernelCataloger) Catalog(ctx context.Context, resolver file.Resolver) ([]pkg.Package, []artifact.Relationship, error) {
var allPackages []pkg.Package
var allRelationships []artifact.Relationship
var errs error
+5 -5
View File
@@ -17,18 +17,18 @@ import (
const catalogerName = "nix-store-cataloger"
// StoreCataloger finds package outputs installed in the Nix store location (/nix/store/*).
type StoreCataloger struct{}
// storeCataloger finds package outputs installed in the Nix store location (/nix/store/*).
type storeCataloger struct{}
func NewStoreCataloger() pkg.Cataloger {
return &StoreCataloger{}
return &storeCataloger{}
}
func (c *StoreCataloger) Name() string {
func (c *storeCataloger) Name() string {
return catalogerName
}
func (c *StoreCataloger) Catalog(ctx context.Context, resolver file.Resolver) ([]pkg.Package, []artifact.Relationship, error) {
func (c *storeCataloger) Catalog(ctx context.Context, resolver file.Resolver) ([]pkg.Package, []artifact.Relationship, error) {
// we want to search for only directories, which isn't possible via the stereoscope API, so we need to apply the glob manually on all returned paths
var pkgs []pkg.Package
var filesByPath = make(map[string]*file.LocationSet)
+1 -1
View File
@@ -21,7 +21,7 @@ func DefaultCatalogerConfig() CatalogerConfig {
}
// NewPackageCataloger returns a new cataloger for python packages referenced from poetry lock files, requirements.txt files, and setup.py files.
func NewPackageCataloger(cfg CatalogerConfig) *generic.Cataloger {
func NewPackageCataloger(cfg CatalogerConfig) pkg.Cataloger {
rqp := newRequirementsParser(cfg)
return generic.NewCataloger("python-package-cataloger").
WithParserByGlobs(rqp.parseRequirementsTxt, "**/*requirements*.txt").
@@ -29,11 +29,11 @@ type pipfileLock struct {
VerifySsl bool `json:"verify_ssl"`
} `json:"sources"`
} `json:"_meta"`
Default map[string]Dependency `json:"default"`
Develop map[string]Dependency `json:"develop"`
Default map[string]pipfileLockDependency `json:"default"`
Develop map[string]pipfileLockDependency `json:"develop"`
}
type Dependency struct {
type pipfileLockDependency struct {
Hashes []string `json:"hashes"`
Version string `json:"version"`
Index string `json:"index"`