fix: strip publisher URL from RPM CPE vendor (#5081)

Signed-off-by: Eljees <yurytumanov.r@yandex.ru>
This commit is contained in:
Eljees 2026-07-27 22:18:27 +03:00 committed by GitHub
parent 86baeeb481
commit 295454945c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 96 additions and 13 deletions

View File

@ -1,26 +1,49 @@
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 {
vendors := newFieldCandidateSet()
var vendor string
switch m := p.Metadata.(type) {
case pkg.RpmDBEntry:
if m.Vendor != "" {
vendors.add(fieldCandidate{
value: normalizeName(m.Vendor),
disallowSubSelections: true,
})
}
vendor = m.Vendor
case pkg.RpmArchive:
if m.Vendor != "" {
vendors.add(fieldCandidate{
value: normalizeName(m.Vendor),
disallowSubSelections: true,
})
}
vendor = m.Vendor
}
vendor = stripTrailingURL(vendor)
if vendor != "" {
vendors.add(fieldCandidate{
value: normalizeName(vendor),
disallowSubSelections: true,
})
}
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])
}

View 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())
})
}
}