github.com/argoproj/argo-cd/v3@v3.2.1/util/io/files/secure_mkdir_test.go (about) 1 package files 2 3 import ( 4 "os" 5 "path" 6 "path/filepath" 7 "strings" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestSecureMkdirAllDefault(t *testing.T) { 15 root := t.TempDir() 16 17 unsafePath := "test/dir" 18 fullPath, err := SecureMkdirAll(root, unsafePath, os.ModePerm) 19 require.NoError(t, err) 20 21 expectedPath := path.Join(root, unsafePath) 22 assert.Equal(t, expectedPath, fullPath) 23 } 24 25 func TestSecureMkdirAllWithExistingDir(t *testing.T) { 26 root := t.TempDir() 27 unsafePath := "existing/dir" 28 29 fullPath, err := SecureMkdirAll(root, unsafePath, os.ModePerm) 30 require.NoError(t, err) 31 32 newPath, err := SecureMkdirAll(root, unsafePath, os.ModePerm) 33 require.NoError(t, err) 34 assert.Equal(t, fullPath, newPath) 35 } 36 37 func TestSecureMkdirAllWithFile(t *testing.T) { 38 root := t.TempDir() 39 unsafePath := "file.txt" 40 41 filePath := filepath.Join(root, unsafePath) 42 err := os.WriteFile(filePath, []byte("test"), os.ModePerm) 43 require.NoError(t, err) 44 45 // Should fail because there is a file at the path 46 _, err = SecureMkdirAll(root, unsafePath, os.ModePerm) 47 require.Error(t, err) 48 } 49 50 func TestSecureMkdirAllDotDotPath(t *testing.T) { 51 root := t.TempDir() 52 unsafePath := "../outside" 53 54 fullPath, err := SecureMkdirAll(root, unsafePath, os.ModePerm) 55 require.NoError(t, err) 56 57 expectedPath := filepath.Join(root, "outside") 58 assert.Equal(t, expectedPath, fullPath) 59 60 info, err := os.Stat(fullPath) 61 require.NoError(t, err) 62 assert.True(t, info.IsDir()) 63 64 relPath, err := filepath.Rel(root, fullPath) 65 require.NoError(t, err) 66 assert.False(t, strings.HasPrefix(relPath, "..")) 67 }