| // 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 openvex |
| |
| import ( |
| "net/url" |
| "strings" |
| |
| "golang.org/x/vuln/internal/govulncheck" |
| ) |
| |
| // The PURL is printed as: pkg:golang/MODULE_PATH@VERSION |
| // Conceptually there is no namespace and the name is entirely defined by |
| // the module path. See https://github.com/package-url/purl-spec/issues/63 |
| // for further disucssion. |
| |
| const suffix = "pkg:golang/" |
| |
| type purl struct { |
| name string |
| version string |
| } |
| |
| func (p *purl) String() string { |
| var b strings.Builder |
| b.WriteString(suffix) |
| b.WriteString(url.PathEscape(p.name)) |
| if p.version != "" { |
| b.WriteString("@") |
| b.WriteString(p.version) |
| } |
| return b.String() |
| } |
| |
| // purlFromFinding takes a govulncheck finding and generates a purl to the |
| // vulnerable dependency. |
| func purlFromFinding(f *govulncheck.Finding) string { |
| purl := purl{ |
| name: f.Trace[0].Module, |
| version: f.Trace[0].Version, |
| } |
| |
| return purl.String() |
| } |