mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-12 15:50:15 -08:00
fix(license): stop spliting a long license text (#7336)
Signed-off-by: knqyf263 <knqyf263@gmail.com> Co-authored-by: knqyf263 <knqyf263@gmail.com>
This commit is contained in:
@@ -80,7 +80,7 @@ func (p *Parser) Parse(r xio.ReadSeekerAt) ([]ftypes.Package, []ftypes.Dependenc
|
||||
}
|
||||
|
||||
if license == "" && h.Get("License-File") != "" {
|
||||
license = "file://" + h.Get("License-File")
|
||||
license = licensing.LicenseFilePrefix + h.Get("License-File")
|
||||
}
|
||||
|
||||
return []ftypes.Package{
|
||||
|
||||
@@ -122,11 +122,11 @@ func (a packagingAnalyzer) fillAdditionalData(fsys fs.FS, app *types.Application
|
||||
// Parser adds `file://` prefix to filepath from `License-File` field
|
||||
// We need to read this file to find licenses
|
||||
// Otherwise, this is the name of the license
|
||||
if !strings.HasPrefix(lic, "file://") {
|
||||
if !strings.HasPrefix(lic, licensing.LicenseFilePrefix) {
|
||||
licenses = append(licenses, lic)
|
||||
continue
|
||||
}
|
||||
licenseFilePath := path.Base(strings.TrimPrefix(lic, "file://"))
|
||||
licenseFilePath := path.Base(strings.TrimPrefix(lic, licensing.LicenseFilePrefix))
|
||||
|
||||
findings, err := classifyLicense(app.FilePath, licenseFilePath, a.licenseClassifierConfidenceLevel, fsys)
|
||||
if err != nil {
|
||||
|
||||
@@ -159,6 +159,12 @@ var mapping = map[string]string{
|
||||
"PUBLIC DOMAIN": Unlicense,
|
||||
}
|
||||
|
||||
const (
|
||||
LicenseTextPrefix = "text://"
|
||||
LicenseFilePrefix = "file://"
|
||||
CustomLicensePrefix = "CUSTOM License"
|
||||
)
|
||||
|
||||
// pythonLicenseExceptions contains licenses that we cannot separate correctly using our logic.
|
||||
// first word after separator (or/and) => license name
|
||||
var pythonLicenseExceptions = map[string]string{
|
||||
@@ -179,6 +185,39 @@ var pythonLicenseExceptions = map[string]string{
|
||||
|
||||
var licenseSplitRegexp = regexp.MustCompile("(,?[_ ]+(?:or|and)[_ ]+)|(,[ ]*)")
|
||||
|
||||
// Typical keywords for license texts
|
||||
var licenseTextKeywords = []string{
|
||||
"http://",
|
||||
"https://",
|
||||
"(c)",
|
||||
"as-is",
|
||||
";",
|
||||
"hereby",
|
||||
"permission to use",
|
||||
"permission is",
|
||||
"use in source",
|
||||
"use, copy, modify",
|
||||
"using",
|
||||
}
|
||||
|
||||
func isLicenseText(str string) bool {
|
||||
for _, keyword := range licenseTextKeywords {
|
||||
if strings.Contains(str, keyword) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func TrimLicenseText(text string) string {
|
||||
s := strings.Split(text, " ")
|
||||
n := len(s)
|
||||
if n > 3 {
|
||||
n = 3
|
||||
}
|
||||
return strings.Join(s[:n], " ") + "..."
|
||||
}
|
||||
|
||||
func Normalize(name string) string {
|
||||
name = strings.TrimSpace(name)
|
||||
if l, ok := mapping[strings.ToUpper(name)]; ok {
|
||||
@@ -191,6 +230,12 @@ func SplitLicenses(str string) []string {
|
||||
if str == "" {
|
||||
return nil
|
||||
}
|
||||
if isLicenseText(strings.ToLower(str)) {
|
||||
return []string{
|
||||
LicenseTextPrefix + str,
|
||||
}
|
||||
}
|
||||
|
||||
var licenses []string
|
||||
for _, maybeLic := range licenseSplitRegexp.Split(str, -1) {
|
||||
lower := strings.ToLower(maybeLic)
|
||||
|
||||
@@ -97,6 +97,13 @@ func TestSplitLicenses(t *testing.T) {
|
||||
"Historical Permission Notice and Disclaimer (HPND)",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "License text",
|
||||
license: "* Permission to use this software in any way is granted without",
|
||||
licenses: []string{
|
||||
"text://* Permission to use this software in any way is granted without",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
|
||||
@@ -436,6 +436,7 @@ func ConvertFromRPCDetectedLicenses(rpcLicenses []*common.DetectedLicense) []typ
|
||||
PkgName: l.PkgName,
|
||||
FilePath: l.FilePath,
|
||||
Name: l.Name,
|
||||
Text: l.Text,
|
||||
Confidence: float64(l.Confidence),
|
||||
Link: l.Link,
|
||||
})
|
||||
@@ -983,6 +984,7 @@ func ConvertToRPCLicenses(licenses []types.DetectedLicense) []*common.DetectedLi
|
||||
PkgName: l.PkgName,
|
||||
FilePath: l.FilePath,
|
||||
Name: l.Name,
|
||||
Text: l.Text,
|
||||
Confidence: float32(l.Confidence),
|
||||
Link: l.Link,
|
||||
})
|
||||
|
||||
@@ -760,6 +760,7 @@ func TestConvertFromRPCLicenses(t *testing.T) {
|
||||
PkgName: "alpine-baselayout",
|
||||
FilePath: "some-path",
|
||||
Name: "GPL-2.0",
|
||||
Text: "text://* Permission to use this software in any way is granted without",
|
||||
Confidence: 1,
|
||||
Link: "https://some-link",
|
||||
},
|
||||
@@ -771,6 +772,7 @@ func TestConvertFromRPCLicenses(t *testing.T) {
|
||||
PkgName: "alpine-baselayout",
|
||||
FilePath: "some-path",
|
||||
Name: "GPL-2.0",
|
||||
Text: "text://* Permission to use this software in any way is granted without",
|
||||
Confidence: 1,
|
||||
Link: "https://some-link",
|
||||
},
|
||||
@@ -806,6 +808,7 @@ func TestConvertToRPCLicenses(t *testing.T) {
|
||||
PkgName: "alpine-baselayout",
|
||||
FilePath: "some-path",
|
||||
Name: "GPL-2.0",
|
||||
Text: "text://* Permission to use this software in any way is granted without",
|
||||
Confidence: 1,
|
||||
Link: "https://some-link",
|
||||
},
|
||||
@@ -817,6 +820,7 @@ func TestConvertToRPCLicenses(t *testing.T) {
|
||||
PkgName: "alpine-baselayout",
|
||||
FilePath: "some-path",
|
||||
Name: "GPL-2.0",
|
||||
Text: "text://* Permission to use this software in any way is granted without",
|
||||
Confidence: 1,
|
||||
Link: "https://some-link",
|
||||
},
|
||||
|
||||
@@ -261,14 +261,7 @@ func (s Scanner) scanLicenses(target types.ScanTarget, options types.ScanOptions
|
||||
var osPkgLicenses []types.DetectedLicense
|
||||
for _, pkg := range target.Packages {
|
||||
for _, license := range pkg.Licenses {
|
||||
category, severity := scanner.Scan(license)
|
||||
osPkgLicenses = append(osPkgLicenses, types.DetectedLicense{
|
||||
Severity: severity,
|
||||
Category: category,
|
||||
PkgName: pkg.Name,
|
||||
Name: license,
|
||||
Confidence: 1.0,
|
||||
})
|
||||
osPkgLicenses = append(osPkgLicenses, toDetectedLicense(scanner, license, pkg.Name, ""))
|
||||
}
|
||||
}
|
||||
results = append(results, types.Result{
|
||||
@@ -282,17 +275,11 @@ func (s Scanner) scanLicenses(target types.ScanTarget, options types.ScanOptions
|
||||
var langLicenses []types.DetectedLicense
|
||||
for _, lib := range app.Packages {
|
||||
for _, license := range lib.Licenses {
|
||||
category, severity := scanner.Scan(license)
|
||||
langLicenses = append(langLicenses, types.DetectedLicense{
|
||||
Severity: severity,
|
||||
Category: category,
|
||||
PkgName: lib.Name,
|
||||
Name: license,
|
||||
// Lock files use app.FilePath - https://github.com/aquasecurity/trivy/blob/6ccc0a554b07b05fd049f882a1825a0e1e0aabe1/pkg/fanal/types/artifact.go#L245-L246
|
||||
// Applications use lib.FilePath - https://github.com/aquasecurity/trivy/blob/6ccc0a554b07b05fd049f882a1825a0e1e0aabe1/pkg/fanal/types/artifact.go#L93-L94
|
||||
FilePath: lo.Ternary(lib.FilePath != "", lib.FilePath, app.FilePath),
|
||||
Confidence: 1.0,
|
||||
})
|
||||
// Lock files use app.FilePath - https://github.com/aquasecurity/trivy/blob/6ccc0a554b07b05fd049f882a1825a0e1e0aabe1/pkg/fanal/types/artifact.go#L245-L246
|
||||
// Applications use lib.FilePath - https://github.com/aquasecurity/trivy/blob/6ccc0a554b07b05fd049f882a1825a0e1e0aabe1/pkg/fanal/types/artifact.go#L93-L94
|
||||
filePath := lo.Ternary(lib.FilePath != "", lib.FilePath, app.FilePath)
|
||||
|
||||
langLicenses = append(langLicenses, toDetectedLicense(scanner, license, lib.Name, filePath))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -390,6 +377,29 @@ func toDetectedMisconfiguration(res ftypes.MisconfResult, defaultSeverity dbType
|
||||
}
|
||||
}
|
||||
|
||||
func toDetectedLicense(scanner licensing.Scanner, license, pkgName, filePath string) types.DetectedLicense {
|
||||
var category ftypes.LicenseCategory
|
||||
var severity, licenseText string
|
||||
if strings.HasPrefix(license, licensing.LicenseTextPrefix) { // License text
|
||||
licenseText = strings.TrimPrefix(license, licensing.LicenseTextPrefix)
|
||||
category = ftypes.CategoryUnknown
|
||||
severity = dbTypes.SeverityUnknown.String()
|
||||
license = licensing.CustomLicensePrefix + ": " + licensing.TrimLicenseText(licenseText)
|
||||
} else { // License name
|
||||
category, severity = scanner.Scan(license)
|
||||
}
|
||||
|
||||
return types.DetectedLicense{
|
||||
Severity: severity,
|
||||
Category: category,
|
||||
PkgName: pkgName,
|
||||
FilePath: filePath,
|
||||
Name: license,
|
||||
Text: licenseText,
|
||||
Confidence: 1.0,
|
||||
}
|
||||
}
|
||||
|
||||
func ShouldScanMisconfigOrRbac(scanners types.Scanners) bool {
|
||||
return scanners.AnyEnabled(types.MisconfigScanner, types.RBACScanner)
|
||||
}
|
||||
|
||||
@@ -64,6 +64,25 @@ var (
|
||||
},
|
||||
Licenses: []string{"MIT"},
|
||||
}
|
||||
python39min = ftypes.Package{
|
||||
Name: "python3.9-minimal",
|
||||
Version: "3.9.1",
|
||||
FilePath: "/usr/lib/python/site-packages/python3.9-minimal/METADATA",
|
||||
Layer: ftypes.Layer{
|
||||
DiffID: "sha256:0ea33a93585cf1917ba522b2304634c3073654062d5282c1346322967790ef33",
|
||||
},
|
||||
Licenses: []string{"text://Redistribution and use in source and binary forms, with or without"},
|
||||
}
|
||||
menuinstPkg = ftypes.Package{
|
||||
Name: "menuinst",
|
||||
Version: "2.0.2",
|
||||
FilePath: "opt/conda/lib/python3.11/site-packages/menuinst-2.0.2.dist-info/METADATA",
|
||||
Layer: ftypes.Layer{
|
||||
DiffID: "sha256:0ea33a93585cf1917ba522b2304634c3073654062d5282c1346322967790ef33",
|
||||
},
|
||||
Licenses: []string{"text://(c) 2016 Continuum Analytics, Inc. / http://continuum.io All Rights Reserved"},
|
||||
}
|
||||
|
||||
laravelPkg = ftypes.Package{
|
||||
Name: "laravel/framework",
|
||||
Version: "6.0.0",
|
||||
@@ -225,6 +244,7 @@ func TestScanner_Scan(t *testing.T) {
|
||||
},
|
||||
Packages: []ftypes.Package{
|
||||
muslPkg,
|
||||
python39min,
|
||||
},
|
||||
Applications: []ftypes.Application{
|
||||
{
|
||||
@@ -239,6 +259,7 @@ func TestScanner_Scan(t *testing.T) {
|
||||
FilePath: "",
|
||||
Packages: []ftypes.Package{
|
||||
urllib3Pkg,
|
||||
menuinstPkg,
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -257,6 +278,14 @@ func TestScanner_Scan(t *testing.T) {
|
||||
Name: "MIT",
|
||||
Confidence: 1,
|
||||
},
|
||||
{
|
||||
Severity: "UNKNOWN",
|
||||
Category: "unknown",
|
||||
PkgName: python39min.Name,
|
||||
Name: "CUSTOM License: Redistribution and use...",
|
||||
Text: "Redistribution and use in source and binary forms, with or without",
|
||||
Confidence: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -286,6 +315,15 @@ func TestScanner_Scan(t *testing.T) {
|
||||
Name: "MIT",
|
||||
Confidence: 1,
|
||||
},
|
||||
{
|
||||
Severity: "UNKNOWN",
|
||||
Category: "unknown",
|
||||
PkgName: menuinstPkg.Name,
|
||||
FilePath: "opt/conda/lib/python3.11/site-packages/menuinst-2.0.2.dist-info/METADATA",
|
||||
Name: "CUSTOM License: (c) 2016 Continuum...",
|
||||
Text: "(c) 2016 Continuum Analytics, Inc. / http://continuum.io All Rights Reserved",
|
||||
Confidence: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
@@ -22,6 +22,9 @@ type DetectedLicense struct {
|
||||
// Name holds a detected license name
|
||||
Name string
|
||||
|
||||
// Text holds a long license text if Trivy detects a license name as a license text
|
||||
Text string
|
||||
|
||||
// Confidence is level of the match. The confidence level is between 0.0 and 1.0, with 1.0 indicating an
|
||||
// exact match and 0.0 indicating a complete mismatch
|
||||
Confidence float64
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.34.0
|
||||
// protoc v5.26.1
|
||||
// protoc v3.19.4
|
||||
// source: rpc/common/service.proto
|
||||
|
||||
package common
|
||||
@@ -2084,6 +2084,7 @@ type DetectedLicense struct {
|
||||
Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"`
|
||||
Confidence float32 `protobuf:"fixed32,6,opt,name=confidence,proto3" json:"confidence,omitempty"`
|
||||
Link string `protobuf:"bytes,7,opt,name=link,proto3" json:"link,omitempty"`
|
||||
Text string `protobuf:"bytes,8,opt,name=text,proto3" json:"text,omitempty"`
|
||||
}
|
||||
|
||||
func (x *DetectedLicense) Reset() {
|
||||
@@ -2167,6 +2168,13 @@ func (x *DetectedLicense) GetLink() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *DetectedLicense) GetText() string {
|
||||
if x != nil {
|
||||
return x.Text
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type LicenseFile struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
@@ -2718,7 +2726,7 @@ var file_rpc_common_service_proto_rawDesc = []byte{
|
||||
0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72,
|
||||
0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65,
|
||||
0x74, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e,
|
||||
0x67, 0x73, 0x22, 0x85, 0x02, 0x0a, 0x0f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4c,
|
||||
0x67, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x0f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4c,
|
||||
0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69,
|
||||
0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79,
|
||||
0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79,
|
||||
@@ -2734,54 +2742,56 @@ var file_rpc_common_service_proto_rawDesc = []byte{
|
||||
0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64,
|
||||
0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66,
|
||||
0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x07,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0xed, 0x01, 0x0a, 0x0b, 0x4c,
|
||||
0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x6c, 0x69,
|
||||
0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
|
||||
0x32, 0x1e, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
|
||||
0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x45, 0x6e, 0x75, 0x6d,
|
||||
0x52, 0x0b, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a,
|
||||
0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6b,
|
||||
0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6b,
|
||||
0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67,
|
||||
0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e,
|
||||
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x46, 0x69,
|
||||
0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x73, 0x12,
|
||||
0x29, 0x0a, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
|
||||
0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x61,
|
||||
0x79, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x22, 0x98, 0x01, 0x0a, 0x0e, 0x4c,
|
||||
0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x3e, 0x0a,
|
||||
0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
|
||||
0x22, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c,
|
||||
0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x45,
|
||||
0x6e, 0x75, 0x6d, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a,
|
||||
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
|
||||
0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18,
|
||||
0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63,
|
||||
0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x95, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73,
|
||||
0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0x81, 0x01, 0x0a, 0x04, 0x45, 0x6e,
|
||||
0x75, 0x6d, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
|
||||
0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x4f, 0x52, 0x42, 0x49, 0x44, 0x44, 0x45, 0x4e,
|
||||
0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x53, 0x54, 0x52, 0x49, 0x43, 0x54, 0x45, 0x44,
|
||||
0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x43, 0x49, 0x50, 0x52, 0x4f, 0x43, 0x41, 0x4c,
|
||||
0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x54, 0x49, 0x43, 0x45, 0x10, 0x04, 0x12, 0x0e,
|
||||
0x0a, 0x0a, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x56, 0x45, 0x10, 0x05, 0x12, 0x10,
|
||||
0x0a, 0x0c, 0x55, 0x4e, 0x45, 0x4e, 0x43, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x45, 0x44, 0x10, 0x06,
|
||||
0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x07, 0x22, 0x4e, 0x0a,
|
||||
0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3f, 0x0a, 0x04,
|
||||
0x45, 0x6e, 0x75, 0x6d, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46,
|
||||
0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x50, 0x4b, 0x47, 0x10, 0x01, 0x12,
|
||||
0x0a, 0x0a, 0x06, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c,
|
||||
0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x44, 0x0a,
|
||||
0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b,
|
||||
0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12,
|
||||
0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48,
|
||||
0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41,
|
||||
0x4c, 0x10, 0x04, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
|
||||
0x6d, 0x2f, 0x61, 0x71, 0x75, 0x61, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2f, 0x74,
|
||||
0x72, 0x69, 0x76, 0x79, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3b,
|
||||
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65,
|
||||
0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0xed,
|
||||
0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x41,
|
||||
0x0a, 0x0c, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01,
|
||||
0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d,
|
||||
0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e,
|
||||
0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0b, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70,
|
||||
0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19,
|
||||
0x0a, 0x08, 0x70, 0x6b, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x07, 0x70, 0x6b, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x66, 0x69, 0x6e,
|
||||
0x67, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x72,
|
||||
0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e,
|
||||
0x73, 0x65, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x67, 0x69,
|
||||
0x6e, 0x67, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01,
|
||||
0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
|
||||
0x6e, 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x22, 0x98,
|
||||
0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e,
|
||||
0x67, 0x12, 0x3e, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20,
|
||||
0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
|
||||
0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,
|
||||
0x72, 0x79, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72,
|
||||
0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65,
|
||||
0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69,
|
||||
0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x04, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x95, 0x01, 0x0a, 0x0f, 0x4c, 0x69,
|
||||
0x63, 0x65, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0x81, 0x01,
|
||||
0x0a, 0x04, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
|
||||
0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x4f, 0x52, 0x42, 0x49,
|
||||
0x44, 0x44, 0x45, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x53, 0x54, 0x52, 0x49,
|
||||
0x43, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x43, 0x49, 0x50, 0x52,
|
||||
0x4f, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x54, 0x49, 0x43, 0x45,
|
||||
0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x56, 0x45,
|
||||
0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x4e, 0x45, 0x4e, 0x43, 0x55, 0x4d, 0x42, 0x45, 0x52,
|
||||
0x45, 0x44, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10,
|
||||
0x07, 0x22, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65,
|
||||
0x22, 0x3f, 0x0a, 0x04, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50,
|
||||
0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x50, 0x4b,
|
||||
0x47, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x02, 0x12,
|
||||
0x10, 0x0a, 0x0c, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10,
|
||||
0x03, 0x2a, 0x44, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0b, 0x0a,
|
||||
0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f,
|
||||
0x57, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, 0x02, 0x12,
|
||||
0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x49,
|
||||
0x54, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x04, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75,
|
||||
0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x71, 0x75, 0x61, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69,
|
||||
0x74, 0x79, 0x2f, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6f, 0x6d,
|
||||
0x6d, 0x6f, 0x6e, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
|
||||
0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
|
||||
@@ -226,6 +226,7 @@ message DetectedLicense {
|
||||
string name = 5;
|
||||
float confidence = 6;
|
||||
string link = 7;
|
||||
string text = 8;
|
||||
}
|
||||
|
||||
message LicenseFile {
|
||||
|
||||
Reference in New Issue
Block a user