diff --git a/cmd/state/internal/cmdtree/cmdtree.go b/cmd/state/internal/cmdtree/cmdtree.go index a1d0914f44..d3b4a6d266 100644 --- a/cmd/state/internal/cmdtree/cmdtree.go +++ b/cmd/state/internal/cmdtree/cmdtree.go @@ -32,6 +32,7 @@ func New(prime *primer.Values, args ...string) *CmdTree { cveCmd := newCveCommand(prime) cveCmd.AddChildren( newReportCommand(prime), + newOpenCommand(prime), ) exportCmd := newExportCommand(prime) diff --git a/cmd/state/internal/cmdtree/cve.go b/cmd/state/internal/cmdtree/cve.go index 896f7f3c8a..ea4d37cd61 100644 --- a/cmd/state/internal/cmdtree/cve.go +++ b/cmd/state/internal/cmdtree/cve.go @@ -52,3 +52,27 @@ func newReportCommand(prime *primer.Values) *captain.Command { }, ) } + +func newOpenCommand(prime *primer.Values) *captain.Command { + open := cve.NewOpen(prime) + params := cve.OpenParams{} + + return captain.NewCommand( + "open", + locale.Tl("cve_open_title", "Opening Vulnerability Details Page"), + locale.Tl("cve_open_cmd_description", "Open the given vulnerability details in your browser"), + prime.Output(), + prime.Config(), + []*captain.Flag{}, + []*captain.Argument{ + { + Name: locale.Tl("cve_open_id_arg", "ID"), + Description: locale.Tl("cve_open_id_arg_description", "The vulnerablility to open in your browser"), + Value: ¶ms.ID, + }, + }, + func(_ *captain.Command, _ []string) error { + return open.Run(params) + }, + ) +} diff --git a/internal/runners/cve/open.go b/internal/runners/cve/open.go new file mode 100644 index 0000000000..d6c4902fc8 --- /dev/null +++ b/internal/runners/cve/open.go @@ -0,0 +1,40 @@ +package cve + +import ( + "fmt" + + "github.com/ActiveState/cli/internal/errs" + "github.com/ActiveState/cli/internal/locale" + "github.com/ActiveState/cli/internal/output" + "github.com/skratchdot/open-golang/open" +) + +const cveURLPrefix = "https://nvd.nist.gov/vuln/detail/" + +type Open struct { + out output.Outputer +} + +type OpenParams struct { + ID string +} + +func NewOpen(prime primeable) *Open { + return &Open{ + out: prime.Output(), + } +} + +func (o *Open) Run(params OpenParams) error { + cveURL := fmt.Sprintf("%s%s", cveURLPrefix, params.ID) + err := open.Run(cveURL) + if err != nil { + return errs.AddTips( + locale.WrapError(err, "cve_open_url_err", "Could not open CVE detail URL: {{.V0}}", cveURL), + locale.Tr("browser_fallback", "vulnerability details", cveURL), + ) + } + o.out.Print(locale.Tl("cve_open_url", "Vulnerability detail URL: [ACTIONABLE]{{.V0}}[/RESET]", cveURL)) + + return nil +} diff --git a/internal/runners/ppm/convert.go b/internal/runners/ppm/convert.go index 645ede2d62..14ccc34c45 100644 --- a/internal/runners/ppm/convert.go +++ b/internal/runners/ppm/convert.go @@ -153,11 +153,7 @@ func (cf *ConversionFlow) openInBrowser(what, url string) { err := open.Run(url) if err != nil { logging.Error("Could not open %s in browser: %v", url, err) - cf.out.Error(locale.Tl( - "ppm_convert_open_browser_fallback", - "Could not open {{.V0}} in your browser.\nYou can copy and paste the following URL manually in the address line of your browser:\n{{.V1}}", - what, url, - )) + cf.out.Error(locale.Tr("browser_fallback", what, url)) } } diff --git a/locale/en-us.yaml b/locale/en-us.yaml index 96eb489216..feef73c059 100644 --- a/locale/en-us.yaml +++ b/locale/en-us.yaml @@ -1661,3 +1661,5 @@ headless_notify: Any changes you make are local only and will not be saved the platform. Visit: [ACTIONABLE]{{.V0}}[/RESET] to create a platform project from this commit. For more information, including how to merge these changes into an existing project, visit: [ACTIONABLE]{{.V1}}[/RESET]. +browser_fallback: + other: "Could not open {{.V0}} in your browser.\nYou can copy and paste the following URL manually in the address line of your browser:\n[NOTICE]{{.V1}}[/RESET]" \ No newline at end of file