diff --git a/archive_extractor/deb_archiver.go b/archive_extractor/deb_archiver.go index fdb6de4..4bee7d8 100644 --- a/archive_extractor/deb_archiver.go +++ b/archive_extractor/deb_archiver.go @@ -15,6 +15,8 @@ type DebArchiver struct { MaxNumberOfEntries int } +const DebArchiverSkipFoldersCheckParamsKey = "DebArchiverSkipFoldersCheckParamsKey" + func (da DebArchiver) ExtractArchive(path string, processingFunc func(*ArchiveHeader, map[string]interface{}) error, params map[string]interface{}) error { maxBytesLimit, err := maxBytesLimit(path, da.MaxCompressRatio) @@ -33,6 +35,7 @@ func (da DebArchiver) ExtractArchive(path string, if rc == nil { return errors.New(fmt.Sprintf("Failed to open deb file : %s", path)) } + entriesCount := 0 for { if da.MaxNumberOfEntries != 0 && entriesCount > da.MaxNumberOfEntries { @@ -49,7 +52,7 @@ func (da DebArchiver) ExtractArchive(path string, if archiveEntry == nil { return errors.New(fmt.Sprintf("Failed to open file : %s", path)) } - if !utils.IsFolder(archiveEntry.Name) { + if skipFolderCheck(params) || !utils.IsFolder(archiveEntry.Name) { limitingReader := provider.CreateLimitAggregatingReadCloser(rc) archiveHeader := NewArchiveHeader(limitingReader, archiveEntry.Name, archiveEntry.ModTime.Unix(), archiveEntry.Size) err = processingFunc(archiveHeader, params) @@ -60,3 +63,12 @@ func (da DebArchiver) ExtractArchive(path string, } return nil } + +func skipFolderCheck(params map[string]interface{}) bool { + value, found := params[DebArchiverSkipFoldersCheckParamsKey] + if !found { + return false + } + boolValue, ok := value.(bool) + return ok && boolValue +} diff --git a/archive_extractor/deb_archiver_test.go b/archive_extractor/deb_archiver_test.go index cfb24c5..0417b6f 100644 --- a/archive_extractor/deb_archiver_test.go +++ b/archive_extractor/deb_archiver_test.go @@ -43,3 +43,36 @@ func TestDebArchiverMaxRatioNotReached(t *testing.T) { err := za.ExtractArchive("./fixtures/test.deb", processingReadingFunc, params()) assert.NoError(t, err) } + +func TestDebArchiverSkipFoldersCheck(t *testing.T) { + za := &DebArchiver{ + MaxCompressRatio: 1, + MaxNumberOfEntries: 3, + } + paramsMap := params() + + var entries []string + processor := func(header *ArchiveHeader, params map[string]interface{}) error { + entries = append(entries, header.Name) + return nil + } + + archivePath := "./fixtures/testslashesinentrynames.deb" + + // Default behaviour, skip entries that look like folders + err := za.ExtractArchive(archivePath, processor, paramsMap) + assert.NoError(t, err) + assert.Equal(t, 0, len(entries)) + + // Explicitly skip entries that look like folders + paramsMap[DebArchiverSkipFoldersCheckParamsKey] = false + err = za.ExtractArchive(archivePath, processor, paramsMap) + assert.NoError(t, err) + assert.Equal(t, 0, len(entries)) + + // Don't skip entries that look like folders + paramsMap[DebArchiverSkipFoldersCheckParamsKey] = true + err = za.ExtractArchive(archivePath, processor, paramsMap) + assert.NoError(t, err) + assert.Equal(t, 3, len(entries)) +} diff --git a/archive_extractor/fixtures/testslashesinentrynames.deb b/archive_extractor/fixtures/testslashesinentrynames.deb new file mode 100644 index 0000000..afb2a50 Binary files /dev/null and b/archive_extractor/fixtures/testslashesinentrynames.deb differ