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  }