diff --git a/DOCS.md b/DOCS.md index f4c8bba..333ddf7 100644 --- a/DOCS.md +++ b/DOCS.md @@ -37,7 +37,7 @@ steps: + text: "Hello Repo {{ .RepositoryName }}!" ``` -Sample of sending a message with attachment file: +Sample of sending a message with local attachment file: ```diff steps: @@ -47,6 +47,22 @@ steps: parameters: - text: "Hello World!" filepath: slack_attachment.json + remote: false + registry: https://github.com +``` + +Sample of sending a message with remote attachment file: + +```diff +steps: + - name: message-with-remote-attachment + image: target/vela-slack:latest + secrets: [ webhook ] + parameters: +- text: "Hello World!" + filepath: slack_attachment.json + remote: true + registry: https://github.com ``` content of `slack_attachment.json`: diff --git a/cmd/vela-slack/main.go b/cmd/vela-slack/main.go index 1131e00..32c5fa6 100644 --- a/cmd/vela-slack/main.go +++ b/cmd/vela-slack/main.go @@ -5,7 +5,6 @@ package main import ( "encoding/json" "fmt" - "io/ioutil" "os" "time" @@ -24,7 +23,7 @@ import ( _ "github.com/joho/godotenv/autoload" ) -// nolint: funlen // ignore length for main +//nolint:funlen // ignore length for main func main() { // capture application version information v := version.New() @@ -92,6 +91,12 @@ func main() { Name: "webhook", Usage: "slack webhook used to post log messages to channel", }, + &cli.BoolFlag{ + EnvVars: []string{"PARAMETER_REMOTE", "SLACK_REMOTE"}, + FilePath: "/vela/parameters/slack/remote,/vela/secrets/slack/remote", + Name: "remote", + Usage: "if filepath is remote or not", + }, // Webhook Flags @@ -289,6 +294,14 @@ func main() { Usage: "environment variable reference for reading in repository trusted", }, + // Registry + &cli.StringFlag{ + EnvVars: []string{"PARAMETER_REGISTRY", "REGISTRY_URL"}, + FilePath: "/vela/parameters/slack/registry-url,/vela/secrets/slack/registry-url", + Name: "registry-url", + Usage: "registry url", + }, + // Optional LDAP config flags &cli.StringFlag{ @@ -321,6 +334,12 @@ func main() { Name: "ldap-search-base", Usage: "environment variable for enterprise LDAP search base", }, + &cli.StringFlag{ + EnvVars: []string{"PARAMETER_TOKEN", "GITHUB_TOKEN"}, + FilePath: "/vela/parameters/slack/token,/vela/secrets/slack/token", + Name: "token", + Usage: "github token from user", + }, } err = app.Run(os.Args) @@ -370,6 +389,7 @@ func run(c *cli.Context) error { Text: c.String("text"), Parse: c.String("parse"), }, + Remote: c.Bool("remote"), Env: &Env{ BuildAuthor: c.String("build-author"), BuildAuthorEmail: c.String("build-author-email"), @@ -392,6 +412,7 @@ func run(c *cli.Context) error { BuildTag: c.String("build-tag"), BuildTitle: c.String("build-title"), BuildWorkspace: c.String("build-workspace"), + RegistryURL: c.String("registry-url"), RepositoryBranch: c.String("repo-branch"), RepoBranch: c.String("repo-branch"), RepositoryClone: c.String("repo-clone"), @@ -410,6 +431,7 @@ func run(c *cli.Context) error { RepoTimeout: c.Int("repo-timeout"), RepositoryTrusted: c.String("repo-trusted"), RepoTrusted: c.String("repo-trusted"), + Token: c.String("token"), }, } @@ -440,7 +462,7 @@ func getSAMAccountName(c *cli.Context) string { // create LDAP client roots := x509.NewCertPool() - caCerts, err := ioutil.ReadFile(c.String("sslcert.path")) + caCerts, err := os.ReadFile(c.String("sslcert.path")) if err != nil { logrus.Errorf("%s", err) diff --git a/cmd/vela-slack/plugin.go b/cmd/vela-slack/plugin.go index 1340ccf..c4a9ba6 100644 --- a/cmd/vela-slack/plugin.go +++ b/cmd/vela-slack/plugin.go @@ -6,13 +6,15 @@ import ( "bytes" "encoding/json" "fmt" - "io/ioutil" + "io" "os" "regexp" "strconv" "strings" "text/template" + registry "github.com/go-vela/server/compiler/registry/github" + "github.com/Masterminds/sprig/v3" "github.com/sirupsen/logrus" "github.com/slack-go/slack" @@ -26,6 +28,7 @@ type ( Env *Env Path string WebhookMsg *slack.WebhookMessage + Remote bool } // Env struct represents the environment variables the Vela injects @@ -52,6 +55,7 @@ type ( BuildTag string BuildTitle string BuildWorkspace string + RegistryURL string RepositoryBranch string RepoBranch string RepositoryClone string @@ -70,11 +74,17 @@ type ( RepoTimeout int RepositoryTrusted string RepoTrusted string + Token string } ) // Exec formats and runs the commands for sending a message via Slack. func (p *Plugin) Exec() error { + var ( + attachments []slack.Attachment + err error + ) + logrus.Debug("running plugin with provided configuration") // clean up newlines that could invalidate JSON @@ -95,8 +105,13 @@ func (p *Plugin) Exec() error { // parse the slack message file if len(p.Path) != 0 { - logrus.Infof("Parsing provided template file %s, ", p.Path) - attachments, err := getAttachmentFromFile(p) + logrus.Infof("Parsing provided template file, %s", p.Path) + + if p.Remote { + attachments, err = getRemoteAttachment(p) + } else { + attachments, err = getAttachmentFromFile(p) + } if err != nil { return fmt.Errorf("unable to parse attachment file: %w", err) @@ -189,6 +204,22 @@ func (p *Plugin) Validate() error { return nil } +// replaceString function converts bytes into string and replaces variables +// such as {{ .BuildCreated }} with a correct values before returning it back into bytes again. +func replaceString(bytes []byte, p *Plugin) []byte { + bStr := string(bytes) + bStr = strings.ReplaceAll(bStr, "{{ .BuildCreated }}", strconv.Itoa(p.Env.BuildCreated)) + bStr = strings.ReplaceAll(bStr, "{{ .BuildEnqueued }}", strconv.Itoa(p.Env.BuildEnqueued)) + bStr = strings.ReplaceAll(bStr, "{{ .BuildFinished }}", strconv.Itoa(p.Env.BuildFinished)) + bStr = strings.ReplaceAll(bStr, "{{ .BuildNumber }}", strconv.Itoa(p.Env.BuildNumber)) + bStr = strings.ReplaceAll(bStr, "{{ .BuildParent }}", strconv.Itoa(p.Env.BuildParent)) + bStr = strings.ReplaceAll(bStr, "{{ .BuildStarted }}", strconv.Itoa(p.Env.BuildStarted)) + bStr = strings.ReplaceAll(bStr, "{{ .RepositoryTimeout }}", strconv.Itoa(p.Env.RepositoryTimeout)) + bytes = []byte(bStr) + + return bytes +} + // getAttachmentFromFile function to open and parse json file into // slack webhook message payload. func getAttachmentFromFile(p *Plugin) ([]slack.Attachment, error) { @@ -201,27 +232,59 @@ func getAttachmentFromFile(p *Plugin) ([]slack.Attachment, error) { defer jsonFile.Close() // read the contents of the json template - bytes, err := ioutil.ReadAll(jsonFile) + bytes, err := io.ReadAll(jsonFile) if err != nil { return nil, fmt.Errorf("unable to read json file: %w", err) } - // Converts bytes into string and replaces {{ .BuildCreated }} - // with a timestamp before returning it back into bytes again. - bStr := string(bytes) - // x := strconv.Itoa(p.Env.BuildCreated) - bStr = strings.Replace(bStr, "{{ .BuildCreated }}", strconv.Itoa(p.Env.BuildCreated), -1) - bStr = strings.Replace(bStr, "{{ .BuildEnqueued }}", strconv.Itoa(p.Env.BuildEnqueued), -1) - bStr = strings.Replace(bStr, "{{ .BuildFinished }}", strconv.Itoa(p.Env.BuildFinished), -1) - bStr = strings.Replace(bStr, "{{ .BuildNumber }}", strconv.Itoa(p.Env.BuildNumber), -1) - bStr = strings.Replace(bStr, "{{ .BuildParent }}", strconv.Itoa(p.Env.BuildParent), -1) - bStr = strings.Replace(bStr, "{{ .BuildStarted }}", strconv.Itoa(p.Env.BuildStarted), -1) - bStr = strings.Replace(bStr, "{{ .RepositoryTimeout }}", strconv.Itoa(p.Env.RepositoryTimeout), -1) - bytes = []byte(bStr) + bytes = replaceString(bytes, p) + + // create a variable to hold our message + var msg slack.WebhookMessage + + // cast bytes to go struct + err = json.Unmarshal(bytes, &msg) + if err != nil { + return nil, fmt.Errorf("unable to unmarshal json file: %w", err) + } + + return msg.Attachments, err +} + +// getRemoteAttachment function to open and parse slack attachment json file into +// slack webhook message payload. +func getRemoteAttachment(p *Plugin) ([]slack.Attachment, error) { + var ( + bytes []byte + err error + ) + + reg, err := registry.New(p.Env.RegistryURL, p.Env.Token) + if err != nil { + return nil, err + } + + // parse source from slack attachment + src, err := reg.Parse(p.Path) + if err != nil { + return nil, fmt.Errorf("invalid slack attachment source provided: %w", err) + } + + logrus.WithFields(logrus.Fields{ + "org": src.Org, + "repo": src.Repo, + "path": src.Name, + "host": src.Host, + }).Tracef("Using authenticated GitHub client to pull template") + + // use private (authenticated) github instance to pull from + bytes, err = reg.Template(nil, src) + if err != nil { + return nil, err + } + + bytes = replaceString(bytes, p) - logrus.Info("pip") - logrus.Info(bStr) - logrus.Info("pip") // create a variable to hold our message var msg slack.WebhookMessage diff --git a/cmd/vela-slack/plugin_test.go b/cmd/vela-slack/plugin_test.go index 88401b8..3bd588f 100644 --- a/cmd/vela-slack/plugin_test.go +++ b/cmd/vela-slack/plugin_test.go @@ -6,6 +6,7 @@ import ( "fmt" "net/http" "net/http/httptest" + "os" "testing" "github.com/slack-go/slack" @@ -20,6 +21,7 @@ func TestSlack_Plugin_Validate(t *testing.T) { WebhookMsg: &slack.WebhookMessage{ Text: "hello", }, + Remote: false, } err := p.Validate() @@ -35,6 +37,7 @@ func TestSlack_Plugin_Validate_Missing_Webhook(t *testing.T) { Env: &Env{}, Path: "", WebhookMsg: &slack.WebhookMessage{}, + Remote: false, } err := p.Validate() @@ -50,6 +53,7 @@ func TestSlack_Plugin_Validate_Missing_Text_And_Path(t *testing.T) { Env: &Env{}, Path: "", WebhookMsg: &slack.WebhookMessage{}, + Remote: false, } err := p.Validate() @@ -72,6 +76,7 @@ func TestSlack_Plugin_Exec(t *testing.T) { WebhookMsg: &slack.WebhookMessage{ Text: "hello", }, + Remote: false, } err := p.Exec() @@ -94,6 +99,45 @@ func TestSlack_Plugin_Exec_Attachment(t *testing.T) { WebhookMsg: &slack.WebhookMessage{ Text: "hello", }, + Remote: false, + } + + err := p.Exec() + if err != nil { + t.Errorf("Exec returned err: %v", err) + } +} + +func TestSlack_Plugin_Exec_Remote_Attachment(t *testing.T) { + // setup types + ta := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + bytes, err := os.ReadFile("./testdata/slack_attachment_remote.json") + if err != nil { + t.Errorf("ReadFile error: %v", err) + } + _, err = w.Write(bytes) + if err != nil { + t.Errorf("Write error: %v", err) + } + + w.WriteHeader(http.StatusOK) + })) + defer ta.Close() + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "ok") + })) + defer ts.Close() + + p := &Plugin{ + Webhook: ts.URL, + Env: &Env{ + RegistryURL: ta.URL, + }, + Path: "github.com/go-vela/vela-slack/cmd/vela-slack/testdata/slack_attachment.json", + WebhookMsg: &slack.WebhookMessage{}, + Remote: true, } err := p.Exec() @@ -114,6 +158,123 @@ func TestSlack_Plugin_Exec_Bad_Attachment(t *testing.T) { Env: &Env{}, Path: "testdata/slack_attachment_bad.json", WebhookMsg: &slack.WebhookMessage{}, + Remote: false, + } + + err := p.Exec() + if err == nil { + t.Error("Exec should return err due to invalid JSON file") + } +} + +func TestSlack_Plugin_Exec_Bad_Remote_Attachment_Parse(t *testing.T) { + // setup types + ta := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + bytes, err := os.ReadFile("./testdata/slack_attachment_bad.json") + if err != nil { + t.Errorf("ReadFile error: %v", err) + } + _, err = w.Write(bytes) + if err != nil { + t.Errorf("Write error: %v", err) + } + + w.WriteHeader(http.StatusOK) + })) + defer ta.Close() + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "ok") + })) + defer ts.Close() + + p := &Plugin{ + Webhook: ts.URL, + Env: &Env{ + RegistryURL: ta.URL, + }, + Path: "testdata/slack_attachment_bad.json", + WebhookMsg: &slack.WebhookMessage{}, + Remote: true, + } + + err := p.Exec() + if err == nil { + t.Error("Exec should return err due to invalid slack attachment") + } +} + +func TestSlack_Plugin_Exec_Bad_Remote_Attachment(t *testing.T) { + // setup types + ta := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + bytes, err := os.ReadFile("./testdata/slack_attachment_bad.json") + if err != nil { + t.Errorf("ReadFile error: %v", err) + } + + _, err = w.Write(bytes) + if err != nil { + t.Errorf("Write error: %v", err) + } + + w.WriteHeader(http.StatusOK) + })) + defer ta.Close() + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "ok") + })) + defer ts.Close() + + p := &Plugin{ + Webhook: ts.URL, + Env: &Env{ + RegistryURL: ta.URL, + }, + Path: "github.com/go-vela/vela-slack/cmd/vela-slack/testdata/slack_attachment_bad.json", + WebhookMsg: &slack.WebhookMessage{}, + Remote: true, + } + + err := p.Exec() + if err == nil { + t.Error("Exec should return err due to invalid JSON file") + } +} + +func TestSlack_Plugin_Exec_Bad_Remote_Attachment_Unmarshal(t *testing.T) { + // setup types + ta := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + bytes, err := os.ReadFile("./testdata/slack_attachment_remote_bad.json") + if err != nil { + t.Errorf("ReadFile error: %v", err) + } + + _, err = w.Write(bytes) + if err != nil { + t.Errorf("Write error: %v", err) + } + + w.WriteHeader(http.StatusOK) + })) + defer ta.Close() + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "ok") + })) + defer ts.Close() + + p := &Plugin{ + Webhook: ts.URL, + Env: &Env{ + RegistryURL: ta.URL, + }, + Path: "github.com/go-vela/vela-slack/cmd/vela-slack/testdata/slack_attachment_remote_bad.json", + WebhookMsg: &slack.WebhookMessage{}, + Remote: true, } err := p.Exec() @@ -134,6 +295,7 @@ func TestSlack_Plugin_Exec_Bad_File_Ref(t *testing.T) { Env: &Env{}, Path: "testdata/slack_attachment_404.json", WebhookMsg: &slack.WebhookMessage{}, + Remote: false, } err := p.Exec() @@ -157,6 +319,7 @@ Newlines`, }, Path: "testdata/slack_attachment.json", WebhookMsg: &slack.WebhookMessage{}, + Remote: false, } err := p.Exec() @@ -182,6 +345,7 @@ Newlines`, WebhookMsg: &slack.WebhookMessage{ Text: "Build Message: {{ .BuildMessage }}", }, + Remote: false, } err := p.Exec() @@ -204,6 +368,7 @@ func TestSlack_Plugin_Exec_Sprig_Text(t *testing.T) { WebhookMsg: &slack.WebhookMessage{ Text: "{{ .BuildAuthorEmail | lower }}", }, + Remote: false, } err := p.Exec() @@ -226,6 +391,7 @@ func TestSlack_Plugin_Exec_Remove_Escape_Chara(t *testing.T) { WebhookMsg: &slack.WebhookMessage{ Text: "{{ trimAll \"@company.com\" .BuildAuthorEmail }}", }, + Remote: false, } err := p.Exec() @@ -248,6 +414,7 @@ func TestSlack_Plugin_Exec_Do_Not_Remove_Escape_Chara(t *testing.T) { WebhookMsg: &slack.WebhookMessage{ Text: "{\"hello\": \"world\", \"hello_world\": true, \"urls\": {\"url_one\": \"https://github.com\", \"url_two\": \"https://github.com/octocat\"}}", }, + Remote: false, } err := p.Exec() diff --git a/cmd/vela-slack/testdata/slack_attachment_remote.json b/cmd/vela-slack/testdata/slack_attachment_remote.json new file mode 100644 index 0000000..d73c378 --- /dev/null +++ b/cmd/vela-slack/testdata/slack_attachment_remote.json @@ -0,0 +1,18 @@ +{ + "type": "file", + "encoding": "base64", + "size": 5362, + "name": "slack_attachment.json", + "path": "slack_attachment.json", + "content": "ewogICAgImF0dGFjaG1lbnRzIjogWwogICAgICAgIHsKICAgICAgICAgICAgImZhbGxiYWNrIjogIlJlcXVpcmVkIHBsYWluLXRleHQgc3VtbWFyeSBvZiB0aGUgYXR0YWNobWVudC4iLAogICAgICAgICAgICAiY29sb3IiOiAiIzM2YTY0ZiIsCiAgICAgICAgICAgICJwcmV0ZXh0IjogIk9wdGlvbmFsIHRleHQgdGhhdCBhcHBlYXJzIGFib3ZlIHRoZSBhdHRhY2htZW50IGJsb2NrIiwKICAgICAgICAgICAgImF1dGhvcl9uYW1lIjogIkJvYmJ5IFRhYmxlcyIsCiAgICAgICAgICAgICJhdXRob3JfbGluayI6ICJodHRwOi8vZmxpY2tyLmNvbS9ib2JieS8iLAogICAgICAgICAgICAiYXV0aG9yX2ljb24iOiAiaHR0cDovL2ZsaWNrci5jb20vaWNvbnMvYm9iYnkuanBnIiwKICAgICAgICAgICAgInRpdGxlIjogIlNsYWNrIEFQSSBEb2N1bWVudGF0aW9uIiwKICAgICAgICAgICAgInRpdGxlX2xpbmsiOiAiaHR0cHM6Ly9hcGkuc2xhY2suY29tLyIsCiAgICAgICAgICAgICJ0ZXh0IjogIkJ1aWxkIE1lc3NhZ2U6IHt7IC5CdWlsZE1lc3NhZ2UgfX0iLAogICAgICAgICAgICAiZmllbGRzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJQcmlvcml0eSIsCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIkhpZ2giLAogICAgICAgICAgICAgICAgICAgICJzaG9ydCI6IGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbWFnZV91cmwiOiAiaHR0cDovL215LXdlYnNpdGUuY29tL3BhdGgvdG8vaW1hZ2UuanBnIiwKICAgICAgICAgICAgInRodW1iX3VybCI6ICJodHRwOi8vZXhhbXBsZS5jb20vcGF0aC90by90aHVtYi5wbmciLAogICAgICAgICAgICAiZm9vdGVyIjogIlNsYWNrIEFQSSIsCiAgICAgICAgICAgICJmb290ZXJfaWNvbiI6ICJodHRwczovL3BsYXRmb3JtLnNsYWNrLWVkZ2UuY29tL2ltZy9kZWZhdWx0X2FwcGxpY2F0aW9uX2ljb24ucG5nIiwKICAgICAgICAgICAgInRzIjogInt7IC5CdWlsZENyZWF0ZWQgfX0iCiAgICAgICAgfQogICAgXQp9", + "sha": "3d21ec53a331a6f037a91c368710b99387d012c1", + "url": "https://api.github.com/repos/octokit/octokit.rb/contents/slack_attachment.json", + "git_url": "https://api.github.com/repos/octokit/octokit.rb/git/blobs/3d21ec53a331a6f037a91c368710b99387d012c1", + "html_url": "https://github.com/octokit/octokit.rb/blob/main/slack_attachment.json", + "download_url": "https://raw.githubusercontent.com/octokit/octokit.rb/main/slack_attachment.json", + "_links": { + "git": "https://api.github.com/repos/octokit/octokit.rb/git/blobs/3d21ec53a331a6f037a91c368710b99387d012c1", + "self": "https://api.github.com/repos/octokit/octokit.rb/contents/slack_attachment.json", + "html": "https://github.com/octokit/octokit.rb/blob/main/slack_attachment.json" + } + } \ No newline at end of file diff --git a/cmd/vela-slack/testdata/slack_attachment_remote_bad.json b/cmd/vela-slack/testdata/slack_attachment_remote_bad.json new file mode 100644 index 0000000..852c0fe --- /dev/null +++ b/cmd/vela-slack/testdata/slack_attachment_remote_bad.json @@ -0,0 +1,18 @@ +{ + "type": "file", + "encoding": "base64", + "size": 5362, + "name": "slack_attachment.json", + "path": "slack_attachment.json", + "content": "", + "sha": "3d21ec53a331a6f037a91c368710b99387d012c1", + "url": "https://api.github.com/repos/octokit/octokit.rb/contents/slack_attachment.json", + "git_url": "https://api.github.com/repos/octokit/octokit.rb/git/blobs/3d21ec53a331a6f037a91c368710b99387d012c1", + "html_url": "https://github.com/octokit/octokit.rb/blob/main/slack_attachment.json", + "download_url": "https://raw.githubusercontent.com/octokit/octokit.rb/main/slack_attachment.json", + "_links": { + "git": "https://api.github.com/repos/octokit/octokit.rb/git/blobs/3d21ec53a331a6f037a91c368710b99387d012c1", + "self": "https://api.github.com/repos/octokit/octokit.rb/contents/slack_attachment.json", + "html": "https://github.com/octokit/octokit.rb/blob/main/slack_attachment.json" + } + } \ No newline at end of file diff --git a/go.mod b/go.mod index ba9448c..07beacd 100644 --- a/go.mod +++ b/go.mod @@ -1,24 +1,45 @@ module github.com/go-vela/vela-slack -go 1.20 +go 1.21 + +toolchain go1.21.4 require ( github.com/Masterminds/semver/v3 v3.2.1 github.com/Masterminds/sprig/v3 v3.2.3 github.com/go-ldap/ldap/v3 v3.4.5 - github.com/go-vela/types v0.19.2 + github.com/go-vela/types v0.22.0 github.com/joho/godotenv v1.5.1 github.com/sirupsen/logrus v1.9.3 github.com/slack-go/slack v0.12.2 github.com/urfave/cli/v2 v2.25.7 ) +require ( + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/buildkite/yaml v0.0.0-20181016232759-0caa5f0796e3 // indirect + github.com/drone/envsubst v1.0.3 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/go-github/v56 v56.0.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/goware/urlx v0.3.2 // indirect + github.com/stretchr/testify v1.8.3 // indirect + golang.org/x/net v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) + require ( github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/go-vela/server v0.22.2 + github.com/google/uuid v1.4.0 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/huandu/xstrings v1.3.3 // indirect github.com/imdario/mergo v0.3.12 // indirect @@ -28,6 +49,7 @@ require ( github.com/shopspring/decimal v1.2.0 // indirect github.com/spf13/cast v1.3.1 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect - golang.org/x/crypto v0.7.0 // indirect - golang.org/x/sys v0.6.0 // indirect + golang.org/x/crypto v0.15.0 // indirect + golang.org/x/oauth2 v0.14.0 // indirect + golang.org/x/sys v0.14.0 // indirect ) diff --git a/go.sum b/go.sum index f1e7a43..9dcee31 100644 --- a/go.sum +++ b/go.sum @@ -7,28 +7,72 @@ github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0 github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= +github.com/buildkite/yaml v0.0.0-20181016232759-0caa5f0796e3 h1:q+sMKdA6L8LyGVudTkpGoC73h6ak2iWSPFiFo/pFOU8= +github.com/buildkite/yaml v0.0.0-20181016232759-0caa5f0796e3/go.mod h1:5hCug3EZaHXU3FdCA3gJm0YTNi+V+ooA2qNTiVpky4A= +github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/drone/envsubst v1.0.3 h1:PCIBwNDYjs50AsLZPYdfhSATKaRg/FJmDc2D6+C2x8g= +github.com/drone/envsubst v1.0.3/go.mod h1:N2jZmlMufstn1KEqvbHjw40h1KyTmnVzHcSc9bFiJ2g= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A= github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-ldap/ldap/v3 v3.4.5 h1:ekEKmaDrpvR2yf5Nc/DClsGG9lAmdDixe44mLzlW5r8= github.com/go-ldap/ldap/v3 v3.4.5/go.mod h1:bMGIq3AGbytbaMwf8wdv5Phdxz0FWHTIYMSzyrYgnQs= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-vela/types v0.19.2 h1:xU61CX2jdMuBCtLOg8a7Z2aEWYM1zZt37Ygx1oHGbjM= -github.com/go-vela/types v0.19.2/go.mod h1:ZvDjYCKU36yJS3sLxPLCny/HLF1U6YtlOienzv/cXB4= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/go-vela/server v0.22.2 h1:jDlkQBqi4vxmnJkUVIUTdZeUAEoEVejdd6Mkm25QMrs= +github.com/go-vela/server v0.22.2/go.mod h1:DidWsP+FCWot5ePim0jjvQqhaheOKjSMoVtAfXeNTyU= +github.com/go-vela/types v0.22.0 h1:JmAQ9Hy4HnOgbgNsNz5x1wu3Myv47KoC0rxR9x36OQ4= +github.com/go-vela/types v0.22.0/go.mod h1:ljNY36D6YkpObBbNF7Xslv3oxN4mGuQAwWhnnK/V06I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github/v56 v56.0.0 h1:TysL7dMa/r7wsQi44BjqlwaHvwlFlqkK8CtBWCX3gb4= +github.com/google/go-github/v56 v56.0.0/go.mod h1:D8cdcX98YWJvi7TLo7zM4/h8ZTx6u6fwGEkCdisopo0= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/goware/urlx v0.3.2 h1:gdoo4kBHlkqZNaf6XlQ12LGtQOmpKJrR04Rc3RnpJEo= +github.com/goware/urlx v0.3.2/go.mod h1:h8uwbJy68o+tQXCGZNa9D73WN8n0r9OBae5bUnLcgjw= github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= @@ -36,12 +80,30 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -60,26 +122,40 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= +golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -91,29 +167,42 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=