github.com/anchore/syft@v1.38.2/syft/pkg/cataloger/internal/cpegenerate/dotnet.go (about)

     1  package cpegenerate
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/anchore/syft/syft/pkg"
     7  )
     8  
     9  func candidateProductsForDotnet(p pkg.Package) fieldCandidateSet {
    10  	products := newFieldCandidateSet()
    11  
    12  	switch m := p.Metadata.(type) {
    13  	case pkg.DotnetDepsEntry:
    14  		products.add(dotnetProductVariants(m.Name)...)
    15  		for _, pe := range m.Executables {
    16  			if pe.ProductName == "" {
    17  				continue
    18  			}
    19  			products.add(dotnetProductVariants(pe.ProductName)...)
    20  		}
    21  	case pkg.DotnetPortableExecutableEntry:
    22  		if m.ProductName != "" {
    23  			products.add(dotnetProductVariants(m.ProductName)...)
    24  		}
    25  	case pkg.DotnetPackagesLockEntry:
    26  		products.add(dotnetProductVariants(m.Name)...)
    27  	}
    28  
    29  	return products
    30  }
    31  
    32  func dotnetProductVariants(names ...string) []fieldCandidate {
    33  	var variants []fieldCandidate
    34  	for _, suff := range []string{"", "_.net"} {
    35  		for _, name := range names {
    36  			if name == "" {
    37  				continue
    38  			}
    39  			if suff != "" && strings.HasSuffix(name, suff) {
    40  				continue
    41  			}
    42  			variants = append(variants, fieldCandidate{
    43  				value:                       normalizeDotnetReference(name) + suff,
    44  				disallowSubSelections:       true,
    45  				disallowDelimiterVariations: true,
    46  			})
    47  		}
    48  	}
    49  	return variants
    50  }
    51  
    52  func normalizeDotnetReference(name string) string {
    53  	name = strings.TrimSpace(strings.ToLower(name))
    54  	name = strings.TrimSuffix(name, ".dll")
    55  	name = strings.ReplaceAll(name, "-", "_")
    56  	name = strings.ReplaceAll(name, " ", "_")
    57  	name = strings.ReplaceAll(name, ".", "_")
    58  	return name
    59  }
    60  
    61  func candidateVendorsForDotnet(p pkg.Package) fieldCandidateSet {
    62  	vendors := newFieldCandidateSet()
    63  
    64  	switch m := p.Metadata.(type) {
    65  	case pkg.DotnetDepsEntry:
    66  		vendors.add(fieldCandidate{
    67  			value:                       normalizeDotnetReference(m.Name),
    68  			disallowSubSelections:       true,
    69  			disallowDelimiterVariations: true,
    70  		})
    71  		for _, pe := range m.Executables {
    72  			if pe.CompanyName == "" {
    73  				continue
    74  			}
    75  			vendors.add(fieldCandidate{
    76  				value:                       normalizeDotnetReference(pe.CompanyName),
    77  				disallowSubSelections:       true,
    78  				disallowDelimiterVariations: true,
    79  			})
    80  		}
    81  	case pkg.DotnetPortableExecutableEntry:
    82  		if m.CompanyName != "" {
    83  			vendors.add(fieldCandidate{
    84  				value:                       normalizeDotnetReference(m.CompanyName),
    85  				disallowSubSelections:       true,
    86  				disallowDelimiterVariations: true,
    87  			})
    88  		}
    89  	case pkg.DotnetPackagesLockEntry:
    90  		vendors.add(fieldCandidate{
    91  			value:                       normalizeDotnetReference(m.Name),
    92  			disallowSubSelections:       true,
    93  			disallowDelimiterVariations: true,
    94  		})
    95  	}
    96  
    97  	return vendors
    98  }