mirror of
https://github.com/aquasecurity/trivy.git
synced 2026-02-10 02:33:15 +08:00
51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
package sum
|
|
|
|
import (
|
|
"bufio"
|
|
"strings"
|
|
|
|
"golang.org/x/xerrors"
|
|
|
|
"github.com/aquasecurity/trivy/pkg/dependency"
|
|
ftypes "github.com/aquasecurity/trivy/pkg/fanal/types"
|
|
xio "github.com/aquasecurity/trivy/pkg/x/io"
|
|
)
|
|
|
|
type Parser struct{}
|
|
|
|
func NewParser() *Parser {
|
|
return &Parser{}
|
|
}
|
|
|
|
// Parse parses a go.sum file
|
|
func (p *Parser) Parse(r xio.ReadSeekerAt) ([]ftypes.Package, []ftypes.Dependency, error) {
|
|
var pkgs []ftypes.Package
|
|
uniquePkgs := make(map[string]string)
|
|
|
|
scanner := bufio.NewScanner(r)
|
|
for scanner.Scan() {
|
|
line := strings.TrimSpace(scanner.Text())
|
|
s := strings.Fields(line)
|
|
if len(s) < 2 {
|
|
continue
|
|
}
|
|
|
|
// go.sum records and sorts all non-major versions
|
|
// with the latest version as last entry
|
|
uniquePkgs[s[0]] = strings.TrimSuffix(s[1], "/go.mod")
|
|
}
|
|
if err := scanner.Err(); err != nil {
|
|
return nil, nil, xerrors.Errorf("scan error: %w", err)
|
|
}
|
|
|
|
for k, v := range uniquePkgs {
|
|
pkgs = append(pkgs, ftypes.Package{
|
|
ID: dependency.ID(ftypes.GoModule, k, v),
|
|
Name: k,
|
|
Version: v,
|
|
})
|
|
}
|
|
|
|
return pkgs, nil, nil
|
|
}
|