Skip to content

Commit bbe2baf

Browse files
authored
fix: Ignore all hidden files and folders in archive (#4382)
This also adds a suite of tests to ensure this cannot happen again!
1 parent 3ad5e11 commit bbe2baf

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

provisionersdk/archive.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func Tar(directory string, limit int64) ([]byte, error) {
7575
if err != nil {
7676
return err
7777
}
78-
if strings.HasPrefix(rel, ".") {
78+
if strings.HasPrefix(rel, ".") || strings.HasPrefix(filepath.Base(rel), ".") {
7979
if fileInfo.IsDir() && rel != "." {
8080
// Don't archive hidden files!
8181
return filepath.SkipDir

provisionersdk/archive_test.go

+57
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package provisionersdk_test
22

33
import (
4+
"fmt"
45
"os"
56
"path/filepath"
67
"testing"
@@ -30,6 +31,62 @@ func TestTar(t *testing.T) {
3031
_, err = provisionersdk.Tar(dir, 1024)
3132
require.NoError(t, err)
3233
})
34+
t.Run("HiddenFiles", func(t *testing.T) {
35+
t.Parallel()
36+
dir := t.TempDir()
37+
type file struct {
38+
Name string
39+
Archives bool
40+
}
41+
files := []*file{{
42+
Name: "*.tf",
43+
Archives: true,
44+
}, {
45+
Name: ".*",
46+
Archives: false,
47+
}, {
48+
Name: "./testing/.test/*.tf",
49+
Archives: false,
50+
}, {
51+
Name: "./testing/asd.*",
52+
Archives: true,
53+
}, {
54+
Name: ".terraform/.*",
55+
Archives: false,
56+
}, {
57+
Name: "example/.terraform/*",
58+
Archives: false,
59+
}}
60+
for _, file := range files {
61+
newDir := dir
62+
if filepath.Base(file.Name) != file.Name {
63+
newDir = filepath.Join(newDir, filepath.Dir(file.Name))
64+
err := os.MkdirAll(newDir, 0755)
65+
require.NoError(t, err)
66+
file.Name = filepath.Base(file.Name)
67+
}
68+
tmpFile, err := os.CreateTemp(newDir, file.Name)
69+
require.NoError(t, err)
70+
_ = tmpFile.Close()
71+
file.Name, err = filepath.Rel(dir, tmpFile.Name())
72+
require.NoError(t, err)
73+
fmt.Printf("rel")
74+
}
75+
content, err := provisionersdk.Tar(dir, 1024)
76+
require.NoError(t, err)
77+
dir = t.TempDir()
78+
err = provisionersdk.Untar(dir, content)
79+
require.NoError(t, err)
80+
for _, file := range files {
81+
_, err = os.Stat(filepath.Join(dir, file.Name))
82+
t.Logf("stat %q %+v", file.Name, err)
83+
if file.Archives {
84+
require.NoError(t, err)
85+
} else {
86+
require.ErrorIs(t, err, os.ErrNotExist)
87+
}
88+
}
89+
})
3390
}
3491

3592
func TestUntar(t *testing.T) {

0 commit comments

Comments
 (0)