Fix alpine tests
This commit is contained in:
parent
573a7b3b5a
commit
3e42145b06
@ -32,26 +32,28 @@ var (
|
|||||||
malformedVerReplacer = strings.NewReplacer("_p", "-p", ".-", "-", ".r", "-r", "_alpha", "-alpha", "_rc", "-rc")
|
malformedVerReplacer = strings.NewReplacer("_p", "-p", ".-", "-", ".r", "-r", "_alpha", "-alpha", "_rc", "-rc")
|
||||||
)
|
)
|
||||||
|
|
||||||
func Update(gc git.Operations) (err error) {
|
type Config struct {
|
||||||
|
GitClient git.Operations
|
||||||
|
CacheDir string
|
||||||
|
VulnListDir string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Config) Update() (err error) {
|
||||||
log.Println("Fetching Alpine data...")
|
log.Println("Fetching Alpine data...")
|
||||||
repoDir = filepath.Join(utils.CacheDir(), "aports")
|
repoDir = filepath.Join(c.CacheDir, "aports")
|
||||||
if _, err = gc.CloneOrPull(repoURL, repoDir); err != nil {
|
if _, err = c.GitClient.CloneOrPull(repoURL, repoDir); err != nil {
|
||||||
return xerrors.Errorf("failed to clone alpine repository: %w", err)
|
return xerrors.Errorf("failed to clone alpine repository: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract secfixes in all APKBUILD
|
// Extract secfixes in all APKBUILD
|
||||||
log.Println("Extracting Alpine secfixes...")
|
log.Println("Extracting Alpine secfixes...")
|
||||||
branches, err := gc.RemoteBranch(repoDir)
|
branches, err := c.GitClient.RemoteBranch(repoDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to show branches: %w", err)
|
return xerrors.Errorf("failed to show branches: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
// restore branch
|
||||||
// restore branch
|
defer c.GitClient.Checkout(repoDir, "master")
|
||||||
if err = gc.Checkout(repoDir, "master"); err != nil {
|
|
||||||
err = xerrors.Errorf("error in git checkout: %w", err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
for _, branch := range branches {
|
for _, branch := range branches {
|
||||||
branch = strings.TrimSpace(branch)
|
branch = strings.TrimSpace(branch)
|
||||||
@ -64,18 +66,18 @@ func Update(gc git.Operations) (err error) {
|
|||||||
}
|
}
|
||||||
release := strings.TrimSuffix(s[1], "-stable")
|
release := strings.TrimSuffix(s[1], "-stable")
|
||||||
|
|
||||||
if err = gc.Checkout(repoDir, branch); err != nil {
|
if err = c.GitClient.Checkout(repoDir, branch); err != nil {
|
||||||
return xerrors.Errorf("failed to git checkout: %w", err)
|
return xerrors.Errorf("git failed to checkout branch: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
advisories, err := walkApkBuild(repoDir, release)
|
advisories, err := c.walkApkBuild(repoDir, release)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to walk APKBUILD: %w", err)
|
return xerrors.Errorf("failed to walk APKBUILD: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("Saving secfixes: %s\n", release)
|
log.Printf("Saving secfixes: %s\n", release)
|
||||||
for _, advisory := range advisories {
|
for _, advisory := range advisories {
|
||||||
filePath, err := constructFilePath(advisory.Release, advisory.Repository, advisory.Package, advisory.VulnerabilityID)
|
filePath, err := c.constructFilePath(advisory.Release, advisory.Repository, advisory.Package, advisory.VulnerabilityID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to construct file path: %w", err)
|
return xerrors.Errorf("failed to construct file path: %w", err)
|
||||||
}
|
}
|
||||||
@ -83,7 +85,7 @@ func Update(gc git.Operations) (err error) {
|
|||||||
ok, err := utils.Exists(filePath)
|
ok, err := utils.Exists(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("error in file existence check: %w", err)
|
return xerrors.Errorf("error in file existence check: %w", err)
|
||||||
} else if ok && !shouldOverwrite(filePath, advisory.FixedVersion) {
|
} else if ok && !c.shouldOverwrite(filePath, advisory.FixedVersion) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,7 +98,7 @@ func Update(gc git.Operations) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func shouldOverwrite(filePath string, currentVersion string) bool {
|
func (c Config) shouldOverwrite(filePath string, currentVersion string) bool {
|
||||||
f, err := os.Open(filePath)
|
f, err := os.Open(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
@ -107,6 +109,10 @@ func shouldOverwrite(filePath string, currentVersion string) bool {
|
|||||||
if err = json.NewDecoder(f).Decode(&advisory); err != nil {
|
if err = json.NewDecoder(f).Decode(&advisory); err != nil {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
if advisory.Package == "" || advisory.FixedVersion == "" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// advisory with Subject is more accurate and should not be overwritten
|
||||||
if advisory.Subject != "" {
|
if advisory.Subject != "" {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -126,9 +132,12 @@ func shouldOverwrite(filePath string, currentVersion string) bool {
|
|||||||
return current.LessThan(prev)
|
return current.LessThan(prev)
|
||||||
}
|
}
|
||||||
|
|
||||||
func walkApkBuild(repoDir, release string) ([]Advisory, error) {
|
func (c Config) walkApkBuild(repoDir, release string) ([]Advisory, error) {
|
||||||
var advisories []Advisory
|
var advisories []Advisory
|
||||||
err := filepath.Walk(repoDir, func(path string, info os.FileInfo, err error) error {
|
err := filepath.Walk(repoDir, func(path string, info os.FileInfo, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("file walk error: %w", err)
|
||||||
|
}
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -144,14 +153,14 @@ func walkApkBuild(repoDir, release string) ([]Advisory, error) {
|
|||||||
return xerrors.Errorf("file read error: %w", err)
|
return xerrors.Errorf("file read error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
secFixes, err := parseSecFixes(string(content))
|
secFixes, err := c.parseSecFixes(string(content))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
} else if secFixes == nil {
|
} else if secFixes == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
advisories = buildAdvisories(secFixes, release, pkg, repo)
|
advisories = append(advisories, c.buildAdvisories(secFixes, release, pkg, repo)...)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -161,7 +170,7 @@ func walkApkBuild(repoDir, release string) ([]Advisory, error) {
|
|||||||
return advisories, nil
|
return advisories, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildAdvisories(secFixes map[string][]string, release string, pkg string, repo string) []Advisory {
|
func (c Config) buildAdvisories(secFixes map[string][]string, release string, pkg string, repo string) []Advisory {
|
||||||
var advisories []Advisory
|
var advisories []Advisory
|
||||||
for ver, vulnIDs := range secFixes {
|
for ver, vulnIDs := range secFixes {
|
||||||
for _, vulnID := range vulnIDs {
|
for _, vulnID := range vulnIDs {
|
||||||
@ -191,8 +200,8 @@ func buildAdvisories(secFixes map[string][]string, release string, pkg string, r
|
|||||||
return advisories
|
return advisories
|
||||||
}
|
}
|
||||||
|
|
||||||
func constructFilePath(release, repository, pkg, cveID string) (string, error) {
|
func (c Config) constructFilePath(release, repository, pkg, cveID string) (string, error) {
|
||||||
dir := filepath.Join(utils.VulnListDir(), alpineDir, release, repository, pkg)
|
dir := filepath.Join(c.VulnListDir, alpineDir, release, repository, pkg)
|
||||||
if err := os.MkdirAll(dir, os.ModePerm); err != nil {
|
if err := os.MkdirAll(dir, os.ModePerm); err != nil {
|
||||||
return "", xerrors.Errorf("failed to create directory: %w", err)
|
return "", xerrors.Errorf("failed to create directory: %w", err)
|
||||||
}
|
}
|
||||||
@ -207,7 +216,7 @@ func splitPath(filePath string) (string, string, string) {
|
|||||||
return filepath.Clean(repo), pkg, base
|
return filepath.Clean(repo), pkg, base
|
||||||
}
|
}
|
||||||
|
|
||||||
func parsePkgVerRel(content string) (pkgVer string, pkgRel string, err error) {
|
func (c Config) parsePkgVerRel(content string) (pkgVer string, pkgRel string, err error) {
|
||||||
lines := strings.Split(content, "\n")
|
lines := strings.Split(content, "\n")
|
||||||
|
|
||||||
for i := 0; i < len(lines); i++ {
|
for i := 0; i < len(lines); i++ {
|
||||||
@ -231,7 +240,7 @@ func parsePkgVerRel(content string) (pkgVer string, pkgRel string, err error) {
|
|||||||
return pkgVer, pkgRel, nil
|
return pkgVer, pkgRel, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseSecFixes(content string) (secFixes map[string][]string, err error) {
|
func (c Config) parseSecFixes(content string) (secFixes map[string][]string, err error) {
|
||||||
lines := strings.Split(content, "\n")
|
lines := strings.Split(content, "\n")
|
||||||
for i := 0; i < len(lines); i++ {
|
for i := 0; i < len(lines); i++ {
|
||||||
line := strings.TrimSpace(lines[i])
|
line := strings.TrimSpace(lines[i])
|
||||||
|
@ -1,43 +1,42 @@
|
|||||||
package alpine
|
package alpine_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
|
"github.com/aquasecurity/vuln-list-update/alpine"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/mock"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MockGitConfig struct {
|
type MockGitConfig struct {
|
||||||
cloneorpull func(string, string) (map[string]struct{}, error)
|
mock.Mock
|
||||||
remotebranch func(string) ([]string, error)
|
|
||||||
checkout func(string, string) error
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mgc MockGitConfig) CloneOrPull(a string, b string) (map[string]struct{}, error) {
|
func (mgc MockGitConfig) CloneOrPull(a string, b string) (map[string]struct{}, error) {
|
||||||
if mgc.cloneorpull != nil {
|
args := mgc.Called(a, b)
|
||||||
return mgc.cloneorpull(a, b)
|
return args.Get(0).(map[string]struct{}), args.Error(1)
|
||||||
}
|
|
||||||
return map[string]struct{}{}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mgc MockGitConfig) RemoteBranch(a string) ([]string, error) {
|
func (mgc MockGitConfig) RemoteBranch(a string) ([]string, error) {
|
||||||
if mgc.remotebranch != nil {
|
args := mgc.Called(a)
|
||||||
return mgc.remotebranch(a)
|
return args.Get(0).([]string), args.Error(1)
|
||||||
}
|
|
||||||
return []string{}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mgc MockGitConfig) Checkout(a string, b string) error {
|
func (mgc MockGitConfig) Checkout(a string, b string) error {
|
||||||
if mgc.checkout != nil {
|
args := mgc.Called(a, b)
|
||||||
return mgc.checkout(a, b)
|
return args.Error(0)
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParsePkgVerRel(t *testing.T) {
|
func TestParsePkgVerRel(t *testing.T) {
|
||||||
@ -48,12 +47,12 @@ func TestParsePkgVerRel(t *testing.T) {
|
|||||||
secFixes map[string][]string
|
secFixes map[string][]string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
file: "testdata/APKBUILD_plain",
|
file: "testdata/aports/main/freeradius/APKBUILD",
|
||||||
pkgVer: "3.0.19",
|
pkgVer: "3.0.19",
|
||||||
pkgRel: "0",
|
pkgRel: "0",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
file: "testdata/APKBUILD_multicves",
|
file: "testdata/aports/main/wireshark/APKBUILD",
|
||||||
pkgVer: "2.6.8",
|
pkgVer: "2.6.8",
|
||||||
pkgRel: "1",
|
pkgRel: "1",
|
||||||
},
|
},
|
||||||
@ -66,7 +65,7 @@ func TestParsePkgVerRel(t *testing.T) {
|
|||||||
t.Fatalf("ReadAll() error: %v", err)
|
t.Fatalf("ReadAll() error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
pkgVer, pkgRel, err := parsePkgVerRel(string(content))
|
pkgVer, pkgRel, err := alpine.ParsePkgVerRel(&alpine.Config{}, string(content))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -90,7 +89,7 @@ func TestParseSecFixes(t *testing.T) {
|
|||||||
secFixes map[string][]string
|
secFixes map[string][]string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
file: "testdata/APKBUILD_plain",
|
file: "testdata/aports/main/freeradius/APKBUILD",
|
||||||
pkgVer: "3.0.19",
|
pkgVer: "3.0.19",
|
||||||
pkgRel: "0",
|
pkgRel: "0",
|
||||||
secFixes: map[string][]string{
|
secFixes: map[string][]string{
|
||||||
@ -98,7 +97,7 @@ func TestParseSecFixes(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
file: "testdata/APKBUILD_multicves",
|
file: "testdata/aports/main/wireshark/APKBUILD",
|
||||||
pkgVer: "2.6.8",
|
pkgVer: "2.6.8",
|
||||||
pkgRel: "1",
|
pkgRel: "1",
|
||||||
secFixes: map[string][]string{
|
secFixes: map[string][]string{
|
||||||
@ -116,7 +115,7 @@ func TestParseSecFixes(t *testing.T) {
|
|||||||
t.Fatalf("ReadAll() error: %v", err)
|
t.Fatalf("ReadAll() error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
secFixes, err := parseSecFixes(string(content))
|
secFixes, err := alpine.ParseSecFixes(&alpine.Config{}, string(content))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -129,175 +128,257 @@ func TestParseSecFixes(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestShouldOverwrite(t *testing.T) {
|
func TestShouldOverwrite(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
t.Run("happy and sad paths with valid versions", func(t *testing.T) {
|
name string
|
||||||
issuedAdvisory := Advisory{
|
currentVersion string
|
||||||
IssueID: 100,
|
issuedAdvisory interface{}
|
||||||
VulnerabilityID: "CVE-2100-0001",
|
expctedOverwrite bool
|
||||||
Release: "1.0",
|
}{
|
||||||
Package: "testpackage",
|
{
|
||||||
Repository: "main",
|
name: "issued advisory should overwrite existing one with valid version",
|
||||||
//Subject: "test advisory",
|
currentVersion: "1.0.0",
|
||||||
Description: "for testing only",
|
issuedAdvisory: alpine.Advisory{
|
||||||
}
|
IssueID: 0,
|
||||||
|
VulnerabilityID: "CVE-2100-0001",
|
||||||
testCases := []struct {
|
Release: "1.0",
|
||||||
name string
|
Package: "testpackage",
|
||||||
currentVersion string
|
Repository: "main",
|
||||||
fixedVersion string
|
FixedVersion: "1.2.0",
|
||||||
expctedOverwrite bool
|
Description: "for testing only",
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "issued advisory should overwrite existing one",
|
|
||||||
currentVersion: "1.0.0",
|
|
||||||
fixedVersion: "1.2.0",
|
|
||||||
expctedOverwrite: true,
|
|
||||||
},
|
},
|
||||||
{
|
expctedOverwrite: true,
|
||||||
name: "issued advisory should NOT overwrite existing one",
|
},
|
||||||
currentVersion: "1.0.0",
|
{
|
||||||
fixedVersion: "0.9.0",
|
name: "issued advisory should NOT overwrite existing one with valid version",
|
||||||
expctedOverwrite: false,
|
currentVersion: "1.0.0",
|
||||||
|
issuedAdvisory: alpine.Advisory{
|
||||||
|
IssueID: 0,
|
||||||
|
VulnerabilityID: "CVE-2100-0001",
|
||||||
|
Release: "1.0",
|
||||||
|
Package: "testpackage",
|
||||||
|
Repository: "main",
|
||||||
|
FixedVersion: "0.9.0",
|
||||||
|
Description: "for testing only",
|
||||||
},
|
},
|
||||||
}
|
expctedOverwrite: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid advisory json",
|
||||||
|
currentVersion: "1.0.0",
|
||||||
|
issuedAdvisory: []byte(`badjsonhere`),
|
||||||
|
expctedOverwrite: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "empty fixed version",
|
||||||
|
currentVersion: "1.0.0",
|
||||||
|
issuedAdvisory: alpine.Advisory{
|
||||||
|
Subject: "non empty subject",
|
||||||
|
},
|
||||||
|
expctedOverwrite: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid old advisory version",
|
||||||
|
currentVersion: "1.0.0",
|
||||||
|
issuedAdvisory: alpine.Advisory{
|
||||||
|
Subject: "non empty subject",
|
||||||
|
Package: "test",
|
||||||
|
FixedVersion: "invalid",
|
||||||
|
},
|
||||||
|
expctedOverwrite: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid current advisory version",
|
||||||
|
currentVersion: "invalid",
|
||||||
|
issuedAdvisory: alpine.Advisory{
|
||||||
|
Subject: "non empty subject",
|
||||||
|
Package: "test",
|
||||||
|
FixedVersion: "1.0.0",
|
||||||
|
},
|
||||||
|
expctedOverwrite: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
f, _ := ioutil.TempFile("", "TestShouldOverwrite_happy_sad")
|
f, _ := ioutil.TempFile("", "TestShouldOverwrite_happy_sad")
|
||||||
issuedAdvisory.FixedVersion = tc.fixedVersion
|
defer os.Remove(f.Name())
|
||||||
b, _ := json.Marshal(&issuedAdvisory)
|
b, _ := json.Marshal(tc.issuedAdvisory)
|
||||||
_, _ = f.Write(b)
|
_, _ = f.Write(b)
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
assert.Equal(t, tc.expctedOverwrite, shouldOverwrite(f.Name(), tc.currentVersion), tc.name)
|
assert.Equal(t, tc.expctedOverwrite, alpine.ShouldOverwrite(&alpine.Config{}, f.Name(), tc.currentVersion), tc.name)
|
||||||
}
|
assert.NoError(t, f.Close())
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("invalid advisory json", func(t *testing.T) {
|
|
||||||
f, _ := ioutil.TempFile("", "TestShouldOverwrite_invalid_json")
|
|
||||||
_, _ = f.Write([]byte(`badjsonhere`))
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
assert.Equal(t, true, shouldOverwrite(f.Name(), "doesnt matter"), "invalid advisory json")
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
// TODO: Why should this not overwrite with a subject in advisory json?
|
|
||||||
t.Run("non empty subject advisory", func(t *testing.T) {
|
|
||||||
f, _ := ioutil.TempFile("", "TestShouldOverwrite_subject_advisory_json")
|
|
||||||
b, _ := json.Marshal(&Advisory{
|
|
||||||
Subject: "non empty subject",
|
|
||||||
})
|
})
|
||||||
_, _ = f.Write(b)
|
}
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
assert.True(t, shouldOverwrite(f.Name(), "doesnt matter"), "subject advisory json")
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("invalid new advisory version", func(t *testing.T) {
|
|
||||||
f, _ := ioutil.TempFile("", "TestShouldOverwrite_invalid_version_json_new")
|
|
||||||
b, _ := json.Marshal(&Advisory{
|
|
||||||
FixedVersion: "badversionhere",
|
|
||||||
})
|
|
||||||
_, _ = f.Write(b)
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
assert.False(t, shouldOverwrite(f.Name(), "doesnt matter"), "invalid new advisory version")
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("invalid current advisory version", func(t *testing.T) {
|
|
||||||
f, _ := ioutil.TempFile("", "TestShouldOverwrite_invalid_version_json_current")
|
|
||||||
b, _ := json.Marshal(&Advisory{
|
|
||||||
FixedVersion: "1.0.0",
|
|
||||||
})
|
|
||||||
_, _ = f.Write(b)
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
assert.False(t, shouldOverwrite(f.Name(), "badversionhere"), "invalid current advisory version")
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWalkApkBuild(t *testing.T) {
|
func TestWalkApkBuild(t *testing.T) {
|
||||||
advisories, err := walkApkBuild("testdata", "1.0.0")
|
advisories, err := alpine.WalkApkBuild(&alpine.Config{}, "testdata/aports", "1.0.0")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, []Advisory{
|
assert.ElementsMatch(t, []alpine.Advisory{
|
||||||
{IssueID: 0, VulnerabilityID: "CVE-2019-7572", Release: "1.0.0", Package: "testdata", Repository: ".", FixedVersion: "1.2.15-r11", Subject: "", Description: ""},
|
{FixedVersion: "1.2.15-r11", VulnerabilityID: "CVE-2019-7572", Release: "1.0.0", Package: "sdl", Repository: "main"},
|
||||||
{IssueID: 0, VulnerabilityID: "CVE-2019-7574", Release: "1.0.0", Package: "testdata", Repository: ".", FixedVersion: "1.2.15-r11", Subject: "", Description: ""}}, advisories)
|
{FixedVersion: "1.2.15-r11", VulnerabilityID: "CVE-2019-7574", Release: "1.0.0", Package: "sdl", Repository: "main"},
|
||||||
|
|
||||||
|
{FixedVersion: "2.6.8-r0", VulnerabilityID: "CVE-2019-10894", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
{FixedVersion: "2.6.8-r0", VulnerabilityID: "CVE-2019-10895", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
{FixedVersion: "2.6.8-r0", VulnerabilityID: "CVE-2019-10896", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
{FixedVersion: "2.6.8-r0", VulnerabilityID: "CVE-2019-10899", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
{FixedVersion: "2.6.8-r0", VulnerabilityID: "CVE-2019-10901", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
{FixedVersion: "2.6.8-r0", VulnerabilityID: "CVE-2019-10903", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
|
||||||
|
{FixedVersion: "2.6.7-r0", VulnerabilityID: "CVE-2019-9208", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
{FixedVersion: "2.6.7-r0", VulnerabilityID: "CVE-2019-9209", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
{FixedVersion: "2.6.7-r0", VulnerabilityID: "CVE-2019-9214", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
|
||||||
|
{FixedVersion: "2.6.6-r0", VulnerabilityID: "CVE-2019-5717", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
{FixedVersion: "2.6.6-r0", VulnerabilityID: "CVE-2019-5718", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
{FixedVersion: "2.6.6-r0", VulnerabilityID: "CVE-2019-5719", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
{FixedVersion: "2.6.6-r0", VulnerabilityID: "CVE-2019-5721", Release: "1.0.0", Package: "wireshark", Repository: "main"},
|
||||||
|
|
||||||
|
{FixedVersion: "3.0.19-r0", VulnerabilityID: "CVE-2019-11234", Release: "1.0.0", Package: "freeradius", Repository: "main"},
|
||||||
|
{FixedVersion: "3.0.19-r0", VulnerabilityID: "CVE-2019-11235", Release: "1.0.0", Package: "freeradius", Repository: "main"},
|
||||||
|
|
||||||
|
{FixedVersion: "1.7.3-r0", VulnerabilityID: "CVE-2019-9917", Release: "1.0.0", Package: "znc", Repository: "community"},
|
||||||
|
{FixedVersion: "1.7.1-r0", VulnerabilityID: "CVE-2018-14055", Release: "1.0.0", Package: "znc", Repository: "community"},
|
||||||
|
{FixedVersion: "1.7.1-r0", VulnerabilityID: "CVE-2018-14056", Release: "1.0.0", Package: "znc", Repository: "community"},
|
||||||
|
},
|
||||||
|
advisories)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBuildAdvisories(t *testing.T) {
|
func TestBuildAdvisories(t *testing.T) {
|
||||||
secFixes := map[string][]string{
|
secFixes := map[string][]string{
|
||||||
"2.6.8-r0": {"CVE-2019-10894"},
|
"2.6.8-r0": {"CVE-2019-10894"},
|
||||||
|
"2.6.7-r1": {"CVE_2019-2426 XSA-201"}, // typo
|
||||||
"2.6.5-r0": {"CVE_2019-5910 (+ some extra in parens)"},
|
"2.6.5-r0": {"CVE_2019-5910 (+ some extra in parens)"},
|
||||||
}
|
}
|
||||||
|
|
||||||
assert.Equal(t, []Advisory{
|
assert.ElementsMatch(t, []alpine.Advisory{
|
||||||
{IssueID: 0, VulnerabilityID: "CVE-2019-10894", Release: "1.0.0", Package: "testpkg", Repository: "testrepo", FixedVersion: "2.6.8-r0", Subject: "", Description: ""},
|
{IssueID: 0, VulnerabilityID: "CVE-2019-10894", Release: "1.0.0", Package: "testpkg", Repository: "testrepo", FixedVersion: "2.6.8-r0", Subject: "", Description: ""},
|
||||||
|
{IssueID: 0, VulnerabilityID: "CVE-2019-2426", Release: "1.0.0", Package: "testpkg", Repository: "testrepo", FixedVersion: "2.6.7-r1", Subject: "", Description: ""},
|
||||||
|
{IssueID: 0, VulnerabilityID: "XSA-201", Release: "1.0.0", Package: "testpkg", Repository: "testrepo", FixedVersion: "2.6.7-r1", Subject: "", Description: ""},
|
||||||
{IssueID: 0, VulnerabilityID: "CVE-2019-5910", Release: "1.0.0", Package: "testpkg", Repository: "testrepo", FixedVersion: "2.6.5-r0", Subject: "", Description: ""}},
|
{IssueID: 0, VulnerabilityID: "CVE-2019-5910", Release: "1.0.0", Package: "testpkg", Repository: "testrepo", FixedVersion: "2.6.5-r0", Subject: "", Description: ""}},
|
||||||
buildAdvisories(secFixes, "1.0.0", "testpkg", "testrepo"))
|
alpine.BuildAdvisories(&alpine.Config{}, secFixes, "1.0.0", "testpkg", "testrepo"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUpdate(t *testing.T) {
|
func TestConfig_Update(t *testing.T) {
|
||||||
t.Run("happy path", func(t *testing.T) {
|
type cloneOrPull struct {
|
||||||
assert.NoError(t, Update(MockGitConfig{
|
returnArg map[string]struct{}
|
||||||
remotebranch: func(s string) (strings []string, e error) {
|
err error
|
||||||
return []string{"origin/branch1-stable", "origin/branch2", "origin/branch3"}, nil
|
}
|
||||||
},
|
type remoteBranch struct {
|
||||||
}))
|
returnArg []string
|
||||||
})
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
t.Run("invalid branch name", func(t *testing.T) {
|
testCases := []struct {
|
||||||
assert.NoError(t, Update(MockGitConfig{
|
name string
|
||||||
remotebranch: func(s string) (strings []string, e error) {
|
remoteBranch remoteBranch // mock value
|
||||||
return []string{"badbranch-stable"}, nil
|
cloneOrPull cloneOrPull // mock value
|
||||||
|
checkout map[string]error // mock value
|
||||||
|
wantErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "happy path",
|
||||||
|
remoteBranch: remoteBranch{
|
||||||
|
returnArg: []string{"origin/branch1-stable", "origin/branch2", "origin/branch3"},
|
||||||
},
|
},
|
||||||
}))
|
checkout: map[string]error{mock.Anything: nil},
|
||||||
})
|
wantErr: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid branch name",
|
||||||
|
remoteBranch: remoteBranch{returnArg: []string{"badbranch-stable"}},
|
||||||
|
checkout: map[string]error{mock.Anything: nil},
|
||||||
|
wantErr: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "git fails to show remote branches",
|
||||||
|
remoteBranch: remoteBranch{
|
||||||
|
returnArg: nil, err: errors.New("failed to show remote branch"),
|
||||||
|
},
|
||||||
|
checkout: map[string]error{mock.Anything: nil},
|
||||||
|
wantErr: xerrors.Errorf("failed to show branches: %w", errors.New("failed to show remote branch")),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "git clone fails",
|
||||||
|
cloneOrPull: cloneOrPull{
|
||||||
|
returnArg: nil, err: errors.New("failed clone operation"),
|
||||||
|
},
|
||||||
|
checkout: map[string]error{mock.Anything: nil},
|
||||||
|
wantErr: xerrors.Errorf("failed to clone alpine repository: %w", errors.New("failed clone operation")),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "git fails to checkout branch",
|
||||||
|
remoteBranch: remoteBranch{
|
||||||
|
returnArg: []string{"origin/branch1-stable", "origin/branch2", "origin/branch3"},
|
||||||
|
},
|
||||||
|
checkout: map[string]error{mock.Anything: errors.New("failed to checkout branch")},
|
||||||
|
wantErr: xerrors.Errorf("git failed to checkout branch: %w", errors.New("failed to checkout branch")),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "git checkout of a particular branch fails",
|
||||||
|
remoteBranch: remoteBranch{
|
||||||
|
returnArg: []string{"origin/branch1-stable", "origin/branch2", "origin/branch3"},
|
||||||
|
},
|
||||||
|
checkout: map[string]error{
|
||||||
|
"master": errors.New("failed to checkout master"),
|
||||||
|
"origin/branch1-stable": errors.New("failed to checkout branch1-stable"),
|
||||||
|
},
|
||||||
|
wantErr: xerrors.Errorf("git failed to checkout branch: %w", errors.New("failed to checkout branch1-stable")),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
t.Run("git clone fails", func(t *testing.T) {
|
cacheDir := "testdata"
|
||||||
assert.Equal(t, xerrors.Errorf("failed to clone alpine repository: %w", errors.New("failed clone operation")).Error(),
|
repoDir := filepath.Join(cacheDir, "aports")
|
||||||
Update(MockGitConfig{
|
for _, tc := range testCases {
|
||||||
cloneorpull: func(s string, s2 string) (i map[string]struct{}, e error) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
return nil, errors.New("failed clone operation")
|
vulnListDir, err := ioutil.TempDir("", "TestUpdate")
|
||||||
},
|
assert.NoError(t, err)
|
||||||
}).Error(),
|
defer os.RemoveAll(vulnListDir)
|
||||||
)
|
|
||||||
})
|
|
||||||
t.Run("git fails to show remote branches", func(t *testing.T) {
|
|
||||||
assert.Equal(t, xerrors.Errorf("failed to show branches: %w", errors.New("failed to show remote branch")).Error(),
|
|
||||||
Update(MockGitConfig{
|
|
||||||
remotebranch: func(s string) (strings []string, e error) {
|
|
||||||
return []string{}, errors.New("failed to show remote branch")
|
|
||||||
},
|
|
||||||
}).Error(),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
t.Run("git fails to checkout branch", func(t *testing.T) {
|
|
||||||
assert.Equal(t, xerrors.Errorf("error in git checkout: %w", errors.New("failed to checkout branch")).Error(),
|
|
||||||
Update(MockGitConfig{
|
|
||||||
checkout: func(s string, s2 string) error {
|
|
||||||
return errors.New("failed to checkout branch")
|
|
||||||
},
|
|
||||||
}).Error(),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("git checkout of a particular branch fails", func(t *testing.T) {
|
mockGitConfig := new(MockGitConfig)
|
||||||
assert.Equal(t, "error in git checkout: failed to checkout branch", Update(MockGitConfig{
|
|
||||||
remotebranch: func(s string) (strings []string, e error) {
|
// setup expectations with a placeholder in the argument list
|
||||||
return []string{"origin/branch1-stable", "origin/branch2", "origin/branch3"}, nil
|
mockGitConfig.On("RemoteBranch", repoDir).Return(
|
||||||
},
|
tc.remoteBranch.returnArg, tc.remoteBranch.err)
|
||||||
checkout: func(s string, branch string) error {
|
mockGitConfig.On("CloneOrPull", mock.Anything, repoDir).Return(
|
||||||
switch branch {
|
tc.cloneOrPull.returnArg, tc.cloneOrPull.err)
|
||||||
case "master":
|
for arg, returnErr := range tc.checkout {
|
||||||
return errors.New("failed to checkout branch")
|
mockGitConfig.On("Checkout", repoDir, arg).Return(returnErr)
|
||||||
case "origin/branch1-stable":
|
}
|
||||||
return errors.New("failed to checkout branch")
|
|
||||||
}
|
ac := alpine.Config{
|
||||||
return nil
|
GitClient: mockGitConfig,
|
||||||
},
|
CacheDir: cacheDir,
|
||||||
}).Error())
|
VulnListDir: vulnListDir,
|
||||||
})
|
}
|
||||||
|
fmt.Println(vulnListDir)
|
||||||
|
|
||||||
|
err = ac.Update()
|
||||||
|
if tc.wantErr != nil {
|
||||||
|
assert.EqualError(t, err, tc.wantErr.Error())
|
||||||
|
} else {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
err = filepath.Walk(vulnListDir, func(path string, info os.FileInfo, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if info.IsDir() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
paths := strings.Split(path, string(os.PathSeparator))
|
||||||
|
assert.True(t, len(paths) > 3)
|
||||||
|
|
||||||
|
golden := filepath.Join("testdata", "goldens",
|
||||||
|
paths[len(paths)-3], paths[len(paths)-2], paths[len(paths)-1],
|
||||||
|
)
|
||||||
|
|
||||||
|
got, _ := ioutil.ReadFile(path)
|
||||||
|
want, _ := ioutil.ReadFile(golden + ".golden")
|
||||||
|
assert.Equal(t, string(want), string(got), "Alpine result json")
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
9
alpine/export_test.go
Normal file
9
alpine/export_test.go
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package alpine
|
||||||
|
|
||||||
|
var (
|
||||||
|
ShouldOverwrite = (*Config).shouldOverwrite
|
||||||
|
ParsePkgVerRel = (*Config).parsePkgVerRel
|
||||||
|
ParseSecFixes = (*Config).parseSecFixes
|
||||||
|
WalkApkBuild = (*Config).walkApkBuild
|
||||||
|
BuildAdvisories = (*Config).buildAdvisories
|
||||||
|
)
|
111
alpine/testdata/aports/community/znc/APKBUILD
vendored
Normal file
111
alpine/testdata/aports/community/znc/APKBUILD
vendored
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
# Contributor: Natanael Copa <ncopa@alpinelinux.org>
|
||||||
|
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
|
||||||
|
pkgname=znc
|
||||||
|
pkgver=1.7.4
|
||||||
|
pkgrel=0
|
||||||
|
pkgdesc="Advanced IRC bouncer"
|
||||||
|
url="https://wiki.znc.in/ZNC"
|
||||||
|
arch="all"
|
||||||
|
license="Apache-2.0"
|
||||||
|
makedepends="perl-dev openssl-dev cyrus-sasl-dev python2-dev c-ares-dev swig
|
||||||
|
gettext-dev tcl-dev autoconf automake python3-dev icu-dev"
|
||||||
|
pkgusers="$pkgname"
|
||||||
|
pkggroups="$pkgusers"
|
||||||
|
install="$pkgname.pre-install"
|
||||||
|
subpackages="$pkgname-dev $pkgname-doc $pkgname-extra $pkgname-modtcl
|
||||||
|
$pkgname-modperl $pkgname-modpython $pkgname-openrc"
|
||||||
|
source="http://znc.in/releases/znc-$pkgver.tar.gz
|
||||||
|
$pkgname.initd
|
||||||
|
$pkgname.confd"
|
||||||
|
|
||||||
|
# secfixes:
|
||||||
|
# 1.7.3-r0:
|
||||||
|
# - CVE-2019-9917
|
||||||
|
# 1.7.1-r0:
|
||||||
|
# - CVE-2018-14055
|
||||||
|
# - CVE-2018-14056
|
||||||
|
|
||||||
|
build() {
|
||||||
|
export CFLAGS="$CFLAGS -D_GNU_SOURCE"
|
||||||
|
./configure \
|
||||||
|
--build=$CBUILD \
|
||||||
|
--host=$CHOST \
|
||||||
|
--prefix=/usr \
|
||||||
|
--sysconfdir=/etc \
|
||||||
|
--mandir=/usr/share/man \
|
||||||
|
--infodir=/usr/share/info \
|
||||||
|
--localstatedir=/var \
|
||||||
|
--enable-perl \
|
||||||
|
--enable-tcl \
|
||||||
|
--enable-python
|
||||||
|
make
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
make DESTDIR="$pkgdir" install
|
||||||
|
|
||||||
|
install -D -m755 "$srcdir"/$pkgname.initd "$pkgdir"/etc/init.d/$pkgname
|
||||||
|
install -D -m644 "$srcdir"/$pkgname.confd "$pkgdir"/etc/conf.d/$pkgname
|
||||||
|
install -d -m750 -o $pkgusers -g $pkggroups "$pkgdir"/var/lib/znc
|
||||||
|
}
|
||||||
|
|
||||||
|
dev() {
|
||||||
|
default_dev
|
||||||
|
_mv_to_sub usr/bin/znc-buildmod
|
||||||
|
}
|
||||||
|
|
||||||
|
extra() {
|
||||||
|
pkgdesc="Extra modules for ZNC"
|
||||||
|
|
||||||
|
_mv_mod \
|
||||||
|
autovoice.so \
|
||||||
|
block_motd.so \
|
||||||
|
clearbufferonmsg.so \
|
||||||
|
ctcpflood.so \
|
||||||
|
flooddetach.so \
|
||||||
|
imapauth.so \
|
||||||
|
listsockets.so \
|
||||||
|
log.so \
|
||||||
|
notify_connect.so \
|
||||||
|
send_raw.so \
|
||||||
|
shell.so
|
||||||
|
}
|
||||||
|
|
||||||
|
modtcl() {
|
||||||
|
pkgdesc="TCL module for ZNC"
|
||||||
|
depends="znc"
|
||||||
|
|
||||||
|
_mv_mod modtcl.so
|
||||||
|
_mv_to_sub usr/share/znc/modtcl
|
||||||
|
}
|
||||||
|
|
||||||
|
modperl() {
|
||||||
|
pkgdesc="Perl module for ZNC"
|
||||||
|
depends="znc"
|
||||||
|
|
||||||
|
_mv_mod modperl modperl.so
|
||||||
|
}
|
||||||
|
|
||||||
|
modpython() {
|
||||||
|
pkgdesc="Python modules for ZNC"
|
||||||
|
depends="znc"
|
||||||
|
|
||||||
|
_mv_mod modpython modpython.so
|
||||||
|
}
|
||||||
|
|
||||||
|
_mv_mod() {
|
||||||
|
local i; for i in "$@"; do
|
||||||
|
_mv_to_sub usr/lib/znc/$i
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
_mv_to_sub() {
|
||||||
|
local i; for i in "$@"; do
|
||||||
|
mkdir -p "$subpkgdir"/${i%/*}
|
||||||
|
mv "$pkgdir"/$i "$subpkgdir"/$i
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
sha512sums="ea559ee9e06bfbc51c03ef08e145bc39ee7402638cc153fab7dc1dcedae01548fa0743d726304f9e4631a66241eb96c03940b76093954093a35f69641133b2ae znc-1.7.4.tar.gz
|
||||||
|
47f9bd00f07861e195333d2cda5b1c7386e2324a1842b890837a7936a94b65b7a269f7fee656a522ec86b58a94bd451a2a3629bd6465578681b8d0733c2c77dc znc.initd
|
||||||
|
00360f9b487ed5a9d50c85ce597e65c89cf869cabb893c294d0bc7fcd88f9610ecb63ba6df7af1ba1dd977b6d5b05da625a3ee799a46d381f17ac04b976a1f29 znc.confd"
|
10
alpine/testdata/goldens/community/znc/CVE-2018-14055.json.golden
vendored
Normal file
10
alpine/testdata/goldens/community/znc/CVE-2018-14055.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2018-14055",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "znc",
|
||||||
|
"Repository": "community",
|
||||||
|
"FixedVersion": "1.7.1-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/community/znc/CVE-2018-14056.json.golden
vendored
Normal file
10
alpine/testdata/goldens/community/znc/CVE-2018-14056.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2018-14056",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "znc",
|
||||||
|
"Repository": "community",
|
||||||
|
"FixedVersion": "1.7.1-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/community/znc/CVE-2019-9917.json.golden
vendored
Normal file
10
alpine/testdata/goldens/community/znc/CVE-2019-9917.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-9917",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "znc",
|
||||||
|
"Repository": "community",
|
||||||
|
"FixedVersion": "1.7.3-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/freeradius/CVE-2019-11234.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/freeradius/CVE-2019-11234.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-11234",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "freeradius",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "3.0.19-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/freeradius/CVE-2019-11235.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/freeradius/CVE-2019-11235.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-11235",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "freeradius",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "3.0.19-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/sdl/CVE-2019-7572.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/sdl/CVE-2019-7572.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-7572",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "sdl",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "1.2.15-r11",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/sdl/CVE-2019-7574.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/sdl/CVE-2019-7574.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-7574",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "sdl",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "1.2.15-r11",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-10894.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-10894.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-10894",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.8-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-10895.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-10895.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-10895",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.8-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-10896.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-10896.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-10896",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.8-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-10899.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-10899.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-10899",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.8-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-10901.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-10901.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-10901",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.8-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-10903.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-10903.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-10903",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.8-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-5717.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-5717.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-5717",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.6-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-5718.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-5718.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-5718",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.6-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-5719.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-5719.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-5719",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.6-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-5721.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-5721.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-5721",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.6-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-9208.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-9208.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-9208",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.7-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-9209.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-9209.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-9209",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.7-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
10
alpine/testdata/goldens/main/wireshark/CVE-2019-9214.json.golden
vendored
Normal file
10
alpine/testdata/goldens/main/wireshark/CVE-2019-9214.json.golden
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"IssueID": 0,
|
||||||
|
"VulnerabilityID": "CVE-2019-9214",
|
||||||
|
"Release": "branch1",
|
||||||
|
"Package": "wireshark",
|
||||||
|
"Repository": "main",
|
||||||
|
"FixedVersion": "2.6.7-r0",
|
||||||
|
"Subject": "",
|
||||||
|
"Description": ""
|
||||||
|
}
|
5
go.mod
5
go.mod
@ -4,7 +4,6 @@ go 1.13
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/araddon/dateparse v0.0.0-20190426192744-0d74ffceef83
|
github.com/araddon/dateparse v0.0.0-20190426192744-0d74ffceef83
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
|
||||||
github.com/elazarl/goproxy v0.0.0-20190421051319-9d40249d3c2f // indirect
|
github.com/elazarl/goproxy v0.0.0-20190421051319-9d40249d3c2f // indirect
|
||||||
github.com/elazarl/goproxy/ext v0.0.0-20190421051319-9d40249d3c2f // indirect
|
github.com/elazarl/goproxy/ext v0.0.0-20190421051319-9d40249d3c2f // indirect
|
||||||
github.com/fatih/color v1.7.0 // indirect
|
github.com/fatih/color v1.7.0 // indirect
|
||||||
@ -17,10 +16,10 @@ require (
|
|||||||
github.com/moul/http2curl v1.0.0 // indirect
|
github.com/moul/http2curl v1.0.0 // indirect
|
||||||
github.com/parnurzeal/gorequest v0.2.15
|
github.com/parnurzeal/gorequest v0.2.15
|
||||||
github.com/pkg/errors v0.8.0 // indirect
|
github.com/pkg/errors v0.8.0 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
|
||||||
github.com/simplereach/timeutils v1.2.0 // indirect
|
github.com/simplereach/timeutils v1.2.0 // indirect
|
||||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a // indirect
|
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a // indirect
|
||||||
github.com/stretchr/testify v1.2.2 // indirect
|
github.com/stretchr/objx v0.2.0 // indirect
|
||||||
|
github.com/stretchr/testify v1.3.0
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d // indirect
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d // indirect
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
|
||||||
|
8
go.sum
8
go.sum
@ -1,5 +1,6 @@
|
|||||||
github.com/araddon/dateparse v0.0.0-20190426192744-0d74ffceef83 h1:ukTLOeMC0aVxbJWVg6hOsVJ0VPIo8w++PbNsze/pqF8=
|
github.com/araddon/dateparse v0.0.0-20190426192744-0d74ffceef83 h1:ukTLOeMC0aVxbJWVg6hOsVJ0VPIo8w++PbNsze/pqF8=
|
||||||
github.com/araddon/dateparse v0.0.0-20190426192744-0d74ffceef83/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI=
|
github.com/araddon/dateparse v0.0.0-20190426192744-0d74ffceef83/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/elazarl/goproxy v0.0.0-20190421051319-9d40249d3c2f h1:8GDPb0tCY8LQ+OJ3dbHb5sA6YZWXFORQYZx5sdsTlMs=
|
github.com/elazarl/goproxy v0.0.0-20190421051319-9d40249d3c2f h1:8GDPb0tCY8LQ+OJ3dbHb5sA6YZWXFORQYZx5sdsTlMs=
|
||||||
@ -44,8 +45,11 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykE
|
|||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs=
|
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs=
|
||||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
|
||||||
|
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||||
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
|
||||||
|
10
main.go
10
main.go
@ -42,7 +42,8 @@ func main() {
|
|||||||
func run() error {
|
func run() error {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
now := time.Now().UTC()
|
now := time.Now().UTC()
|
||||||
gc := git.Config{}
|
gc := &git.Config{}
|
||||||
|
vulnListDir := utils.VulnListDir()
|
||||||
|
|
||||||
repoOwner := utils.LookupEnv("VULNLIST_REPOSITORY_OWNER", defaultRepoOwner)
|
repoOwner := utils.LookupEnv("VULNLIST_REPOSITORY_OWNER", defaultRepoOwner)
|
||||||
repoName := utils.LookupEnv("VULNLIST_REPOSITORY_NAME", defaultRepoName)
|
repoName := utils.LookupEnv("VULNLIST_REPOSITORY_NAME", defaultRepoName)
|
||||||
@ -96,7 +97,12 @@ func run() error {
|
|||||||
}
|
}
|
||||||
commitMsg = "Ubuntu CVE Tracker"
|
commitMsg = "Ubuntu CVE Tracker"
|
||||||
case "alpine":
|
case "alpine":
|
||||||
if err := alpine.Update(gc); err != nil {
|
ac := alpine.Config{
|
||||||
|
GitClient: gc,
|
||||||
|
CacheDir: utils.CacheDir(),
|
||||||
|
VulnListDir: vulnListDir,
|
||||||
|
}
|
||||||
|
if err := ac.Update(); err != nil {
|
||||||
return xerrors.Errorf("error in Alpine update: %w", err)
|
return xerrors.Errorf("error in Alpine update: %w", err)
|
||||||
}
|
}
|
||||||
commitMsg = "Alpine Issue Tracker"
|
commitMsg = "Alpine Issue Tracker"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user