Skip to content

Commit 6429ff5

Browse files
author
Prashant Balachandran
committed
changes for sarif format
changing version of testify removed stretchr from go.sum correcting dependencies in go.mod changing function call to support older version of go
1 parent 6d1e1a8 commit 6429ff5

File tree

6 files changed

+186
-10
lines changed

6 files changed

+186
-10
lines changed

analyses/stackanalyses/controller.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const (
3737
)
3838

3939
//StackAnalyses is main controller function for analyse command. This function is responsible for all communications between cmd and custom packages.
40-
func StackAnalyses(requestParams driver.RequestType, jsonOut bool, verboseOut bool) bool {
40+
func StackAnalyses(requestParams driver.RequestType, jsonOut bool, verboseOut bool, sarifFmt bool) bool {
4141
log.Debug().Msgf("Executing StackAnalyses.")
4242
var hasVul bool
4343
matcher, err := GetMatcher(requestParams.RawManifestFile)
@@ -51,7 +51,13 @@ func StackAnalyses(requestParams driver.RequestType, jsonOut bool, verboseOut bo
5151
verboseEligible := getResponse.RegistrationStatus == RegisteredStatus
5252
showVerboseMsg := verboseOut && !verboseEligible
5353

54-
if verboseOut && verboseEligible {
54+
if verboseEligible && sarifFmt {
55+
hasVul, err = verbose.ProcessSarif(getResponse, mc.fileStats.RawFilePath)
56+
if err != nil {
57+
log.Fatal().Err(err)
58+
return false
59+
}
60+
} else if verboseOut && verboseEligible {
5561
hasVul = verbose.ProcessVerbose(getResponse, jsonOut)
5662
} else {
5763
hasVul = summary.ProcessSummary(getResponse, jsonOut, showVerboseMsg)

analyses/verbose/helper.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@ package verbose
33
import (
44
"encoding/json"
55
"fmt"
6-
"os"
7-
"sort"
8-
96
"github.com/fabric8-analytics/cli-tools/utils"
10-
117
"github.com/fatih/color"
128
"github.com/rs/zerolog/log"
9+
"os"
10+
"sort"
1311

1412
"github.com/fabric8-analytics/cli-tools/analyses/driver"
1513
)

analyses/verbose/sarif_helper.go

+153
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
package verbose
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"github.com/fabric8-analytics/cli-tools/analyses/driver"
7+
"github.com/owenrumney/go-sarif/models"
8+
"github.com/owenrumney/go-sarif/sarif"
9+
"github.com/rs/zerolog/log"
10+
"io/ioutil"
11+
"os"
12+
"regexp"
13+
"strings"
14+
)
15+
16+
type RegexDependencyLocator struct {
17+
FileContent string
18+
Ecosystem string
19+
EndIndices []int
20+
DependencyNodeIndex []int
21+
}
22+
23+
func ProcessSarif(analysedResult driver.GetResponseType, manifestFilePath string) (bool, error) {
24+
var hasVuln bool
25+
report, err := sarif.New(sarif.Version210)
26+
27+
if err != nil {
28+
log.Fatal().Msg("Error forming SARIF respose")
29+
return false, errors.New("unable to create SARIF file")
30+
}
31+
32+
run := report.AddRun("CRDA", "https://github.com/fabric8-analytics")
33+
34+
regexDependencyLocator := RegexDependencyLocator{}
35+
if len(analysedResult.AnalysedDeps) == 0 {
36+
log.Fatal().Msg("Dependencies have not been analysed")
37+
return false, errors.New("dependencies have not been analysed")
38+
}
39+
err = regexDependencyLocator.SetUp(manifestFilePath, analysedResult.AnalysedDeps[0].Ecosystem)
40+
41+
if err != nil {
42+
return false, errors.New("unable to setup dependency locator")
43+
}
44+
45+
manifestParts := strings.Split(manifestFilePath, string(os.PathSeparator))
46+
manifest := manifestParts[len(manifestParts) - 1]
47+
for _, dep := range analysedResult.AnalysedDeps {
48+
line, column := regexDependencyLocator.LocateDependency(dep.Name)
49+
for _, publicVuln := range dep.PublicVulnerabilities {
50+
addVulnToReport(run, publicVuln, manifest, line, column)
51+
hasVuln = true
52+
}
53+
for _, privateVuln := range dep.PrivateVulnerabilities {
54+
addVulnToReport(run, privateVuln, manifest, line, column)
55+
hasVuln = true
56+
}
57+
}
58+
59+
report.Write(os.Stdout)
60+
return hasVuln, nil
61+
}
62+
63+
func addVulnToReport(run *models.Run, vuln driver.VulnerabilitiesType, manifestFilePath string, line int, column int) {
64+
rule := run.AddRule(vuln.ID).
65+
WithHelpURI(vuln.URL).WithDescription(vuln.Title)
66+
67+
run.AddResult(rule.ID).
68+
WithMessage(vuln.Title).
69+
WithLevel(vuln.Severity).
70+
WithLocationDetails(manifestFilePath, line, column)
71+
}
72+
73+
74+
func (r *RegexDependencyLocator) SetUp(manifestFilePath string, ecosystem string) error{
75+
content, err := ioutil.ReadFile(manifestFilePath)
76+
if err != nil {
77+
log.Fatal().Msg("Unable to load manifest File " + manifestFilePath)
78+
return fmt.Errorf("unable to load manifest file %s" ,manifestFilePath)
79+
}
80+
81+
r.FileContent = string(content)
82+
r.Ecosystem = ecosystem
83+
newLineRegex, _ := regexp.Compile("\n")
84+
85+
lines := newLineRegex.FindAllStringIndex(r.FileContent, -1)
86+
r.EndIndices = make([]int, len(lines))
87+
// Finding the end index for each end of line
88+
for i, line := range lines {
89+
r.EndIndices[i] = line[1]
90+
}
91+
92+
dependenciesRegex, _ := regexp.Compile(getDependencyNodeRegex(r.Ecosystem))
93+
// Find the index for the start of the dependency node ( <dependencies> in case of pom.xml,
94+
// dependencies: in case of package.json)
95+
r.DependencyNodeIndex = dependenciesRegex.FindStringIndex(r.FileContent)
96+
97+
return nil
98+
99+
}
100+
101+
func (r *RegexDependencyLocator) LocateDependency(dependency string) (int, int){
102+
// In case of maven the dependency consists groupId and artifactID
103+
// Picking up the artifact ID as the dependency
104+
if r.Ecosystem == "maven" {
105+
dependencyParts := strings.Split(dependency, ":")
106+
dependency = dependencyParts[len(dependencyParts) - 1]
107+
}
108+
// Adding the actual dependency in to the dependency regex
109+
dependencyRegexStr := strings.Replace(getDependencyRegex(r.Ecosystem), "?", dependency, 1)
110+
dependencyRegex, _ := regexp.Compile(dependencyRegexStr)
111+
dependencyIndex := dependencyRegex.FindStringIndex(r.FileContent)
112+
113+
var lineNum int
114+
var column int
115+
116+
// Check if the dependency index is within the dependency node
117+
if r.DependencyNodeIndex[0] < dependencyIndex[0] && dependencyIndex[0] < r.DependencyNodeIndex[1] {
118+
for i, val := range r.EndIndices {
119+
// Getting the line num and column number of the dependency
120+
if val <= dependencyIndex[0] && dependencyIndex[0] < r.EndIndices[i+1] {
121+
lineNum = i + 2
122+
column = dependencyIndex[0] - val + 2
123+
break
124+
}
125+
}
126+
}
127+
return lineNum, column
128+
}
129+
130+
func getDependencyNodeRegex(ecosystem string) string{
131+
switch ecosystem {
132+
case "npm":
133+
return "\"dependencies\"[\\s]*:[\\s\n]*{[\\s\na-z\"\\d.,\\-:^]*}"
134+
case "maven":
135+
return "<dependencies[\\s\\n]*>[\\s]*[\\s\\n]*[<>!\\s\\w\\/${}\"\\d.,\\-:^]*<\\/dependencies[\\s\\n]*>"
136+
default:
137+
return "[\\s\\S]*"
138+
139+
}
140+
}
141+
142+
func getDependencyRegex(ecosystem string) string{
143+
switch ecosystem{
144+
case "npm":
145+
return "\"?\"[\\s]*:[\\s\n]*\"[\\d\\.^\\-\\w]*\""
146+
case "maven":
147+
return "?[\\s\\n]*<\\/artifactId[\\s\\n]*>"
148+
default:
149+
return "?[\\s]*=="
150+
151+
}
152+
}
153+

cmd/analyse.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515

1616
var jsonOut bool
1717
var verboseOut bool
18+
var sarifOut bool
1819

1920
// analyseCmd represents the analyse command
2021
var analyseCmd = &cobra.Command{
@@ -31,6 +32,7 @@ func init() {
3132
rootCmd.AddCommand(analyseCmd)
3233
analyseCmd.Flags().BoolVarP(&jsonOut, "json", "j", false, "Set output format to JSON.")
3334
analyseCmd.Flags().BoolVarP(&verboseOut, "verbose", "v", false, "Detailed Analyses Report.")
35+
analyseCmd.Flags().BoolVarP(&sarifOut, "sarif", "s", false, "Report in Sarif format.")
3436
}
3537

3638
// destructor deletes intermediary files used to have stack analyses
@@ -76,7 +78,9 @@ func runAnalyse(cmd *cobra.Command, args []string) {
7678
if !jsonOut {
7779
fmt.Fprintln(os.Stdout, "Analysing your Dependency Stack! Please wait...")
7880
}
79-
hasVul := sa.StackAnalyses(requestParams, jsonOut, verboseOut)
81+
82+
hasVul := sa.StackAnalyses(requestParams, jsonOut, verboseOut, sarifOut)
83+
8084
if hasVul {
8185
// Stack has vulnerability, exit with 2 code
8286
os.Exit(2)

go.mod

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ require (
88
github.com/jpillora/backoff v1.0.0
99
github.com/manifoldco/promptui v0.8.0
1010
github.com/mitchellh/go-homedir v1.1.0
11+
github.com/owenrumney/go-sarif v0.0.8
1112
github.com/rs/zerolog v1.20.0
1213
github.com/spf13/cobra v1.1.1
1314
github.com/spf13/viper v1.7.1
14-
github.com/stretchr/testify v1.6.1
15+
github.com/stretchr/testify v1.7.0
1516
)

go.sum

+16-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl
1111
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
1212
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
1313
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
14+
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
1415
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
1516
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
1617
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
@@ -24,9 +25,11 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
2425
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
2526
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
2627
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
28+
github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
2729
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
2830
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
2931
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
32+
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
3033
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
3134
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
3235
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
@@ -73,6 +76,7 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI
7376
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
7477
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
7578
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
79+
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
7680
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
7781
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
7882
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
@@ -106,6 +110,7 @@ github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2E
106110
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
107111
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
108112
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
113+
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
109114
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
110115
github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU=
111116
github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU=
@@ -114,8 +119,10 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW
114119
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
115120
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
116121
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
122+
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
117123
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
118124
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
125+
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
119126
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
120127
github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw=
121128
github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
@@ -146,6 +153,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
146153
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
147154
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
148155
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
156+
github.com/owenrumney/go-sarif v0.0.8 h1:rxNjz+/hm8s4+NUtq1mnvY5NbAr6RqppTzlT+QH2c28=
157+
github.com/owenrumney/go-sarif v0.0.8/go.mod h1:fcYnVdYRfXWB943S0WaZrjAMuoTEj7vqS7JpOMf6CG0=
149158
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
150159
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
151160
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
@@ -173,7 +182,9 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb
173182
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
174183
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
175184
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
185+
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
176186
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
187+
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
177188
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
178189
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
179190
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
@@ -196,8 +207,8 @@ github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
196207
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
197208
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
198209
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
199-
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
200-
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
210+
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
211+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
201212
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
202213
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
203214
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
@@ -295,6 +306,7 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn
295306
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
296307
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
297308
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
309+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
298310
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
299311
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
300312
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
@@ -319,6 +331,7 @@ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiq
319331
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
320332
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
321333
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
334+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
322335
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
323336
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
324337
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
@@ -329,6 +342,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
329342
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
330343
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
331344
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
345+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
332346
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
333347
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
334348
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

0 commit comments

Comments
 (0)