| // Copyright 2024 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 main | |
| import ( | |
| "context" | |
| "fmt" | |
| "io/fs" | |
| "os" | |
| "github.com/go-git/go-git/v5" | |
| "golang.org/x/vulndb/internal/ghsa" | |
| "golang.org/x/vulndb/internal/gitrepo" | |
| "golang.org/x/vulndb/internal/issues" | |
| "golang.org/x/vulndb/internal/pkgsite" | |
| "golang.org/x/vulndb/internal/proxy" | |
| "golang.org/x/vulndb/internal/triage/priority" | |
| ) | |
| // environment stores fakes/mocks of external dependencies for testing. | |
| type environment struct { | |
| reportRepo *git.Repository | |
| reportFS fs.FS | |
| pxc *proxy.Client | |
| pkc *pkgsite.Client | |
| wfs wfs | |
| ic issueClient | |
| gc ghsaClient | |
| moduleMap map[string]int | |
| } | |
| func defaultEnv() environment { | |
| return environment{} | |
| } | |
| func (e *environment) ReportRepo(ctx context.Context) (*git.Repository, error) { | |
| if v := e.reportRepo; v != nil { | |
| return v, nil | |
| } | |
| return gitrepo.Open(ctx, *reportRepo) | |
| } | |
| func (e *environment) ReportFS() fs.FS { | |
| if v := e.reportFS; v != nil { | |
| return v | |
| } | |
| return os.DirFS(*reportRepo) | |
| } | |
| func (e *environment) ProxyClient() *proxy.Client { | |
| if v := e.pxc; v != nil { | |
| return v | |
| } | |
| return proxy.NewDefaultClient() | |
| } | |
| func (e *environment) PkgsiteClient() *pkgsite.Client { | |
| if v := e.pkc; v != nil { | |
| return v | |
| } | |
| return pkgsite.Default() | |
| } | |
| func (e *environment) WFS() wfs { | |
| if v := e.wfs; v != nil { | |
| return v | |
| } | |
| return defaultWFS{} | |
| } | |
| func (e *environment) IssueClient(ctx context.Context) (issueClient, error) { | |
| if e.ic != nil { | |
| return e.ic, nil | |
| } | |
| if *githubToken == "" { | |
| return nil, fmt.Errorf("githubToken must be provided") | |
| } | |
| owner, repoName, err := gitrepo.ParseGitHubRepo(*issueRepo) | |
| if err != nil { | |
| return nil, err | |
| } | |
| return issues.NewClient(ctx, &issues.Config{Owner: owner, Repo: repoName, Token: *githubToken}) | |
| } | |
| func (e *environment) GHSAClient(ctx context.Context) (ghsaClient, error) { | |
| if v := e.gc; v != nil { | |
| return v, nil | |
| } | |
| if *githubToken == "" { | |
| return nil, fmt.Errorf("githubToken must be provided") | |
| } | |
| return ghsa.NewClient(ctx, *githubToken), nil | |
| } | |
| func (e *environment) ModuleMap() (map[string]int, error) { | |
| if v := e.moduleMap; v != nil { | |
| return v, nil | |
| } | |
| return priority.LoadModuleMap() | |
| } |