1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2*ba677afaSXin Li 3*ba677afaSXin Lipackage parser2v1 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_1" 10*ba677afaSXin Li) 11*ba677afaSXin Li 12*ba677afaSXin Lifunc (parser *tvParser2_1) parsePairFromFile2_1(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 a spdxId or not 23*ba677afaSXin Li if parser.file != nil && parser.file.FileSPDXIdentifier == nullSpdxElementId2_1 { 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_1.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 // check if the previous file contained a spdxId or not 31*ba677afaSXin Li if parser.file != nil && parser.file.FileSPDXIdentifier == nullSpdxElementId2_1 { 32*ba677afaSXin Li return fmt.Errorf("file with FileName %s does not have SPDX identifier", parser.file.FileName) 33*ba677afaSXin Li } 34*ba677afaSXin Li parser.st = psPackage2_1 35*ba677afaSXin Li parser.file = nil 36*ba677afaSXin Li return parser.parsePairFromPackage2_1(tag, value) 37*ba677afaSXin Li // tag for going on to snippet section 38*ba677afaSXin Li case "SnippetSPDXID": 39*ba677afaSXin Li parser.st = psSnippet2_1 40*ba677afaSXin Li return parser.parsePairFromSnippet2_1(tag, value) 41*ba677afaSXin Li // tag for going on to other license section 42*ba677afaSXin Li case "LicenseID": 43*ba677afaSXin Li parser.st = psOtherLicense2_1 44*ba677afaSXin Li return parser.parsePairFromOtherLicense2_1(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_1.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_1.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, common.SHA256, common.MD5: 75*ba677afaSXin Li algorithm := common.ChecksumAlgorithm(subkey) 76*ba677afaSXin Li parser.file.Checksums = append(parser.file.Checksums, common.Checksum{Algorithm: algorithm, Value: subvalue}) 77*ba677afaSXin Li default: 78*ba677afaSXin Li return fmt.Errorf("got unknown checksum type %s", subkey) 79*ba677afaSXin Li } 80*ba677afaSXin Li case "LicenseConcluded": 81*ba677afaSXin Li parser.file.LicenseConcluded = value 82*ba677afaSXin Li case "LicenseInfoInFile": 83*ba677afaSXin Li parser.file.LicenseInfoInFiles = append(parser.file.LicenseInfoInFiles, value) 84*ba677afaSXin Li case "LicenseComments": 85*ba677afaSXin Li parser.file.LicenseComments = value 86*ba677afaSXin Li case "FileCopyrightText": 87*ba677afaSXin Li parser.file.FileCopyrightText = value 88*ba677afaSXin Li case "ArtifactOfProjectName": 89*ba677afaSXin Li parser.fileAOP = &v2_1.ArtifactOfProject{} 90*ba677afaSXin Li parser.file.ArtifactOfProjects = append(parser.file.ArtifactOfProjects, parser.fileAOP) 91*ba677afaSXin Li parser.fileAOP.Name = value 92*ba677afaSXin Li case "ArtifactOfProjectHomePage": 93*ba677afaSXin Li if parser.fileAOP == nil { 94*ba677afaSXin Li return fmt.Errorf("no current ArtifactOfProject found") 95*ba677afaSXin Li } 96*ba677afaSXin Li parser.fileAOP.HomePage = value 97*ba677afaSXin Li case "ArtifactOfProjectURI": 98*ba677afaSXin Li if parser.fileAOP == nil { 99*ba677afaSXin Li return fmt.Errorf("no current ArtifactOfProject found") 100*ba677afaSXin Li } 101*ba677afaSXin Li parser.fileAOP.URI = value 102*ba677afaSXin Li case "FileComment": 103*ba677afaSXin Li parser.file.FileComment = value 104*ba677afaSXin Li case "FileNotice": 105*ba677afaSXin Li parser.file.FileNotice = value 106*ba677afaSXin Li case "FileContributor": 107*ba677afaSXin Li parser.file.FileContributors = append(parser.file.FileContributors, value) 108*ba677afaSXin Li case "FileDependency": 109*ba677afaSXin Li parser.file.FileDependencies = append(parser.file.FileDependencies, value) 110*ba677afaSXin Li // for relationship tags, pass along but don't change state 111*ba677afaSXin Li case "Relationship": 112*ba677afaSXin Li parser.rln = &v2_1.Relationship{} 113*ba677afaSXin Li parser.doc.Relationships = append(parser.doc.Relationships, parser.rln) 114*ba677afaSXin Li return parser.parsePairForRelationship2_1(tag, value) 115*ba677afaSXin Li case "RelationshipComment": 116*ba677afaSXin Li return parser.parsePairForRelationship2_1(tag, value) 117*ba677afaSXin Li // for annotation tags, pass along but don't change state 118*ba677afaSXin Li case "Annotator": 119*ba677afaSXin Li parser.ann = &v2_1.Annotation{} 120*ba677afaSXin Li parser.doc.Annotations = append(parser.doc.Annotations, parser.ann) 121*ba677afaSXin Li return parser.parsePairForAnnotation2_1(tag, value) 122*ba677afaSXin Li case "AnnotationDate": 123*ba677afaSXin Li return parser.parsePairForAnnotation2_1(tag, value) 124*ba677afaSXin Li case "AnnotationType": 125*ba677afaSXin Li return parser.parsePairForAnnotation2_1(tag, value) 126*ba677afaSXin Li case "SPDXREF": 127*ba677afaSXin Li return parser.parsePairForAnnotation2_1(tag, value) 128*ba677afaSXin Li case "AnnotationComment": 129*ba677afaSXin Li return parser.parsePairForAnnotation2_1(tag, value) 130*ba677afaSXin Li // tag for going on to review section (DEPRECATED) 131*ba677afaSXin Li case "Reviewer": 132*ba677afaSXin Li parser.st = psReview2_1 133*ba677afaSXin Li return parser.parsePairFromReview2_1(tag, value) 134*ba677afaSXin Li default: 135*ba677afaSXin Li return fmt.Errorf("received unknown tag %v in File section", tag) 136*ba677afaSXin Li } 137*ba677afaSXin Li 138*ba677afaSXin Li return nil 139*ba677afaSXin Li} 140