github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/syft/pkg/cataloger/php/package.go (about) 1 package php 2 3 import ( 4 "strings" 5 6 "github.com/anchore/packageurl-go" 7 "github.com/anchore/syft/syft/file" 8 "github.com/anchore/syft/syft/pkg" 9 ) 10 11 func newComposerLockPackage(pd parsedLockData, indexLocation file.Location) pkg.Package { 12 p := pkg.Package{ 13 Name: pd.Name, 14 Version: pd.Version, 15 Locations: file.NewLocationSet(indexLocation.WithAnnotation(pkg.EvidenceAnnotationKey, pkg.PrimaryEvidenceAnnotation)), 16 Licenses: pkg.NewLicenseSet(pkg.NewLicensesFromLocation(indexLocation, pd.License...)...), 17 PURL: packageURL(pd.Name, pd.Version), 18 Language: pkg.PHP, 19 Type: pkg.PhpComposerPkg, 20 Metadata: pd.PhpComposerLockEntry, 21 } 22 23 p.SetID() 24 return p 25 } 26 27 func newComposerInstalledPackage(pd parsedInstalledData, indexLocation file.Location) pkg.Package { 28 p := pkg.Package{ 29 Name: pd.Name, 30 Version: pd.Version, 31 Locations: file.NewLocationSet(indexLocation.WithAnnotation(pkg.EvidenceAnnotationKey, pkg.PrimaryEvidenceAnnotation)), 32 Licenses: pkg.NewLicenseSet(pkg.NewLicensesFromLocation(indexLocation, pd.License...)...), 33 PURL: packageURL(pd.Name, pd.Version), 34 Language: pkg.PHP, 35 Type: pkg.PhpComposerPkg, 36 Metadata: pd.PhpComposerInstalledEntry, 37 } 38 39 p.SetID() 40 return p 41 } 42 43 func newPeclPackage(pd pkg.PhpPeclEntry, indexLocation file.Location) pkg.Package { 44 p := pkg.Package{ 45 Name: pd.Name, 46 Version: pd.Version, 47 Locations: file.NewLocationSet(indexLocation.WithAnnotation(pkg.EvidenceAnnotationKey, pkg.PrimaryEvidenceAnnotation)), 48 Licenses: pkg.NewLicenseSet(pkg.NewLicensesFromLocation(indexLocation, pd.License...)...), 49 PURL: packageURLFromPecl(pd.Name, pd.Version), 50 Language: pkg.PHP, 51 Type: pkg.PhpPeclPkg, 52 Metadata: pd, 53 } 54 55 p.SetID() 56 return p 57 } 58 59 func packageURL(name, version string) string { 60 var pkgName, vendor string 61 fields := strings.Split(name, "/") 62 switch len(fields) { 63 case 0: 64 return "" 65 case 1: 66 pkgName = name 67 case 2: 68 vendor = fields[0] 69 pkgName = fields[1] 70 default: 71 vendor = fields[0] 72 pkgName = strings.Join(fields[1:], "-") 73 } 74 75 pURL := packageurl.NewPackageURL( 76 packageurl.TypeComposer, 77 vendor, 78 pkgName, 79 version, 80 nil, 81 "") 82 return pURL.ToString() 83 } 84 85 func packageURLFromPecl(pkgName, version string) string { 86 pURL := packageurl.NewPackageURL( 87 "pecl", 88 "", 89 pkgName, 90 version, 91 nil, 92 "") 93 return pURL.ToString() 94 }