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 }