Files
trivy/pkg/scanner/library/npm/advisory.go
Teppei Fukuda 84fec5ae12 Initial commit (#1)
* initial
2019-05-07 15:41:03 +09:00

84 lines
1.8 KiB
Go

package npm
import (
"encoding/json"
"os"
"path/filepath"
"strconv"
"strings"
"github.com/knqyf263/trivy/pkg/utils"
"github.com/knqyf263/trivy/pkg/git"
)
const (
dbURL = "https://github.com/nodejs/security-wg.git"
)
var (
repoPath = filepath.Join(utils.CacheDir(), "nodejs-security-wg")
)
type AdvisoryDB map[string][]Advisory
type Advisory struct {
ID int
Title string
ModuleName string `json:"module_name""`
Cves []string
VulnerableVersions string `json:"vulnerable_versions"`
PatchedVersions string `json:"patched_versions"`
Recommendation string
References []string
CvssScoreNumber json.Number `json:"cvss_score"`
CvssScore float64
}
func (s *Scanner) UpdateDB() (err error) {
if _, err := git.CloneOrPull(dbURL, repoPath); err != nil {
return err
}
s.db, err = walk()
return err
}
func walk() (AdvisoryDB, error) {
advisoryDB := AdvisoryDB{}
err := filepath.Walk(filepath.Join(repoPath, "vuln"), func(path string, info os.FileInfo, err error) error {
if info.IsDir() || !strings.HasSuffix(info.Name(), ".json") {
return nil
}
f, err := os.Open(path)
if err != nil {
return err
}
defer f.Close()
advisory := Advisory{}
if err = json.NewDecoder(f).Decode(&advisory); err != nil {
return err
}
advisory.ModuleName = strings.ToLower(advisory.ModuleName)
// `cvss_score` returns float or string like "4.8 (MEDIUM)"
s := strings.Split(advisory.CvssScoreNumber.String(), " ")
advisory.CvssScore, err = strconv.ParseFloat(s[0], 64)
if err != nil {
advisory.CvssScore = -1
}
advisories, ok := advisoryDB[advisory.ModuleName]
if !ok {
advisories = []Advisory{}
}
advisoryDB[advisory.ModuleName] = append(advisories, advisory)
return nil
})
if err != nil {
return nil, err
}
return advisoryDB, nil
}