mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-22 23:26:39 -08:00
* feat: add comparer * refactor: rename lang with ecosystem * feat(bundler): add comparer * feat(node): add comparer * feat(bundler): integrate comparer * feat(cargo): integrate comparer * feat(composer): add comparer * feat(ghsa): integrate comparer * feat(node): integrate comparer * feat(python): integrate comparer * test(bundler): add tests * test(cargo): add tests * test(composer): add tests * test(ghsa): add tests * test(node): add tests * test(python): add tests * refactor(utils): remove unnecessary functions * test(utils): add tests * test: rename bucket prefixes * fix(detect): use string * chore: update dependencies * docs: add comments * fix(cargo): handle unpatched vulnerability * test(db): update trivy-db for integration tests * test(integration): update a golden file * test(cargo): Add a case for missing patched version Signed-off-by: Simarpreet Singh <simar@linux.com> * refactor(advisory): update comments * refactor(node/advisory): change the receiver * chore(mod): update dependencies * refactor(comparer): unexport MatchVersion * refactor: fix maligned structs * test(node): add empty value * refactor * refactor: sort imports * chore(mod): update trivy-db Co-authored-by: Simarpreet Singh <simar@linux.com>
71 lines
2.0 KiB
Go
71 lines
2.0 KiB
Go
package library
|
|
|
|
import (
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/google/wire"
|
|
"golang.org/x/xerrors"
|
|
|
|
ftypes "github.com/aquasecurity/fanal/types"
|
|
"github.com/aquasecurity/trivy/pkg/log"
|
|
"github.com/aquasecurity/trivy/pkg/types"
|
|
)
|
|
|
|
// SuperSet binds the dependencies for library scan
|
|
var SuperSet = wire.NewSet(
|
|
wire.Struct(new(DriverFactory)),
|
|
wire.Bind(new(Factory), new(DriverFactory)),
|
|
NewDetector,
|
|
wire.Bind(new(Operation), new(Detector)),
|
|
)
|
|
|
|
// Operation defines library scan operations
|
|
type Operation interface {
|
|
Detect(imageName string, filePath string, created time.Time, pkgs []ftypes.LibraryInfo) (vulns []types.DetectedVulnerability, err error)
|
|
}
|
|
|
|
// Detector implements driverFactory
|
|
type Detector struct {
|
|
driverFactory Factory
|
|
}
|
|
|
|
// NewDetector is the factory method for detector
|
|
func NewDetector(factory Factory) Detector {
|
|
return Detector{driverFactory: factory}
|
|
}
|
|
|
|
// Detect scans and returns vulnerabilities of library
|
|
func (d Detector) Detect(_, filePath string, _ time.Time, pkgs []ftypes.LibraryInfo) ([]types.DetectedVulnerability, error) {
|
|
log.Logger.Debugf("Detecting library vulnerabilities, path: %s", filePath)
|
|
driver, err := d.driverFactory.NewDriver(filepath.Base(filePath))
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("failed to new driver: %w", err)
|
|
}
|
|
|
|
vulns, err := detect(driver, pkgs)
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("failed to scan %s vulnerabilities: %w", driver.Type(), err)
|
|
}
|
|
|
|
return vulns, nil
|
|
}
|
|
|
|
func detect(driver Driver, libs []ftypes.LibraryInfo) ([]types.DetectedVulnerability, error) {
|
|
log.Logger.Infof("Detecting %s vulnerabilities...", driver.Type())
|
|
var vulnerabilities []types.DetectedVulnerability
|
|
for _, lib := range libs {
|
|
vulns, err := driver.Detect(lib.Library.Name, lib.Library.Version)
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("failed to detect %s vulnerabilities: %w", driver.Type(), err)
|
|
}
|
|
|
|
for i := range vulns {
|
|
vulns[i].Layer = lib.Layer
|
|
}
|
|
vulnerabilities = append(vulnerabilities, vulns...)
|
|
}
|
|
|
|
return vulnerabilities, nil
|
|
}
|