1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2*ba677afaSXin Li 3*ba677afaSXin Lipackage parser2v2 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_2) 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