in providers/nvd/cve.go [326:378]
func (cf cveFile) downloadAndVerify(ctx context.Context, m *metaFile, remoteFileURL string) (string, error) {
req, err := httpNewRequestContext(ctx, "GET", remoteFileURL)
if err != nil {
return "", err
}
flog.V(1).Infof("downloading data file %q", remoteFileURL)
resp, err := client.Default().Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
if err = httpResponseNotOK(resp); err != nil {
return "", err
}
var wantSize int64
var hashFunc func(filename string) (string, error)
switch cf.compression() {
case "gz":
wantSize = int64(m.GzSize)
hashFunc = gunzipFileAndComputeSHA256
case "zip":
wantSize = int64(m.ZipSize)
hashFunc = unzipFileAndComputeSHA256
}
if resp.ContentLength != wantSize {
return "", fmt.Errorf(
"unexpected size for %q (%s): want %d, have %d",
remoteFileURL, resp.Status, wantSize, resp.ContentLength,
)
}
dataFile, err := ioutil.TempFile("", "nvdsync-data-")
if err != nil {
return "", err
}
_, err = io.Copy(dataFile, resp.Body)
dataFile.Close()
if err != nil {
return "", err
}
hash, err := hashFunc(dataFile.Name())
if err != nil {
defer os.Remove(dataFile.Name()) // TODO: delet?
return "", err
}
if hash != m.SHA256 {
defer os.Remove(dataFile.Name()) // TODO: delet?
return "", fmt.Errorf(
"unexpected hash for %q (%s): want %q, have %q",
remoteFileURL, resp.Status, m.SHA256, hash,
)
}
return dataFile.Name(), nil
}