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  }