mirror of
https://github.com/anchore/syft.git
synced 2025-11-17 16:33:21 +01:00
80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
package java
|
|
|
|
import (
|
|
"path/filepath"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/anchore/imgbom/internal/log"
|
|
|
|
"github.com/anchore/imgbom/imgbom/pkg"
|
|
)
|
|
|
|
// match examples:
|
|
// pkg-extra-field-4.3.2-rc1 --> match(name=pkg-extra-field version=4.3.2-rc1)
|
|
// pkg-extra-field-4.3-rc1 --> match(name=pkg-extra-field version=4.3-rc1)
|
|
// pkg-extra-field-4.3 --> match(name=pkg-extra-field version=4.3)
|
|
var versionPattern = regexp.MustCompile(`(?P<name>.+)-(?P<version>(\d+\.)?(\d+\.)?(\*|\d+)(-[a-zA-Z0-9\-\.]+)*)`)
|
|
|
|
type archiveFilename struct {
|
|
raw string
|
|
fields []map[string]string
|
|
}
|
|
|
|
func newJavaArchiveFilename(raw string) archiveFilename {
|
|
// trim the file extension and remove any path prefixes
|
|
name := strings.TrimSuffix(filepath.Base(raw), filepath.Ext(raw))
|
|
|
|
matches := versionPattern.FindAllStringSubmatch(name, -1)
|
|
fields := make([]map[string]string, 0)
|
|
for _, match := range matches {
|
|
item := make(map[string]string)
|
|
for i, name := range versionPattern.SubexpNames() {
|
|
if i != 0 && name != "" {
|
|
item[name] = match[i]
|
|
}
|
|
}
|
|
fields = append(fields, item)
|
|
}
|
|
|
|
return archiveFilename{
|
|
raw: raw,
|
|
fields: fields,
|
|
}
|
|
}
|
|
|
|
func (a archiveFilename) extension() string {
|
|
return strings.TrimPrefix(filepath.Ext(a.raw), ".")
|
|
}
|
|
|
|
func (a archiveFilename) pkgType() pkg.Type {
|
|
switch strings.ToLower(a.extension()) {
|
|
case "jar", "war", "ear":
|
|
return pkg.JavaPkg
|
|
case "jpi", "hpi":
|
|
return pkg.JenkinsPluginPkg
|
|
default:
|
|
return pkg.UnknownPkg
|
|
}
|
|
}
|
|
|
|
func (a archiveFilename) version() string {
|
|
if len(a.fields) > 1 {
|
|
log.Errorf("discovered multiple name-version pairings from %q: %+v", a.raw, a.fields)
|
|
return ""
|
|
} else if len(a.fields) < 1 {
|
|
return ""
|
|
}
|
|
|
|
return a.fields[0]["version"]
|
|
}
|
|
|
|
func (a archiveFilename) name() string {
|
|
// there should be only one name, if there is more or less then something is wrong
|
|
if len(a.fields) != 1 {
|
|
return ""
|
|
}
|
|
|
|
return a.fields[0]["name"]
|
|
}
|