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 8*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/common" 9*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/v2_2" 10*ba677afaSXin Li) 11*ba677afaSXin Li 12*ba677afaSXin Lifunc (parser *tvParser2_2) parsePairFromFile2_2(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_2 { 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_2.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_2 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_2 { 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_2(tag, value) 37*ba677afaSXin Li // tag for going on to snippet section 38*ba677afaSXin Li case "SnippetSPDXID": 39*ba677afaSXin Li parser.st = psSnippet2_2 40*ba677afaSXin Li return parser.parsePairFromSnippet2_2(tag, value) 41*ba677afaSXin Li // tag for going on to other license section 42*ba677afaSXin Li case "LicenseID": 43*ba677afaSXin Li parser.st = psOtherLicense2_2 44*ba677afaSXin Li return parser.parsePairFromOtherLicense2_2(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_2.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_2.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 algorithm := common.ChecksumAlgorithm(subkey) 84*ba677afaSXin Li parser.file.Checksums = append(parser.file.Checksums, common.Checksum{Algorithm: algorithm, Value: subvalue}) 85*ba677afaSXin Li default: 86*ba677afaSXin Li return fmt.Errorf("got unknown checksum type %s", subkey) 87*ba677afaSXin Li } 88*ba677afaSXin Li case "LicenseConcluded": 89*ba677afaSXin Li parser.file.LicenseConcluded = value 90*ba677afaSXin Li case "LicenseInfoInFile": 91*ba677afaSXin Li parser.file.LicenseInfoInFiles = append(parser.file.LicenseInfoInFiles, value) 92*ba677afaSXin Li case "LicenseComments": 93*ba677afaSXin Li parser.file.LicenseComments = value 94*ba677afaSXin Li case "FileCopyrightText": 95*ba677afaSXin Li parser.file.FileCopyrightText = value 96*ba677afaSXin Li case "ArtifactOfProjectName": 97*ba677afaSXin Li parser.fileAOP = &v2_2.ArtifactOfProject{} 98*ba677afaSXin Li parser.file.ArtifactOfProjects = append(parser.file.ArtifactOfProjects, parser.fileAOP) 99*ba677afaSXin Li parser.fileAOP.Name = value 100*ba677afaSXin Li case "ArtifactOfProjectHomePage": 101*ba677afaSXin Li if parser.fileAOP == nil { 102*ba677afaSXin Li return fmt.Errorf("no current ArtifactOfProject found") 103*ba677afaSXin Li } 104*ba677afaSXin Li parser.fileAOP.HomePage = value 105*ba677afaSXin Li case "ArtifactOfProjectURI": 106*ba677afaSXin Li if parser.fileAOP == nil { 107*ba677afaSXin Li return fmt.Errorf("no current ArtifactOfProject found") 108*ba677afaSXin Li } 109*ba677afaSXin Li parser.fileAOP.URI = value 110*ba677afaSXin Li case "FileComment": 111*ba677afaSXin Li parser.file.FileComment = value 112*ba677afaSXin Li case "FileNotice": 113*ba677afaSXin Li parser.file.FileNotice = value 114*ba677afaSXin Li case "FileContributor": 115*ba677afaSXin Li parser.file.FileContributors = append(parser.file.FileContributors, value) 116*ba677afaSXin Li case "FileDependency": 117*ba677afaSXin Li parser.file.FileDependencies = append(parser.file.FileDependencies, value) 118*ba677afaSXin Li case "FileAttributionText": 119*ba677afaSXin Li parser.file.FileAttributionTexts = append(parser.file.FileAttributionTexts, value) 120*ba677afaSXin Li // for relationship tags, pass along but don't change state 121*ba677afaSXin Li case "Relationship": 122*ba677afaSXin Li parser.rln = &v2_2.Relationship{} 123*ba677afaSXin Li parser.doc.Relationships = append(parser.doc.Relationships, parser.rln) 124*ba677afaSXin Li return parser.parsePairForRelationship2_2(tag, value) 125*ba677afaSXin Li case "RelationshipComment": 126*ba677afaSXin Li return parser.parsePairForRelationship2_2(tag, value) 127*ba677afaSXin Li // for annotation tags, pass along but don't change state 128*ba677afaSXin Li case "Annotator": 129*ba677afaSXin Li parser.ann = &v2_2.Annotation{} 130*ba677afaSXin Li parser.doc.Annotations = append(parser.doc.Annotations, parser.ann) 131*ba677afaSXin Li return parser.parsePairForAnnotation2_2(tag, value) 132*ba677afaSXin Li case "AnnotationDate": 133*ba677afaSXin Li return parser.parsePairForAnnotation2_2(tag, value) 134*ba677afaSXin Li case "AnnotationType": 135*ba677afaSXin Li return parser.parsePairForAnnotation2_2(tag, value) 136*ba677afaSXin Li case "SPDXREF": 137*ba677afaSXin Li return parser.parsePairForAnnotation2_2(tag, value) 138*ba677afaSXin Li case "AnnotationComment": 139*ba677afaSXin Li return parser.parsePairForAnnotation2_2(tag, value) 140*ba677afaSXin Li // tag for going on to review section (DEPRECATED) 141*ba677afaSXin Li case "Reviewer": 142*ba677afaSXin Li parser.st = psReview2_2 143*ba677afaSXin Li return parser.parsePairFromReview2_2(tag, value) 144*ba677afaSXin Li default: 145*ba677afaSXin Li return fmt.Errorf("received unknown tag %v in File section", tag) 146*ba677afaSXin Li } 147*ba677afaSXin Li 148*ba677afaSXin Li return nil 149*ba677afaSXin Li} 150