xref: /aosp_15_r20/external/spdx-tools/tvloader/parser2v3/parse_file.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
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