simplify unzip; update java error statements

This commit is contained in:
Alex Goodman 2020-07-09 11:53:52 -04:00
parent 0f8dcf3f17
commit 4c7d9ccef7
No known key found for this signature in database
GPG Key ID: 86E2870463D5E890
3 changed files with 63 additions and 61 deletions

View File

@ -5,6 +5,8 @@ import (
"regexp"
"strings"
"github.com/anchore/imgbom/internal/log"
"github.com/anchore/imgbom/imgbom/pkg"
)
@ -16,24 +18,15 @@ var versionPattern = regexp.MustCompile(`(?P<name>.+)-(?P<version>(\d+\.)?(\d+\.
type archiveFilename struct {
raw string
fields []map[string]string
}
func newJavaArchiveFilename(raw string) archiveFilename {
return archiveFilename{
raw: raw,
}
}
func (a archiveFilename) normalize() string {
// trim the file extension and remove any path prefixes
return strings.TrimSuffix(filepath.Base(a.raw), "."+a.extension())
}
func (a archiveFilename) fields() []map[string]string {
name := a.normalize()
name := strings.TrimSuffix(filepath.Base(raw), filepath.Ext(raw))
matches := versionPattern.FindAllStringSubmatch(name, -1)
items := make([]map[string]string, 0)
fields := make([]map[string]string, 0)
for _, match := range matches {
item := make(map[string]string)
for i, name := range versionPattern.SubexpNames() {
@ -41,9 +34,13 @@ func (a archiveFilename) fields() []map[string]string {
item[name] = match[i]
}
}
items = append(items, item)
fields = append(fields, item)
}
return archiveFilename{
raw: raw,
fields: fields,
}
return items
}
func (a archiveFilename) extension() string {
@ -62,23 +59,21 @@ func (a archiveFilename) pkgType() pkg.Type {
}
func (a archiveFilename) version() string {
fields := a.fields()
// there should be only one version, if there is more or less then something is wrong
if len(fields) != 1 {
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 fields[0]["version"]
return a.fields[0]["version"]
}
func (a archiveFilename) name() string {
fields := a.fields()
// there should be only one name, if there is more or less then something is wrong
if len(fields) != 1 {
if len(a.fields) != 1 {
return ""
}
return fields[0]["name"]
return a.fields[0]["name"]
}

View File

@ -54,7 +54,7 @@ func parseJavaManifest(reader io.Reader) (*pkg.JavaManifest, error) {
}
if err := mapstructure.Decode(manifestMap, &manifest); err != nil {
return nil, fmt.Errorf("unable parse java manifest: %w", err)
return nil, fmt.Errorf("unable to parse java manifest: %w", err)
}
return &manifest, nil
@ -73,7 +73,7 @@ func newPackageFromJavaManifest(virtualPath, archivePath string, fileManifest fi
// fetch the manifest file
contents, err := file.ExtractFilesFromZip(archivePath, manifestMatches...)
if err != nil {
return nil, fmt.Errorf("unable to extract java manifests: %w", err)
return nil, fmt.Errorf("unable to extract java manifests (%s): %w", virtualPath, err)
}
// parse the manifest file into a rich object

View File

@ -83,7 +83,6 @@ func ExtractFilesFromZip(archivePath string, paths ...string) (map[string]string
return results, nil
}
// nolint:funlen
func UnzipToDir(archivePath, targetDir string) error {
zipReader, err := zip.OpenReader(archivePath)
if err != nil {
@ -106,6 +105,15 @@ func UnzipToDir(archivePath, targetDir string) error {
return fmt.Errorf("potential zip slip attack: %q", expandedFilePath)
}
err = extractSingleFile(file, expandedFilePath, archivePath)
if err != nil {
return err
}
}
return nil
}
func extractSingleFile(file *zip.File, expandedFilePath, archivePath string) error {
zippedFile, err := file.Open()
if err != nil {
return fmt.Errorf("unable to read file=%q from zip=%q: %w", file.Name, archivePath, err)
@ -146,7 +154,6 @@ func UnzipToDir(archivePath, targetDir string) error {
if err != nil {
return fmt.Errorf("unable to close source file=%q from zip=%q: %w", file.Name, archivePath, err)
}
}
return nil
}