1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2*ba677afaSXin Lipackage spdxlib 3*ba677afaSXin Li 4*ba677afaSXin Liimport ( 5*ba677afaSXin Li "fmt" 6*ba677afaSXin Li 7*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/common" 8*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/v2_1" 9*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/v2_2" 10*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/v2_3" 11*ba677afaSXin Li) 12*ba677afaSXin Li 13*ba677afaSXin Li// ValidateDocument2_1 returns an error if the Document is found to be invalid, or nil if the Document is valid. 14*ba677afaSXin Li// Currently, this only verifies that all Element IDs mentioned in Relationships exist in the Document as either a 15*ba677afaSXin Li// Package or an UnpackagedFile. 16*ba677afaSXin Lifunc ValidateDocument2_1(doc *v2_1.Document) error { 17*ba677afaSXin Li // cache a map of valid package IDs for quick lookups 18*ba677afaSXin Li validElementIDs := make(map[common.ElementID]bool) 19*ba677afaSXin Li for _, docPackage := range doc.Packages { 20*ba677afaSXin Li validElementIDs[docPackage.PackageSPDXIdentifier] = true 21*ba677afaSXin Li } 22*ba677afaSXin Li 23*ba677afaSXin Li for _, unpackagedFile := range doc.Files { 24*ba677afaSXin Li validElementIDs[unpackagedFile.FileSPDXIdentifier] = true 25*ba677afaSXin Li } 26*ba677afaSXin Li 27*ba677afaSXin Li // add the Document element ID 28*ba677afaSXin Li validElementIDs[common.MakeDocElementID("", "DOCUMENT").ElementRefID] = true 29*ba677afaSXin Li 30*ba677afaSXin Li for _, relationship := range doc.Relationships { 31*ba677afaSXin Li if !validElementIDs[relationship.RefA.ElementRefID] { 32*ba677afaSXin Li return fmt.Errorf("%s used in relationship but no such package exists", string(relationship.RefA.ElementRefID)) 33*ba677afaSXin Li } 34*ba677afaSXin Li 35*ba677afaSXin Li if !validElementIDs[relationship.RefB.ElementRefID] { 36*ba677afaSXin Li return fmt.Errorf("%s used in relationship but no such package exists", string(relationship.RefB.ElementRefID)) 37*ba677afaSXin Li } 38*ba677afaSXin Li } 39*ba677afaSXin Li 40*ba677afaSXin Li return nil 41*ba677afaSXin Li} 42*ba677afaSXin Li 43*ba677afaSXin Li// ValidateDocument2_2 returns an error if the Document is found to be invalid, or nil if the Document is valid. 44*ba677afaSXin Li// Currently, this only verifies that all Element IDs mentioned in Relationships exist in the Document as either a 45*ba677afaSXin Li// Package or an UnpackagedFile. 46*ba677afaSXin Lifunc ValidateDocument2_2(doc *v2_2.Document) error { 47*ba677afaSXin Li // cache a map of package IDs for quick lookups 48*ba677afaSXin Li validElementIDs := make(map[common.ElementID]bool) 49*ba677afaSXin Li for _, docPackage := range doc.Packages { 50*ba677afaSXin Li validElementIDs[docPackage.PackageSPDXIdentifier] = true 51*ba677afaSXin Li } 52*ba677afaSXin Li 53*ba677afaSXin Li for _, unpackagedFile := range doc.Files { 54*ba677afaSXin Li validElementIDs[unpackagedFile.FileSPDXIdentifier] = true 55*ba677afaSXin Li } 56*ba677afaSXin Li 57*ba677afaSXin Li // add the Document element ID 58*ba677afaSXin Li validElementIDs[common.MakeDocElementID("", "DOCUMENT").ElementRefID] = true 59*ba677afaSXin Li 60*ba677afaSXin Li for _, relationship := range doc.Relationships { 61*ba677afaSXin Li if !validElementIDs[relationship.RefA.ElementRefID] { 62*ba677afaSXin Li return fmt.Errorf("%s used in relationship but no such package exists", string(relationship.RefA.ElementRefID)) 63*ba677afaSXin Li } 64*ba677afaSXin Li 65*ba677afaSXin Li if !validElementIDs[relationship.RefB.ElementRefID] { 66*ba677afaSXin Li return fmt.Errorf("%s used in relationship but no such package exists", string(relationship.RefB.ElementRefID)) 67*ba677afaSXin Li } 68*ba677afaSXin Li } 69*ba677afaSXin Li 70*ba677afaSXin Li return nil 71*ba677afaSXin Li} 72*ba677afaSXin Li 73*ba677afaSXin Li// ValidateDocument2_3 returns an error if the Document is found to be invalid, or nil if the Document is valid. 74*ba677afaSXin Li// Currently, this only verifies that all Element IDs mentioned in Relationships exist in the Document as either a 75*ba677afaSXin Li// Package or an UnpackagedFile. 76*ba677afaSXin Lifunc ValidateDocument2_3(doc *v2_3.Document) error { 77*ba677afaSXin Li // cache a map of package IDs for quick lookups 78*ba677afaSXin Li validElementIDs := make(map[common.ElementID]bool) 79*ba677afaSXin Li for _, docPackage := range doc.Packages { 80*ba677afaSXin Li validElementIDs[docPackage.PackageSPDXIdentifier] = true 81*ba677afaSXin Li } 82*ba677afaSXin Li 83*ba677afaSXin Li for _, unpackagedFile := range doc.Files { 84*ba677afaSXin Li validElementIDs[unpackagedFile.FileSPDXIdentifier] = true 85*ba677afaSXin Li } 86*ba677afaSXin Li 87*ba677afaSXin Li // add the Document element ID 88*ba677afaSXin Li validElementIDs[common.MakeDocElementID("", "DOCUMENT").ElementRefID] = true 89*ba677afaSXin Li 90*ba677afaSXin Li for _, relationship := range doc.Relationships { 91*ba677afaSXin Li if !validElementIDs[relationship.RefA.ElementRefID] { 92*ba677afaSXin Li return fmt.Errorf("%s used in relationship but no such package exists", string(relationship.RefA.ElementRefID)) 93*ba677afaSXin Li } 94*ba677afaSXin Li 95*ba677afaSXin Li if !validElementIDs[relationship.RefB.ElementRefID] { 96*ba677afaSXin Li return fmt.Errorf("%s used in relationship but no such package exists", string(relationship.RefB.ElementRefID)) 97*ba677afaSXin Li } 98*ba677afaSXin Li } 99*ba677afaSXin Li 100*ba677afaSXin Li return nil 101*ba677afaSXin Li} 102