| // Copyright 2021 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 report |
| |
| import ( |
| "net/url" |
| "strings" |
| |
| "golang.org/x/vulndb/internal/osv" |
| ) |
| |
| func isFix(url string) bool { |
| return strings.Contains(url, "go-review.googlesource.com") || |
| strings.Contains(url, "/commit/") || strings.Contains(url, "/commits/") || |
| strings.Contains(url, "/pull/") || strings.Contains(url, "/cl/") |
| } |
| |
| func isIssue(url string) bool { |
| return strings.Contains(url, "/issue/") || strings.Contains(url, "/issues/") |
| } |
| |
| func isAdvisory(url string) bool { |
| return strings.Contains(url, "/advisories/") |
| } |
| |
| // referenceFromUrl creates a new Reference from a url |
| // with Type inferred from the contents of the url. |
| func referenceFromUrl(u string) *Reference { |
| unescaped, err := url.PathUnescape(u) |
| if err != nil { |
| // Ignore error and use original. |
| unescaped = u |
| } |
| typ := osv.ReferenceTypeWeb |
| switch { |
| case isFix(unescaped): |
| typ = osv.ReferenceTypeFix |
| case isIssue(unescaped): |
| typ = osv.ReferenceTypeReport |
| case isAdvisory(unescaped): |
| typ = osv.ReferenceTypeAdvisory |
| } |
| return &Reference{ |
| Type: typ, |
| URL: unescaped, |
| } |
| } |