зеркало из https://github.com/golang/vulndb.git
164 строки
4.2 KiB
Go
164 строки
4.2 KiB
Go
// Copyright 2022 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package ghsa
|
|
|
|
import (
|
|
"flag"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
"golang.org/x/vulndb/internal/proxy"
|
|
"golang.org/x/vulndb/internal/report"
|
|
)
|
|
|
|
var (
|
|
realProxy = flag.Bool("proxy", false, "if true, contact the real module proxy and update expected responses")
|
|
)
|
|
|
|
var testTime = time.Date(1999, 1, 1, 0, 0, 0, 0, time.UTC)
|
|
|
|
func TestGHSAToReport(t *testing.T) {
|
|
updatedTime := time.Date(2022, 01, 01, 01, 01, 00, 00, time.UTC)
|
|
sa := &SecurityAdvisory{
|
|
ID: "G1_blah",
|
|
Identifiers: []Identifier{{Type: "GHSA", Value: "G1"}, {Type: "CVE", Value: "C1"}},
|
|
UpdatedAt: updatedTime,
|
|
Permalink: "https://github.com/permalink/to/G1",
|
|
Description: "a description",
|
|
Vulns: []*Vuln{{
|
|
Package: "golang.org/x/tools/go/packages",
|
|
EarliestFixedVersion: "0.9.0",
|
|
VulnerableVersionRange: "< 0.9.0",
|
|
}},
|
|
References: []Reference{{URL: "https://github.com/permalink/to/issue/12345"}},
|
|
}
|
|
|
|
pc, err := proxy.NewTestClient(t, *realProxy)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
for _, test := range []struct {
|
|
name string
|
|
module string
|
|
want *report.Report
|
|
}{
|
|
{
|
|
name: "module provided",
|
|
module: "golang.org/x/tools",
|
|
want: &report.Report{
|
|
ID: report.PendingID,
|
|
Modules: []*report.Module{{
|
|
Module: "golang.org/x/tools",
|
|
VulnerableAt: "0.8.0",
|
|
Versions: []report.VersionRange{
|
|
{Fixed: "0.9.0"},
|
|
},
|
|
Packages: []*report.Package{{
|
|
Package: "golang.org/x/tools/go/packages",
|
|
}},
|
|
}},
|
|
Summary: "C1 in golang.org/x/tools",
|
|
Description: "a description",
|
|
GHSAs: []string{"G1"},
|
|
CVEs: []string{"C1"},
|
|
References: []*report.Reference{{Type: "REPORT", URL: "https://github.com/permalink/to/issue/12345"}},
|
|
SourceMeta: &report.SourceMeta{
|
|
ID: "G1_blah",
|
|
Created: &testTime,
|
|
},
|
|
ReviewStatus: report.Unreviewed,
|
|
},
|
|
},
|
|
{
|
|
name: "empty module attempts to find module from package",
|
|
module: "",
|
|
want: &report.Report{
|
|
ID: report.PendingID,
|
|
Modules: []*report.Module{{
|
|
Module: "golang.org/x/tools",
|
|
Versions: []report.VersionRange{
|
|
{Fixed: "0.9.0"},
|
|
},
|
|
VulnerableAt: "0.8.0",
|
|
Packages: []*report.Package{{
|
|
Package: "golang.org/x/tools/go/packages",
|
|
},
|
|
{
|
|
Package: "golang.org/x/tools/go/packages",
|
|
}},
|
|
}},
|
|
Summary: "C1 in golang.org/x/tools",
|
|
Description: "a description",
|
|
GHSAs: []string{"G1"},
|
|
CVEs: []string{"C1"},
|
|
References: []*report.Reference{{Type: "REPORT", URL: "https://github.com/permalink/to/issue/12345"}},
|
|
SourceMeta: &report.SourceMeta{
|
|
ID: "G1_blah",
|
|
Created: &testTime,
|
|
},
|
|
ReviewStatus: report.Unreviewed,
|
|
},
|
|
},
|
|
} {
|
|
test := test
|
|
t.Run(test.name, func(t *testing.T) {
|
|
got := report.New(sa, pc, report.WithModulePath(test.module),
|
|
report.WithCreated(testTime))
|
|
if diff := cmp.Diff(*got, *test.want); diff != "" {
|
|
t.Errorf("mismatch (-want, +got):\n%s", diff)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
func TestParseVulnRange(t *testing.T) {
|
|
for _, test := range []struct {
|
|
in string
|
|
want []vulnRangeItem
|
|
}{
|
|
{"", nil},
|
|
{"< 1.2.3", []vulnRangeItem{{"<", "1.2.3"}}},
|
|
{"< 4.3.2, >= 1.2.3", []vulnRangeItem{
|
|
{"<", "4.3.2"},
|
|
{">=", "1.2.3"},
|
|
}},
|
|
} {
|
|
got, err := parseVulnRange(test.in)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !cmp.Equal(got, test.want, cmp.AllowUnexported(vulnRangeItem{})) {
|
|
t.Errorf("%q:\ngot %+v\nwant %+v", test.in, got, test.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestVersions(t *testing.T) {
|
|
for _, test := range []struct {
|
|
earliestFixed string
|
|
vulnRange string
|
|
intro, fixed string
|
|
}{
|
|
{"1.0.0", "< 1.0.0", "", "1.0.0"},
|
|
{"", "<= 1.4.2", "", ""},
|
|
{"1.1.3", ">= 1.1.0, < 1.1.3", "1.1.0", "1.1.3"},
|
|
{
|
|
"1.2.3", "<= 2.3.4",
|
|
`TODO (earliest fixed "1.2.3", vuln range "<= 2.3.4")`, "",
|
|
},
|
|
} {
|
|
got := versions(test.earliestFixed, test.vulnRange)
|
|
want := []report.VersionRange{{
|
|
Introduced: test.intro,
|
|
Fixed: test.fixed,
|
|
}}
|
|
if !cmp.Equal(got, want) {
|
|
t.Errorf("%q, %q:\ngot %+v\nwant %+v",
|
|
test.earliestFixed, test.vulnRange, got, want)
|
|
}
|
|
}
|
|
}
|