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 8*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/common" 9*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/v2_3" 10*ba677afaSXin Li) 11*ba677afaSXin Li 12*ba677afaSXin Lifunc (parser *tvParser2_3) parsePairFromFile2_3(tag string, value string) error { 13*ba677afaSXin Li // expire fileAOP for anything other than an AOPHomePage or AOPURI 14*ba677afaSXin Li // (we'll actually handle the HomePage and URI further below) 15*ba677afaSXin Li if tag != "ArtifactOfProjectHomePage" && tag != "ArtifactOfProjectURI" { 16*ba677afaSXin Li parser.fileAOP = nil 17*ba677afaSXin Li } 18*ba677afaSXin Li 19*ba677afaSXin Li switch tag { 20*ba677afaSXin Li // tag for creating new file section 21*ba677afaSXin Li case "FileName": 22*ba677afaSXin Li // check if the previous file contained an spdx Id or not 23*ba677afaSXin Li if parser.file != nil && parser.file.FileSPDXIdentifier == nullSpdxElementId2_3 { 24*ba677afaSXin Li return fmt.Errorf("file with FileName %s does not have SPDX identifier", parser.file.FileName) 25*ba677afaSXin Li } 26*ba677afaSXin Li parser.file = &v2_3.File{} 27*ba677afaSXin Li parser.file.FileName = value 28*ba677afaSXin Li // tag for creating new package section and going back to parsing Package 29*ba677afaSXin Li case "PackageName": 30*ba677afaSXin Li parser.st = psPackage2_3 31*ba677afaSXin Li // check if the previous file contained an spdx Id or not 32*ba677afaSXin Li if parser.file != nil && parser.file.FileSPDXIdentifier == nullSpdxElementId2_3 { 33*ba677afaSXin Li return fmt.Errorf("file with FileName %s does not have SPDX identifier", parser.file.FileName) 34*ba677afaSXin Li } 35*ba677afaSXin Li parser.file = nil 36*ba677afaSXin Li return parser.parsePairFromPackage2_3(tag, value) 37*ba677afaSXin Li // tag for going on to snippet section 38*ba677afaSXin Li case "SnippetSPDXID": 39*ba677afaSXin Li parser.st = psSnippet2_3 40*ba677afaSXin Li return parser.parsePairFromSnippet2_3(tag, value) 41*ba677afaSXin Li // tag for going on to other license section 42*ba677afaSXin Li case "LicenseID": 43*ba677afaSXin Li parser.st = psOtherLicense2_3 44*ba677afaSXin Li return parser.parsePairFromOtherLicense2_3(tag, value) 45*ba677afaSXin Li // tags for file data 46*ba677afaSXin Li case "SPDXID": 47*ba677afaSXin Li eID, err := extractElementID(value) 48*ba677afaSXin Li if err != nil { 49*ba677afaSXin Li return err 50*ba677afaSXin Li } 51*ba677afaSXin Li parser.file.FileSPDXIdentifier = eID 52*ba677afaSXin Li if parser.pkg == nil { 53*ba677afaSXin Li if parser.doc.Files == nil { 54*ba677afaSXin Li parser.doc.Files = []*v2_3.File{} 55*ba677afaSXin Li } 56*ba677afaSXin Li parser.doc.Files = append(parser.doc.Files, parser.file) 57*ba677afaSXin Li } else { 58*ba677afaSXin Li if parser.pkg.Files == nil { 59*ba677afaSXin Li parser.pkg.Files = []*v2_3.File{} 60*ba677afaSXin Li } 61*ba677afaSXin Li parser.pkg.Files = append(parser.pkg.Files, parser.file) 62*ba677afaSXin Li } 63*ba677afaSXin Li case "FileType": 64*ba677afaSXin Li parser.file.FileTypes = append(parser.file.FileTypes, value) 65*ba677afaSXin Li case "FileChecksum": 66*ba677afaSXin Li subkey, subvalue, err := extractSubs(value) 67*ba677afaSXin Li if err != nil { 68*ba677afaSXin Li return err 69*ba677afaSXin Li } 70*ba677afaSXin Li if parser.file.Checksums == nil { 71*ba677afaSXin Li parser.file.Checksums = []common.Checksum{} 72*ba677afaSXin Li } 73*ba677afaSXin Li switch common.ChecksumAlgorithm(subkey) { 74*ba677afaSXin Li case common.SHA1, 75*ba677afaSXin Li common.SHA224, 76*ba677afaSXin Li common.SHA256, 77*ba677afaSXin Li common.SHA384, 78*ba677afaSXin Li common.SHA512, 79*ba677afaSXin Li common.MD2, 80*ba677afaSXin Li common.MD4, 81*ba677afaSXin Li common.MD5, 82*ba677afaSXin Li common.MD6, 83*ba677afaSXin Li common.SHA3_256, 84*ba677afaSXin Li common.SHA3_384, 85*ba677afaSXin Li common.SHA3_512, 86*ba677afaSXin Li common.BLAKE2b_256, 87*ba677afaSXin Li common.BLAKE2b_384, 88*ba677afaSXin Li common.BLAKE2b_512, 89*ba677afaSXin Li common.BLAKE3, 90*ba677afaSXin Li common.ADLER32: 91*ba677afaSXin Li algorithm := common.ChecksumAlgorithm(subkey) 92*ba677afaSXin Li parser.file.Checksums = append(parser.file.Checksums, common.Checksum{Algorithm: algorithm, Value: subvalue}) 93*ba677afaSXin Li default: 94*ba677afaSXin Li return fmt.Errorf("got unknown checksum type %s", subkey) 95*ba677afaSXin Li } 96*ba677afaSXin Li case "LicenseConcluded": 97*ba677afaSXin Li parser.file.LicenseConcluded = value 98*ba677afaSXin Li case "LicenseInfoInFile": 99*ba677afaSXin Li parser.file.LicenseInfoInFiles = append(parser.file.LicenseInfoInFiles, value) 100*ba677afaSXin Li case "LicenseComments": 101*ba677afaSXin Li parser.file.LicenseComments = value 102*ba677afaSXin Li case "FileCopyrightText": 103*ba677afaSXin Li parser.file.FileCopyrightText = value 104*ba677afaSXin Li case "ArtifactOfProjectName": 105*ba677afaSXin Li parser.fileAOP = &v2_3.ArtifactOfProject{} 106*ba677afaSXin Li parser.file.ArtifactOfProjects = append(parser.file.ArtifactOfProjects, parser.fileAOP) 107*ba677afaSXin Li parser.fileAOP.Name = value 108*ba677afaSXin Li case "ArtifactOfProjectHomePage": 109*ba677afaSXin Li if parser.fileAOP == nil { 110*ba677afaSXin Li return fmt.Errorf("no current ArtifactOfProject found") 111*ba677afaSXin Li } 112*ba677afaSXin Li parser.fileAOP.HomePage = value 113*ba677afaSXin Li case "ArtifactOfProjectURI": 114*ba677afaSXin Li if parser.fileAOP == nil { 115*ba677afaSXin Li return fmt.Errorf("no current ArtifactOfProject found") 116*ba677afaSXin Li } 117*ba677afaSXin Li parser.fileAOP.URI = value 118*ba677afaSXin Li case "FileComment": 119*ba677afaSXin Li parser.file.FileComment = value 120*ba677afaSXin Li case "FileNotice": 121*ba677afaSXin Li parser.file.FileNotice = value 122*ba677afaSXin Li case "FileContributor": 123*ba677afaSXin Li parser.file.FileContributors = append(parser.file.FileContributors, value) 124*ba677afaSXin Li case "FileDependency": 125*ba677afaSXin Li parser.file.FileDependencies = append(parser.file.FileDependencies, value) 126*ba677afaSXin Li case "FileAttributionText": 127*ba677afaSXin Li parser.file.FileAttributionTexts = append(parser.file.FileAttributionTexts, value) 128*ba677afaSXin Li // for relationship tags, pass along but don't change state 129*ba677afaSXin Li case "Relationship": 130*ba677afaSXin Li parser.rln = &v2_3.Relationship{} 131*ba677afaSXin Li parser.doc.Relationships = append(parser.doc.Relationships, parser.rln) 132*ba677afaSXin Li return parser.parsePairForRelationship2_3(tag, value) 133*ba677afaSXin Li case "RelationshipComment": 134*ba677afaSXin Li return parser.parsePairForRelationship2_3(tag, value) 135*ba677afaSXin Li // for annotation tags, pass along but don't change state 136*ba677afaSXin Li case "Annotator": 137*ba677afaSXin Li parser.ann = &v2_3.Annotation{} 138*ba677afaSXin Li parser.doc.Annotations = append(parser.doc.Annotations, parser.ann) 139*ba677afaSXin Li return parser.parsePairForAnnotation2_3(tag, value) 140*ba677afaSXin Li case "AnnotationDate": 141*ba677afaSXin Li return parser.parsePairForAnnotation2_3(tag, value) 142*ba677afaSXin Li case "AnnotationType": 143*ba677afaSXin Li return parser.parsePairForAnnotation2_3(tag, value) 144*ba677afaSXin Li case "SPDXREF": 145*ba677afaSXin Li return parser.parsePairForAnnotation2_3(tag, value) 146*ba677afaSXin Li case "AnnotationComment": 147*ba677afaSXin Li return parser.parsePairForAnnotation2_3(tag, value) 148*ba677afaSXin Li // tag for going on to review section (DEPRECATED) 149*ba677afaSXin Li case "Reviewer": 150*ba677afaSXin Li parser.st = psReview2_3 151*ba677afaSXin Li return parser.parsePairFromReview2_3(tag, value) 152*ba677afaSXin Li default: 153*ba677afaSXin Li return fmt.Errorf("received unknown tag %v in File section", tag) 154*ba677afaSXin Li } 155*ba677afaSXin Li 156*ba677afaSXin Li return nil 157*ba677afaSXin Li} 158