xref: /aosp_15_r20/external/spdx-tools/rdfloader/parser2v3/license_utils.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Li
3*ba677afaSXin Lipackage parser2v3
4*ba677afaSXin Li
5*ba677afaSXin Liimport (
6*ba677afaSXin Li	"fmt"
7*ba677afaSXin Li	"strings"
8*ba677afaSXin Li
9*ba677afaSXin Li	gordfParser "github.com/spdx/gordf/rdfloader/parser"
10*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/common"
11*ba677afaSXin Li)
12*ba677afaSXin Li
13*ba677afaSXin Li/* util methods for licenses and checksums below:*/
14*ba677afaSXin Li
15*ba677afaSXin Li// Given the license URI, returns the name of the license defined
16*ba677afaSXin Li// in the last part of the uri.
17*ba677afaSXin Li// This function is susceptible to false-positives.
18*ba677afaSXin Lifunc getLicenseStringFromURI(uri string) string {
19*ba677afaSXin Li	licenseEnd := strings.TrimSpace(getLastPartOfURI(uri))
20*ba677afaSXin Li	lower := strings.ToLower(licenseEnd)
21*ba677afaSXin Li	if lower == "none" || lower == "noassertion" {
22*ba677afaSXin Li		return strings.ToUpper(licenseEnd)
23*ba677afaSXin Li	}
24*ba677afaSXin Li	return licenseEnd
25*ba677afaSXin Li}
26*ba677afaSXin Li
27*ba677afaSXin Li// returns the checksum algorithm and it's value
28*ba677afaSXin Li// In the newer versions, these two strings will be bound to a single checksum struct
29*ba677afaSXin Li// whose pointer will be returned.
30*ba677afaSXin Lifunc (parser *rdfParser2_3) getChecksumFromNode(checksumNode *gordfParser.Node) (algorithm common.ChecksumAlgorithm, value string, err error) {
31*ba677afaSXin Li	var checksumValue, checksumAlgorithm string
32*ba677afaSXin Li	for _, checksumTriple := range parser.nodeToTriples(checksumNode) {
33*ba677afaSXin Li		switch checksumTriple.Predicate.ID {
34*ba677afaSXin Li		case RDF_TYPE:
35*ba677afaSXin Li			continue
36*ba677afaSXin Li		case SPDX_CHECKSUM_VALUE:
37*ba677afaSXin Li			// cardinality: exactly 1
38*ba677afaSXin Li			checksumValue = strings.TrimSpace(checksumTriple.Object.ID)
39*ba677afaSXin Li		case SPDX_ALGORITHM:
40*ba677afaSXin Li			// cardinality: exactly 1
41*ba677afaSXin Li			checksumAlgorithm, err = getAlgorithmFromURI(checksumTriple.Object.ID)
42*ba677afaSXin Li			if err != nil {
43*ba677afaSXin Li				return
44*ba677afaSXin Li			}
45*ba677afaSXin Li		default:
46*ba677afaSXin Li			err = fmt.Errorf("unknown predicate '%s' while parsing checksum node", checksumTriple.Predicate.ID)
47*ba677afaSXin Li			return
48*ba677afaSXin Li		}
49*ba677afaSXin Li	}
50*ba677afaSXin Li	return common.ChecksumAlgorithm(checksumAlgorithm), checksumValue, nil
51*ba677afaSXin Li}
52*ba677afaSXin Li
53*ba677afaSXin Lifunc getAlgorithmFromURI(algorithmURI string) (checksumAlgorithm string, err error) {
54*ba677afaSXin Li	fragment := getLastPartOfURI(algorithmURI)
55*ba677afaSXin Li	if !strings.HasPrefix(fragment, "checksumAlgorithm_") {
56*ba677afaSXin Li		return "", fmt.Errorf("checksum algorithm uri must begin with checksumAlgorithm_. found %s", fragment)
57*ba677afaSXin Li	}
58*ba677afaSXin Li	algorithm := strings.TrimPrefix(fragment, "checksumAlgorithm_")
59*ba677afaSXin Li	algorithm = strings.ToLower(strings.TrimSpace(algorithm))
60*ba677afaSXin Li	switch algorithm {
61*ba677afaSXin Li	case "md2", "md4", "md5", "md6":
62*ba677afaSXin Li		checksumAlgorithm = strings.ToUpper(algorithm)
63*ba677afaSXin Li	case "sha1", "sha224", "sha256", "sha384", "sha512":
64*ba677afaSXin Li		checksumAlgorithm = strings.ToUpper(algorithm)
65*ba677afaSXin Li	default:
66*ba677afaSXin Li		return "", fmt.Errorf("unknown checksum algorithm %s", algorithm)
67*ba677afaSXin Li	}
68*ba677afaSXin Li	return
69*ba677afaSXin Li}
70*ba677afaSXin Li
71*ba677afaSXin Li// from a list of licenses, it returns a
72*ba677afaSXin Li// list of string representation of those licenses.
73*ba677afaSXin Lifunc mapLicensesToStrings(licences []AnyLicenseInfo) []string {
74*ba677afaSXin Li	res := make([]string, len(licences), len(licences))
75*ba677afaSXin Li	for i, lic := range licences {
76*ba677afaSXin Li		res[i] = lic.ToLicenseString()
77*ba677afaSXin Li	}
78*ba677afaSXin Li	return res
79*ba677afaSXin Li}
80*ba677afaSXin Li
81*ba677afaSXin Li/****** Type Functions ******/
82*ba677afaSXin Li
83*ba677afaSXin Li// TODO: should probably add brackets while linearizing a nested license.
84*ba677afaSXin Lifunc (lic ConjunctiveLicenseSet) ToLicenseString() string {
85*ba677afaSXin Li	return strings.Join(mapLicensesToStrings(lic.members), " AND ")
86*ba677afaSXin Li}
87*ba677afaSXin Li
88*ba677afaSXin Li// TODO: should probably add brackets while linearizing a nested license.
89*ba677afaSXin Lifunc (lic DisjunctiveLicenseSet) ToLicenseString() string {
90*ba677afaSXin Li	return strings.Join(mapLicensesToStrings(lic.members), " OR ")
91*ba677afaSXin Li}
92*ba677afaSXin Li
93*ba677afaSXin Lifunc (lic ExtractedLicensingInfo) ToLicenseString() string {
94*ba677afaSXin Li	return lic.licenseID
95*ba677afaSXin Li}
96*ba677afaSXin Li
97*ba677afaSXin Lifunc (operator OrLaterOperator) ToLicenseString() string {
98*ba677afaSXin Li	return operator.member.ToLicenseString()
99*ba677afaSXin Li}
100*ba677afaSXin Li
101*ba677afaSXin Lifunc (lic License) ToLicenseString() string {
102*ba677afaSXin Li	return lic.licenseID
103*ba677afaSXin Li}
104*ba677afaSXin Li
105*ba677afaSXin Lifunc (lic ListedLicense) ToLicenseString() string {
106*ba677afaSXin Li	return lic.licenseID
107*ba677afaSXin Li}
108*ba677afaSXin Li
109*ba677afaSXin Lifunc (lic WithExceptionOperator) ToLicenseString() string {
110*ba677afaSXin Li	return lic.member.ToLicenseString()
111*ba677afaSXin Li}
112*ba677afaSXin Li
113*ba677afaSXin Lifunc (lic SpecialLicense) ToLicenseString() string {
114*ba677afaSXin Li	return string(lic.value)
115*ba677afaSXin Li}
116*ba677afaSXin Li
117*ba677afaSXin Lifunc (lic SimpleLicensingInfo) ToLicenseString() string {
118*ba677afaSXin Li	return lic.licenseID
119*ba677afaSXin Li}
120