mirror of
https://github.com/safedep/vet.git
synced 2025-12-10 12:07:30 -06:00
Add exceptions generate analyzer
This commit is contained in:
parent
46bd7e2d13
commit
4b16c05ff9
2
go.mod
2
go.mod
@ -8,7 +8,7 @@ require (
|
|||||||
github.com/google/cel-go v0.13.0
|
github.com/google/cel-go v0.13.0
|
||||||
github.com/google/osv-scanner v1.1.0
|
github.com/google/osv-scanner v1.1.0
|
||||||
github.com/jedib0t/go-pretty/v6 v6.4.4
|
github.com/jedib0t/go-pretty/v6 v6.4.4
|
||||||
github.com/safedep/dry v0.0.0-20230218045153-1a93b0397b55
|
github.com/safedep/dry v0.0.0-20230222132026-c8b6cb976849
|
||||||
github.com/sirupsen/logrus v1.9.0
|
github.com/sirupsen/logrus v1.9.0
|
||||||
github.com/spf13/cobra v1.6.1
|
github.com/spf13/cobra v1.6.1
|
||||||
github.com/stretchr/testify v1.8.1
|
github.com/stretchr/testify v1.8.1
|
||||||
|
|||||||
2
go.sum
2
go.sum
@ -48,6 +48,8 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ
|
|||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/safedep/dry v0.0.0-20230218045153-1a93b0397b55 h1:OBzggSWzjyEa7YaXp2DvpKDe1wYXtOEcFXQfDqkK7PI=
|
github.com/safedep/dry v0.0.0-20230218045153-1a93b0397b55 h1:OBzggSWzjyEa7YaXp2DvpKDe1wYXtOEcFXQfDqkK7PI=
|
||||||
github.com/safedep/dry v0.0.0-20230218045153-1a93b0397b55/go.mod h1:odFOtG1l46k23IaCY6kdNkkLW8L+NT+EUVYYVphP59I=
|
github.com/safedep/dry v0.0.0-20230218045153-1a93b0397b55/go.mod h1:odFOtG1l46k23IaCY6kdNkkLW8L+NT+EUVYYVphP59I=
|
||||||
|
github.com/safedep/dry v0.0.0-20230222132026-c8b6cb976849 h1:5nO9ht1jn7XHFyNFRhUneDZbKmwh4kRr0w/EoWuOQQA=
|
||||||
|
github.com/safedep/dry v0.0.0-20230222132026-c8b6cb976849/go.mod h1:odFOtG1l46k23IaCY6kdNkkLW8L+NT+EUVYYVphP59I=
|
||||||
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
||||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
|
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
|
||||||
|
|||||||
109
pkg/analyzer/exceptions_generator.go
Normal file
109
pkg/analyzer/exceptions_generator.go
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
package analyzer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/safedep/dry/utils"
|
||||||
|
"github.com/safedep/vet/gen/exceptionsapi"
|
||||||
|
"github.com/safedep/vet/pkg/analyzer/filter"
|
||||||
|
"github.com/safedep/vet/pkg/models"
|
||||||
|
"github.com/safedep/vet/pkg/readers"
|
||||||
|
)
|
||||||
|
|
||||||
|
type exceptionsGenerator struct {
|
||||||
|
writer io.WriteCloser
|
||||||
|
filterEvaluator filter.Evaluator
|
||||||
|
expires time.Time
|
||||||
|
pkgCache map[string]*models.Package
|
||||||
|
}
|
||||||
|
|
||||||
|
type ExceptionsGeneratorConfig struct {
|
||||||
|
Path string
|
||||||
|
Filter string
|
||||||
|
ExpiresOn string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewExceptionsGenerator(config ExceptionsGeneratorConfig) (Analyzer, error) {
|
||||||
|
fd, err := os.Create(config.Path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
expiresOn, err := time.Parse("2006-01-02", config.ExpiresOn)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
filterEvaluator, err := filter.NewEvaluator("exceptions-generator", true)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if utils.IsEmptyString(config.Filter) {
|
||||||
|
config.Filter = "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
err = filterEvaluator.AddFilter("exceptions-filter", config.Filter)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &exceptionsGenerator{
|
||||||
|
writer: fd,
|
||||||
|
filterEvaluator: filterEvaluator,
|
||||||
|
expires: expiresOn,
|
||||||
|
pkgCache: make(map[string]*models.Package),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *exceptionsGenerator) Name() string {
|
||||||
|
return "Exceptions Generator"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *exceptionsGenerator) Analyze(manifest *models.PackageManifest,
|
||||||
|
handler AnalyzerEventHandler) error {
|
||||||
|
readers.NewManifestModelReader(manifest).EnumPackages(func(pkg *models.Package) error {
|
||||||
|
res, err := f.filterEvaluator.EvalPackage(pkg)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !res.Matched() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
f.pkgCache[pkg.Id()] = pkg
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *exceptionsGenerator) Finish() error {
|
||||||
|
defer f.writer.Close()
|
||||||
|
|
||||||
|
suite := exceptionsapi.ExceptionSuite{
|
||||||
|
Name: "Auto Generated Exceptions",
|
||||||
|
Description: "Exceptions file auto-generated using vet",
|
||||||
|
Exceptions: make([]*exceptionsapi.Exception, 0),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pkg := range f.pkgCache {
|
||||||
|
suite.Exceptions = append(suite.Exceptions, &exceptionsapi.Exception{
|
||||||
|
Id: utils.NewUniqueId(),
|
||||||
|
Ecosystem: string(pkg.Ecosystem),
|
||||||
|
Name: pkg.Name,
|
||||||
|
Version: pkg.Version,
|
||||||
|
Expires: f.expires.Format(time.RFC3339),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
err := utils.FromPbToYaml(f.writer, &suite)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
28
query.go
28
query.go
@ -1,6 +1,8 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/safedep/dry/utils"
|
"github.com/safedep/dry/utils"
|
||||||
"github.com/safedep/vet/pkg/analyzer"
|
"github.com/safedep/vet/pkg/analyzer"
|
||||||
"github.com/safedep/vet/pkg/reporter"
|
"github.com/safedep/vet/pkg/reporter"
|
||||||
@ -16,6 +18,11 @@ var (
|
|||||||
queryEnableConsoleReport bool
|
queryEnableConsoleReport bool
|
||||||
queryEnableSummaryReport bool
|
queryEnableSummaryReport bool
|
||||||
queryMarkdownReportPath string
|
queryMarkdownReportPath string
|
||||||
|
queryExceptionsFile string
|
||||||
|
queryExceptionsTill string
|
||||||
|
queryExceptionsFilter string
|
||||||
|
|
||||||
|
queryDefaultExceptionExpiry = time.Now().Add(90 * 24 * time.Hour)
|
||||||
)
|
)
|
||||||
|
|
||||||
func newQueryCommand() *cobra.Command {
|
func newQueryCommand() *cobra.Command {
|
||||||
@ -36,6 +43,13 @@ func newQueryCommand() *cobra.Command {
|
|||||||
"Filter packages using CEL Filter Suite from file")
|
"Filter packages using CEL Filter Suite from file")
|
||||||
cmd.Flags().BoolVarP(&queryFilterFailOnMatch, "filter-fail", "", false,
|
cmd.Flags().BoolVarP(&queryFilterFailOnMatch, "filter-fail", "", false,
|
||||||
"Fail the command if filter matches any package (for security gate)")
|
"Fail the command if filter matches any package (for security gate)")
|
||||||
|
cmd.Flags().StringVarP(&queryExceptionsFile, "exceptions-generate", "", "",
|
||||||
|
"Generate exception records to file (YAML)")
|
||||||
|
cmd.Flags().StringVarP(&queryExceptionsTill, "exceptions-till", "",
|
||||||
|
queryDefaultExceptionExpiry.Format("2006-01-02"),
|
||||||
|
"Generated exceptions are valid till")
|
||||||
|
cmd.Flags().StringVarP(&queryExceptionsFilter, "exceptions-filter", "", "",
|
||||||
|
"Generate exception records for packages matching filter")
|
||||||
cmd.Flags().BoolVarP(&queryEnableConsoleReport, "report-console", "", false,
|
cmd.Flags().BoolVarP(&queryEnableConsoleReport, "report-console", "", false,
|
||||||
"Minimal summary of package manifest")
|
"Minimal summary of package manifest")
|
||||||
cmd.Flags().BoolVarP(&queryEnableSummaryReport, "report-summary", "", false,
|
cmd.Flags().BoolVarP(&queryEnableSummaryReport, "report-summary", "", false,
|
||||||
@ -74,6 +88,20 @@ func internalStartQuery() error {
|
|||||||
analyzers = append(analyzers, task)
|
analyzers = append(analyzers, task)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !utils.IsEmptyString(queryExceptionsFile) {
|
||||||
|
task, err := analyzer.NewExceptionsGenerator(analyzer.ExceptionsGeneratorConfig{
|
||||||
|
Path: queryExceptionsFile,
|
||||||
|
ExpiresOn: queryExceptionsTill,
|
||||||
|
Filter: queryExceptionsFilter,
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
analyzers = append(analyzers, task)
|
||||||
|
}
|
||||||
|
|
||||||
if queryEnableConsoleReport {
|
if queryEnableConsoleReport {
|
||||||
rp, err := reporter.NewConsoleReporter()
|
rp, err := reporter.NewConsoleReporter()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user