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:
Christopher Angelo Phillips 2024-11-19 10:00:59 -05:00 committed by GitHub
parent 8aef0c908a
commit e7b65c2c58
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 46 additions and 3 deletions

View File

@ -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

View File

@ -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 {