mirror of
https://github.com/anchore/syft.git
synced 2026-08-19 16:48:27 +02:00
fix: strip publisher URL from RPM CPE vendor (#5081)
Signed-off-by: Eljees <yurytumanov.r@yandex.ru>
This commit is contained in:
parent
86baeeb481
commit
295454945c
@ -1,26 +1,49 @@
|
|||||||
package cpegenerate
|
package cpegenerate
|
||||||
|
|
||||||
import "github.com/anchore/syft/syft/pkg"
|
import (
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/anchore/syft/syft/pkg"
|
||||||
|
)
|
||||||
|
|
||||||
func candidateVendorsForRPM(p pkg.Package) fieldCandidateSet {
|
func candidateVendorsForRPM(p pkg.Package) fieldCandidateSet {
|
||||||
vendors := newFieldCandidateSet()
|
vendors := newFieldCandidateSet()
|
||||||
|
var vendor string
|
||||||
|
|
||||||
switch m := p.Metadata.(type) {
|
switch m := p.Metadata.(type) {
|
||||||
case pkg.RpmDBEntry:
|
case pkg.RpmDBEntry:
|
||||||
if m.Vendor != "" {
|
vendor = m.Vendor
|
||||||
vendors.add(fieldCandidate{
|
|
||||||
value: normalizeName(m.Vendor),
|
|
||||||
disallowSubSelections: true,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
case pkg.RpmArchive:
|
case pkg.RpmArchive:
|
||||||
if m.Vendor != "" {
|
vendor = m.Vendor
|
||||||
|
}
|
||||||
|
|
||||||
|
vendor = stripTrailingURL(vendor)
|
||||||
|
if vendor != "" {
|
||||||
vendors.add(fieldCandidate{
|
vendors.add(fieldCandidate{
|
||||||
value: normalizeName(m.Vendor),
|
value: normalizeName(vendor),
|
||||||
disallowSubSelections: true,
|
disallowSubSelections: true,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return vendors
|
return vendors
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func stripTrailingURL(value string) string {
|
||||||
|
trimmed := strings.TrimSpace(value)
|
||||||
|
if !strings.HasSuffix(trimmed, ">") {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
open := strings.LastIndex(trimmed, "<")
|
||||||
|
if open == -1 {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed, err := url.Parse(trimmed[open+1 : len(trimmed)-1])
|
||||||
|
if err != nil || parsed.Host == "" || (parsed.Scheme != "http" && parsed.Scheme != "https") {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.TrimSpace(trimmed[:open])
|
||||||
|
}
|
||||||
|
|||||||
60
syft/pkg/cataloger/internal/cpegenerate/rpm_test.go
Normal file
60
syft/pkg/cataloger/internal/cpegenerate/rpm_test.go
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
package cpegenerate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"github.com/anchore/syft/syft/pkg"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCandidateVendorsForRPM(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
metadata any
|
||||||
|
expected []string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "database vendor with publisher URL",
|
||||||
|
metadata: pkg.RpmDBEntry{
|
||||||
|
Vendor: "SUSE LLC <https://www.suse.com/>",
|
||||||
|
},
|
||||||
|
expected: []string{"susellc"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "archive vendor with publisher URL",
|
||||||
|
metadata: pkg.RpmArchive{
|
||||||
|
Vendor: "SUSE LLC <https://www.suse.com/>",
|
||||||
|
},
|
||||||
|
expected: []string{"susellc"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "plain vendor",
|
||||||
|
metadata: pkg.RpmDBEntry{
|
||||||
|
Vendor: "Red Hat, Inc.",
|
||||||
|
},
|
||||||
|
expected: []string{"redhat"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "non-URL angle-bracket suffix",
|
||||||
|
metadata: pkg.RpmDBEntry{
|
||||||
|
Vendor: "Example <support@example.com>",
|
||||||
|
},
|
||||||
|
expected: []string{"example<support@example.com>"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "non-HTTP URL",
|
||||||
|
metadata: pkg.RpmDBEntry{
|
||||||
|
Vendor: "Example <ftp://example.com>",
|
||||||
|
},
|
||||||
|
expected: []string{"example<ftp://example.com>"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
p := pkg.Package{Metadata: test.metadata}
|
||||||
|
assert.ElementsMatch(t, test.expected, candidateVendorsForRPM(p).uniqueValues())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user