mirror of
https://github.com/safedep/vet.git
synced 2025-12-10 00:22:08 -06:00
Add reader to read packages with exceptions
This commit is contained in:
parent
4882e46815
commit
46bd7e2d13
@ -9,6 +9,7 @@ import (
|
||||
"github.com/safedep/vet/pkg/analyzer/filter"
|
||||
"github.com/safedep/vet/pkg/common/logger"
|
||||
"github.com/safedep/vet/pkg/models"
|
||||
"github.com/safedep/vet/pkg/readers"
|
||||
)
|
||||
|
||||
type celFilterAnalyzer struct {
|
||||
@ -48,7 +49,7 @@ func (f *celFilterAnalyzer) Analyze(manifest *models.PackageManifest,
|
||||
logger.Infof("CEL filtering manifest: %s", manifest.Path)
|
||||
f.stat.IncScannedManifest()
|
||||
|
||||
for _, pkg := range manifest.Packages {
|
||||
readers.NewManifestModelReader(manifest).EnumPackages(func(pkg *models.Package) error {
|
||||
f.stat.IncEvaluatedPackage()
|
||||
|
||||
res, err := f.evaluator.EvalPackage(pkg)
|
||||
@ -59,19 +60,21 @@ func (f *celFilterAnalyzer) Analyze(manifest *models.PackageManifest,
|
||||
pkg.PackageDetails.Name,
|
||||
pkg.PackageDetails.Version, err)
|
||||
|
||||
continue
|
||||
return nil
|
||||
}
|
||||
|
||||
if res.Matched() {
|
||||
// Avoid duplicates added to the table
|
||||
if _, ok := f.packages[pkg.Id()]; ok {
|
||||
continue
|
||||
return nil
|
||||
}
|
||||
|
||||
f.stat.IncMatchedPackage()
|
||||
f.packages[pkg.Id()] = pkg
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
return f.notifyCaller(manifest, handler)
|
||||
}
|
||||
|
||||
@ -10,6 +10,7 @@ import (
|
||||
"github.com/safedep/vet/pkg/analyzer/filter"
|
||||
"github.com/safedep/vet/pkg/common/logger"
|
||||
"github.com/safedep/vet/pkg/models"
|
||||
"github.com/safedep/vet/pkg/readers"
|
||||
)
|
||||
|
||||
type celFilterMatchedPackage struct {
|
||||
@ -62,7 +63,7 @@ func (f *celFilterSuiteAnalyzer) Analyze(manifest *models.PackageManifest,
|
||||
logger.Infof("CEL Filter Suite: Analyzing manifest: %s", manifest.Path)
|
||||
|
||||
f.stat.IncScannedManifest()
|
||||
for _, pkg := range manifest.Packages {
|
||||
readers.NewManifestModelReader(manifest).EnumPackages(func(pkg *models.Package) error {
|
||||
f.stat.IncEvaluatedPackage()
|
||||
|
||||
res, err := f.evaluator.EvalPackage(pkg)
|
||||
@ -73,13 +74,15 @@ func (f *celFilterSuiteAnalyzer) Analyze(manifest *models.PackageManifest,
|
||||
pkg.PackageDetails.Name,
|
||||
pkg.PackageDetails.Version, err)
|
||||
|
||||
continue
|
||||
return nil
|
||||
}
|
||||
|
||||
if res.Matched() {
|
||||
f.queueMatchedPkg(pkg, res.GetMatchedFilter().Name())
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if f.failOnMatch && (len(f.matchedPackages) > 0) {
|
||||
handler(&AnalyzerEvent{
|
||||
|
||||
31
pkg/exceptions/utils.go
Normal file
31
pkg/exceptions/utils.go
Normal file
@ -0,0 +1,31 @@
|
||||
package exceptions
|
||||
|
||||
import (
|
||||
"github.com/safedep/vet/pkg/common/logger"
|
||||
"github.com/safedep/vet/pkg/models"
|
||||
)
|
||||
|
||||
// AllowedPackages iterates over packages in the manifest and call handler
|
||||
// only for packages not in the exempted by exception rules
|
||||
func AllowedPackages(manifest *models.PackageManifest,
|
||||
handler func(pkg *models.Package) error) error {
|
||||
for _, pkg := range manifest.Packages {
|
||||
res, err := Apply(pkg)
|
||||
if err != nil {
|
||||
logger.Errorf("Failed to evaluate exception for %s: %v",
|
||||
pkg.ShortName(), err)
|
||||
continue
|
||||
}
|
||||
|
||||
if res.Matched() {
|
||||
continue
|
||||
}
|
||||
|
||||
err = handler(pkg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@ -75,6 +75,12 @@ func (p *Package) Id() string {
|
||||
return strconv.FormatUint(h.Sum64(), 16)
|
||||
}
|
||||
|
||||
func (p *Package) ShortName() string {
|
||||
return fmt.Sprintf("pkg:%s/%s@%s",
|
||||
strings.ToLower(string(p.Ecosystem)),
|
||||
strings.ToLower(p.Name), p.Version)
|
||||
}
|
||||
|
||||
func NewPackageDetail(e, n, v string) lockfile.PackageDetails {
|
||||
return lockfile.PackageDetails{
|
||||
Ecosystem: lockfile.Ecosystem(e),
|
||||
|
||||
18
pkg/readers/pm.go
Normal file
18
pkg/readers/pm.go
Normal file
@ -0,0 +1,18 @@
|
||||
package readers
|
||||
|
||||
import (
|
||||
"github.com/safedep/vet/pkg/exceptions"
|
||||
"github.com/safedep/vet/pkg/models"
|
||||
)
|
||||
|
||||
type packageManifestReader struct {
|
||||
manifest *models.PackageManifest
|
||||
}
|
||||
|
||||
func NewManifestModelReader(manifest *models.PackageManifest) PackageReader {
|
||||
return &packageManifestReader{manifest: manifest}
|
||||
}
|
||||
|
||||
func (r *packageManifestReader) EnumPackages(handler func(pkg *models.Package) error) error {
|
||||
return exceptions.AllowedPackages(r.manifest, handler)
|
||||
}
|
||||
16
pkg/readers/reader.go
Normal file
16
pkg/readers/reader.go
Normal file
@ -0,0 +1,16 @@
|
||||
package readers
|
||||
|
||||
import "github.com/safedep/vet/pkg/models"
|
||||
|
||||
// Contract for implementing package manifest readers such as lockfile parser,
|
||||
// SBOM parser etc. Reader should stop enumeration and return error if handler
|
||||
// returns an error
|
||||
type PackageManifestReader interface {
|
||||
EnumManifests(func(*models.PackageManifest) error) error
|
||||
}
|
||||
|
||||
// Contract for implementing a package reader. Enumerator should fail and return
|
||||
// error if handler fails
|
||||
type PackageReader interface {
|
||||
EnumPackages(func(*models.Package) error) error
|
||||
}
|
||||
@ -11,6 +11,7 @@ import (
|
||||
"github.com/safedep/vet/pkg/analyzer"
|
||||
"github.com/safedep/vet/pkg/models"
|
||||
"github.com/safedep/vet/pkg/policy"
|
||||
"github.com/safedep/vet/pkg/readers"
|
||||
)
|
||||
|
||||
type consoleReporter struct{}
|
||||
@ -29,9 +30,10 @@ func (r *consoleReporter) AddManifest(manifest *models.PackageManifest) {
|
||||
tbl.SetStyle(table.StyleLight)
|
||||
|
||||
tbl.AppendHeader(table.Row{"Package", "Attribute", "Summary"})
|
||||
for _, pkg := range manifest.Packages {
|
||||
readers.NewManifestModelReader(manifest).EnumPackages(func(pkg *models.Package) error {
|
||||
r.report(tbl, pkg)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
fmt.Print(text.Bold.Sprint("Manifest: ", text.FgBlue.Sprint(manifest.Path)))
|
||||
fmt.Print("\n")
|
||||
|
||||
@ -14,6 +14,7 @@ import (
|
||||
"github.com/safedep/vet/pkg/analyzer"
|
||||
"github.com/safedep/vet/pkg/models"
|
||||
"github.com/safedep/vet/pkg/policy"
|
||||
"github.com/safedep/vet/pkg/readers"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -72,13 +73,14 @@ func (r *summaryReporter) Name() string {
|
||||
}
|
||||
|
||||
func (r *summaryReporter) AddManifest(manifest *models.PackageManifest) {
|
||||
for _, pkg := range manifest.Packages {
|
||||
readers.NewManifestModelReader(manifest).EnumPackages(func(pkg *models.Package) error {
|
||||
r.processForVulns(pkg)
|
||||
r.processForPopularity(pkg)
|
||||
r.processForVersionDrift(pkg)
|
||||
|
||||
r.summary.packages += 1
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
r.summary.manifests += 1
|
||||
}
|
||||
|
||||
@ -7,6 +7,7 @@ import (
|
||||
"github.com/safedep/vet/pkg/common/logger"
|
||||
"github.com/safedep/vet/pkg/common/utils"
|
||||
"github.com/safedep/vet/pkg/models"
|
||||
"github.com/safedep/vet/pkg/readers"
|
||||
"github.com/safedep/vet/pkg/reporter"
|
||||
)
|
||||
|
||||
@ -217,9 +218,10 @@ func (s *packageManifestScanner) enrichManifest(manifest *models.PackageManifest
|
||||
|
||||
q.Start()
|
||||
|
||||
for _, pkg := range manifest.Packages {
|
||||
readers.NewManifestModelReader(manifest).EnumPackages(func(pkg *models.Package) error {
|
||||
q.Add(pkg)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
q.Wait()
|
||||
q.Stop()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user