Skip to content

Commit e7e16fe

Browse files
nywilkenshoenig
andauthored
v2: decompressors: add LimitedDecompressors helper #413 (#415)
This change ports the helper function LimitedDecompressors(filesLimit, fileSizeLimit) for creating the same suite of decompressors as Decompressors, but all configured with the given filesLimit and fileSizeLimit that was introduced in go-getter v1. v1: decompressors: add LimitedDecompressors helper Co-authored-by: Seth Hoenig <[email protected]>
1 parent 1321450 commit e7e16fe

File tree

2 files changed

+82
-17
lines changed

2 files changed

+82
-17
lines changed

decompress.go

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,25 @@ type Decompressor interface {
1818
Decompress(dst, src string, dir bool, umask os.FileMode) error
1919
}
2020

21-
// Decompressors is the mapping of extension to the Decompressor implementation
22-
// that will decompress that extension/type.
23-
var Decompressors map[string]Decompressor
24-
25-
func init() {
26-
tarDecompressor := new(TarDecompressor)
27-
tbzDecompressor := new(TarBzip2Decompressor)
28-
tgzDecompressor := new(TarGzipDecompressor)
29-
txzDecompressor := new(TarXzDecompressor)
30-
tzstDecompressor := new(TarZstdDecompressor)
21+
// LimitedDecompressors creates the set of Decompressors, but with each compressor configured
22+
// with the given filesLimit and/or fileSizeLimit where applicable.
23+
func LimitedDecompressors(filesLimit int, fileSizeLimit int64) map[string]Decompressor {
24+
tarDecompressor := &TarDecompressor{FilesLimit: filesLimit, FileSizeLimit: fileSizeLimit}
25+
tbzDecompressor := &TarBzip2Decompressor{FilesLimit: filesLimit, FileSizeLimit: fileSizeLimit}
26+
tgzDecompressor := &TarGzipDecompressor{FilesLimit: filesLimit, FileSizeLimit: fileSizeLimit}
27+
txzDecompressor := &TarXzDecompressor{FilesLimit: filesLimit, FileSizeLimit: fileSizeLimit}
28+
tzstDecompressor := &TarZstdDecompressor{FilesLimit: filesLimit, FileSizeLimit: fileSizeLimit}
29+
bzipDecompressor := &Bzip2Decompressor{FileSizeLimit: fileSizeLimit}
30+
gzipDecompressor := &GzipDecompressor{FileSizeLimit: fileSizeLimit}
31+
xzDecompressor := &XzDecompressor{FileSizeLimit: fileSizeLimit}
32+
zipDecompressor := &ZipDecompressor{FilesLimit: filesLimit, FileSizeLimit: fileSizeLimit}
33+
zstDecompressor := &ZstdDecompressor{FileSizeLimit: fileSizeLimit}
3134

32-
Decompressors = map[string]Decompressor{
33-
"bz2": new(Bzip2Decompressor),
34-
"gz": new(GzipDecompressor),
35-
"xz": new(XzDecompressor),
35+
return map[string]Decompressor{
36+
"bz2": bzipDecompressor,
37+
"gz": gzipDecompressor,
38+
"xz": xzDecompressor,
39+
"tar": tarDecompressor,
3640
"tar.bz2": tbzDecompressor,
3741
"tar.gz": tgzDecompressor,
3842
"tar.xz": txzDecompressor,
@@ -41,12 +45,23 @@ func init() {
4145
"tgz": tgzDecompressor,
4246
"txz": txzDecompressor,
4347
"tzst": tzstDecompressor,
44-
"zip": new(ZipDecompressor),
45-
"tar": tarDecompressor,
46-
"zst": new(ZstdDecompressor),
48+
"zip": zipDecompressor,
49+
"zst": zstDecompressor,
4750
}
4851
}
4952

53+
const (
54+
noFilesLimit = 0
55+
noFileSizeLimit = 0
56+
)
57+
58+
// Decompressors is the mapping of extension to the Decompressor implementation
59+
// configured with default settings that will decompress that extension/type.
60+
//
61+
// Note: these decompressors by default do not limit the number of files or the
62+
// maximum file size created by the decompressed payload.
63+
var Decompressors = LimitedDecompressors(noFilesLimit, noFileSizeLimit)
64+
5065
// containsDotDot checks if the filepath value v contains a ".." entry.
5166
// This will check filepath components by splitting along / or \. This
5267
// function is copied directly from the Go net/http implementation.

decompress_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package getter
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestLimitedDecompressors(t *testing.T) {
8+
const (
9+
maxFiles = 111
10+
maxSize = 222
11+
)
12+
13+
checkFileSizeLimit := func(limit int64) {
14+
if limit != maxSize {
15+
t.Fatalf("expected FileSizeLimit of %d, got %d", maxSize, limit)
16+
}
17+
}
18+
19+
checkFilesLimit := func(limit int) {
20+
if limit != maxFiles {
21+
t.Fatalf("expected FilesLimit of %d, got %d", maxFiles, limit)
22+
}
23+
}
24+
25+
decompressors := LimitedDecompressors(maxFiles, maxSize)
26+
27+
checkFilesLimit(decompressors["tar"].(*TarDecompressor).FilesLimit)
28+
checkFileSizeLimit(decompressors["tar"].(*TarDecompressor).FileSizeLimit)
29+
30+
checkFilesLimit(decompressors["tar.bz2"].(*TarBzip2Decompressor).FilesLimit)
31+
checkFileSizeLimit(decompressors["tar.bz2"].(*TarBzip2Decompressor).FileSizeLimit)
32+
33+
checkFilesLimit(decompressors["tar.gz"].(*TarGzipDecompressor).FilesLimit)
34+
checkFileSizeLimit(decompressors["tar.gz"].(*TarGzipDecompressor).FileSizeLimit)
35+
36+
checkFilesLimit(decompressors["tar.xz"].(*TarXzDecompressor).FilesLimit)
37+
checkFileSizeLimit(decompressors["tar.xz"].(*TarXzDecompressor).FileSizeLimit)
38+
39+
checkFilesLimit(decompressors["tar.zst"].(*TarZstdDecompressor).FilesLimit)
40+
checkFileSizeLimit(decompressors["tar.zst"].(*TarZstdDecompressor).FileSizeLimit)
41+
42+
checkFilesLimit(decompressors["zip"].(*ZipDecompressor).FilesLimit)
43+
checkFileSizeLimit(decompressors["zip"].(*ZipDecompressor).FileSizeLimit)
44+
45+
// ones with file size limit only
46+
checkFileSizeLimit(decompressors["bz2"].(*Bzip2Decompressor).FileSizeLimit)
47+
checkFileSizeLimit(decompressors["gz"].(*GzipDecompressor).FileSizeLimit)
48+
checkFileSizeLimit(decompressors["xz"].(*XzDecompressor).FileSizeLimit)
49+
checkFileSizeLimit(decompressors["zst"].(*ZstdDecompressor).FileSizeLimit)
50+
}

0 commit comments

Comments
 (0)