in providers/nvd/cve.go [271:322]
func (cf cveFile) needsUpdate(ctx context.Context, remoteMetaURL, localdir string) (*metaFile, bool, error) {
flog.V(1).Infof("downloading meta file %q", remoteMetaURL)
remoteMeta, err := newMetaFromURL(ctx, remoteMetaURL)
if err != nil {
return nil, false, err
}
metaFilename := filepath.Join(localdir, cf.MetaFile)
if _, err := os.Stat(metaFilename); os.IsNotExist(err) {
flog.V(1).Infof("meta file %q does not exist in %q, needs sync", cf.MetaFile, localdir)
return &remoteMeta, true, nil
}
localMeta, err := newMetaFromFile(metaFilename)
if err != nil {
return nil, false, err
}
if !localMeta.Equal(remoteMeta) {
flog.V(1).Infof("data file %q needs update in %q: local%+v != remote%+v", cf.DataFile, localdir, localMeta, remoteMeta)
return &remoteMeta, true, nil
}
dataFilename := filepath.Join(localdir, cf.DataFile)
fi, err := os.Stat(dataFilename)
if err != nil {
if os.IsNotExist(err) {
flog.V(1).Infof("data file %q does not exist in %q, needs sync", cf.DataFile, localdir)
return &remoteMeta, true, nil
}
return nil, false, err
}
var sizeOK bool
var hashFunc func(filename string) (string, error)
switch cf.compression() {
case "gz":
sizeOK = fi.Size() == int64(localMeta.GzSize)
hashFunc = gunzipFileAndComputeSHA256
case "zip":
sizeOK = fi.Size() == int64(localMeta.ZipSize)
hashFunc = unzipFileAndComputeSHA256
}
if !sizeOK {
flog.V(1).Infof("data file %q needs update in %q: size mismatch", cf.DataFile, localdir)
return &remoteMeta, true, nil
}
hash, err := hashFunc(dataFilename)
if err != nil {
return nil, false, err
}
if hash != localMeta.SHA256 {
flog.V(1).Infof("data file %q needs update in %q: hash mismatch %q != %q", cf.DataFile, localdir, hash, localMeta.SHA256)
return &remoteMeta, true, nil
}
return &remoteMeta, false, nil
}