120 lines
3.6 KiB
Go
120 lines
3.6 KiB
Go
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
|
|
package parser2v3
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
gordfParser "github.com/spdx/gordf/rdfloader/parser"
|
|
"github.com/spdx/tools-golang/spdx/common"
|
|
)
|
|
|
|
/* util methods for licenses and checksums below:*/
|
|
|
|
// Given the license URI, returns the name of the license defined
|
|
// in the last part of the uri.
|
|
// This function is susceptible to false-positives.
|
|
func getLicenseStringFromURI(uri string) string {
|
|
licenseEnd := strings.TrimSpace(getLastPartOfURI(uri))
|
|
lower := strings.ToLower(licenseEnd)
|
|
if lower == "none" || lower == "noassertion" {
|
|
return strings.ToUpper(licenseEnd)
|
|
}
|
|
return licenseEnd
|
|
}
|
|
|
|
// returns the checksum algorithm and it's value
|
|
// In the newer versions, these two strings will be bound to a single checksum struct
|
|
// whose pointer will be returned.
|
|
func (parser *rdfParser2_3) getChecksumFromNode(checksumNode *gordfParser.Node) (algorithm common.ChecksumAlgorithm, value string, err error) {
|
|
var checksumValue, checksumAlgorithm string
|
|
for _, checksumTriple := range parser.nodeToTriples(checksumNode) {
|
|
switch checksumTriple.Predicate.ID {
|
|
case RDF_TYPE:
|
|
continue
|
|
case SPDX_CHECKSUM_VALUE:
|
|
// cardinality: exactly 1
|
|
checksumValue = strings.TrimSpace(checksumTriple.Object.ID)
|
|
case SPDX_ALGORITHM:
|
|
// cardinality: exactly 1
|
|
checksumAlgorithm, err = getAlgorithmFromURI(checksumTriple.Object.ID)
|
|
if err != nil {
|
|
return
|
|
}
|
|
default:
|
|
err = fmt.Errorf("unknown predicate '%s' while parsing checksum node", checksumTriple.Predicate.ID)
|
|
return
|
|
}
|
|
}
|
|
return common.ChecksumAlgorithm(checksumAlgorithm), checksumValue, nil
|
|
}
|
|
|
|
func getAlgorithmFromURI(algorithmURI string) (checksumAlgorithm string, err error) {
|
|
fragment := getLastPartOfURI(algorithmURI)
|
|
if !strings.HasPrefix(fragment, "checksumAlgorithm_") {
|
|
return "", fmt.Errorf("checksum algorithm uri must begin with checksumAlgorithm_. found %s", fragment)
|
|
}
|
|
algorithm := strings.TrimPrefix(fragment, "checksumAlgorithm_")
|
|
algorithm = strings.ToLower(strings.TrimSpace(algorithm))
|
|
switch algorithm {
|
|
case "md2", "md4", "md5", "md6":
|
|
checksumAlgorithm = strings.ToUpper(algorithm)
|
|
case "sha1", "sha224", "sha256", "sha384", "sha512":
|
|
checksumAlgorithm = strings.ToUpper(algorithm)
|
|
default:
|
|
return "", fmt.Errorf("unknown checksum algorithm %s", algorithm)
|
|
}
|
|
return
|
|
}
|
|
|
|
// from a list of licenses, it returns a
|
|
// list of string representation of those licenses.
|
|
func mapLicensesToStrings(licences []AnyLicenseInfo) []string {
|
|
res := make([]string, len(licences), len(licences))
|
|
for i, lic := range licences {
|
|
res[i] = lic.ToLicenseString()
|
|
}
|
|
return res
|
|
}
|
|
|
|
/****** Type Functions ******/
|
|
|
|
// TODO: should probably add brackets while linearizing a nested license.
|
|
func (lic ConjunctiveLicenseSet) ToLicenseString() string {
|
|
return strings.Join(mapLicensesToStrings(lic.members), " AND ")
|
|
}
|
|
|
|
// TODO: should probably add brackets while linearizing a nested license.
|
|
func (lic DisjunctiveLicenseSet) ToLicenseString() string {
|
|
return strings.Join(mapLicensesToStrings(lic.members), " OR ")
|
|
}
|
|
|
|
func (lic ExtractedLicensingInfo) ToLicenseString() string {
|
|
return lic.licenseID
|
|
}
|
|
|
|
func (operator OrLaterOperator) ToLicenseString() string {
|
|
return operator.member.ToLicenseString()
|
|
}
|
|
|
|
func (lic License) ToLicenseString() string {
|
|
return lic.licenseID
|
|
}
|
|
|
|
func (lic ListedLicense) ToLicenseString() string {
|
|
return lic.licenseID
|
|
}
|
|
|
|
func (lic WithExceptionOperator) ToLicenseString() string {
|
|
return lic.member.ToLicenseString()
|
|
}
|
|
|
|
func (lic SpecialLicense) ToLicenseString() string {
|
|
return string(lic.value)
|
|
}
|
|
|
|
func (lic SimpleLicensingInfo) ToLicenseString() string {
|
|
return lic.licenseID
|
|
}
|