mirror of
https://github.com/anchore/syft.git
synced 2025-11-17 16:33:21 +01:00
3030 license declared spdx correction (#3461)
* feat: update hasExtractedLicense field to include license-ref candidates --------- Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
This commit is contained in:
parent
8aef0c908a
commit
e7b65c2c58
@ -5,6 +5,7 @@ import (
|
|||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"fmt"
|
"fmt"
|
||||||
"path"
|
"path"
|
||||||
|
"regexp"
|
||||||
"slices"
|
"slices"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
@ -713,8 +714,8 @@ func toFileTypes(metadata *file.Metadata) (ty []string) {
|
|||||||
return ty
|
return ty
|
||||||
}
|
}
|
||||||
|
|
||||||
// other licenses are for licenses from the pkg.Package that do not have an SPDXExpression
|
// other licenses are for licenses from the pkg.Package that do not have a valid SPDX Expression
|
||||||
// field. The spdxexpression field is only filled given a validated Value field.
|
// OR are an expression that is a single `License-Ref-*`
|
||||||
func toOtherLicenses(catalog *pkg.Collection) []*spdx.OtherLicense {
|
func toOtherLicenses(catalog *pkg.Collection) []*spdx.OtherLicense {
|
||||||
licenses := map[string]helpers.SPDXLicense{}
|
licenses := map[string]helpers.SPDXLicense{}
|
||||||
|
|
||||||
@ -724,11 +725,17 @@ func toOtherLicenses(catalog *pkg.Collection) []*spdx.OtherLicense {
|
|||||||
if l.Value != "" {
|
if l.Value != "" {
|
||||||
licenses[l.ID] = l
|
licenses[l.ID] = l
|
||||||
}
|
}
|
||||||
|
if l.ID != "" && isLicenseRef(l.ID) {
|
||||||
|
licenses[l.ID] = l
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for _, l := range concludedLicenses {
|
for _, l := range concludedLicenses {
|
||||||
if l.Value != "" {
|
if l.Value != "" {
|
||||||
licenses[l.ID] = l
|
licenses[l.ID] = l
|
||||||
}
|
}
|
||||||
|
if l.ID != "" && isLicenseRef(l.ID) {
|
||||||
|
licenses[l.ID] = l
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -742,14 +749,27 @@ func toOtherLicenses(catalog *pkg.Collection) []*spdx.OtherLicense {
|
|||||||
slices.Sort(ids)
|
slices.Sort(ids)
|
||||||
for _, id := range ids {
|
for _, id := range ids {
|
||||||
license := licenses[id]
|
license := licenses[id]
|
||||||
|
value := license.Value
|
||||||
|
// handle cases where LicenseRef needs to be included in hasExtractedLicensingInfos
|
||||||
|
if license.Value == "" {
|
||||||
|
value, _ = strings.CutPrefix(license.ID, "LicenseRef-")
|
||||||
|
}
|
||||||
result = append(result, &spdx.OtherLicense{
|
result = append(result, &spdx.OtherLicense{
|
||||||
LicenseIdentifier: license.ID,
|
LicenseIdentifier: license.ID,
|
||||||
ExtractedText: license.Value,
|
ExtractedText: value,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var licenseRefRegEx = regexp.MustCompile(`^LicenseRef-[A-Za-z0-9_-]+$`)
|
||||||
|
|
||||||
|
// isSingularLicenseRef checks if the string is a singular LicenseRef-* identifier
|
||||||
|
func isLicenseRef(s string) bool {
|
||||||
|
// Match the input string against the regex
|
||||||
|
return licenseRefRegEx.MatchString(s)
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: handle SPDX excludes file case
|
// TODO: handle SPDX excludes file case
|
||||||
// f file is an "excludes" file, skip it /* exclude SPDX analysis file(s) */
|
// f file is an "excludes" file, skip it /* exclude SPDX analysis file(s) */
|
||||||
// see: https://spdx.github.io/spdx-spec/v2.3/package-information/#79-package-verification-code-field
|
// see: https://spdx.github.io/spdx-spec/v2.3/package-information/#79-package-verification-code-field
|
||||||
|
|||||||
@ -753,6 +753,29 @@ func Test_OtherLicenses(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "LicenseRef as a valid spdx expression",
|
||||||
|
pkg: pkg.Package{
|
||||||
|
Licenses: pkg.NewLicenseSet(
|
||||||
|
pkg.NewLicense("LicenseRef-Fedora-Public-Domain"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
expected: []*spdx.OtherLicense{
|
||||||
|
{
|
||||||
|
LicenseIdentifier: "LicenseRef-Fedora-Public-Domain",
|
||||||
|
ExtractedText: "Fedora-Public-Domain",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LicenseRef as a valid spdx expression does not otherize compound spdx expressions",
|
||||||
|
pkg: pkg.Package{
|
||||||
|
Licenses: pkg.NewLicenseSet(
|
||||||
|
pkg.NewLicense("(MIT AND LicenseRef-Fedora-Public-Domain)"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
expected: nil,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user