github.com/haalcala/mattermost-server-change-repo/v5@v5.33.2/utils/archive_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package utils 5 6 import ( 7 "archive/zip" 8 "errors" 9 "io/ioutil" 10 "os" 11 "path/filepath" 12 "testing" 13 14 "github.com/stretchr/testify/require" 15 16 "github.com/mattermost/mattermost-server/v5/utils/fileutils" 17 ) 18 19 func TestSanitizePath(t *testing.T) { 20 cases := []struct { 21 input string 22 expected string 23 }{ 24 { 25 ".", 26 "", 27 }, 28 { 29 "../", 30 "", 31 }, 32 { 33 "...", 34 "", 35 }, 36 { 37 "..//.", 38 "", 39 }, 40 { 41 "/../", 42 "", 43 }, 44 { 45 "/path/...../to/file", 46 "/path/to/file", 47 }, 48 { 49 "/path/to/file...", 50 "/path/to/file...", 51 }, 52 { 53 "/path/to/../../../file", 54 "/file", 55 }, 56 { 57 "../../../../file", 58 "/file", 59 }, 60 { 61 "/path/to/file..ext", 62 "/path/to/file..ext", 63 }, 64 { 65 "/path/to/...file..ext", 66 "/path/to/...file..ext", 67 }, 68 { 69 "./path/to/...file..ext", 70 "path/to/...file..ext", 71 }, 72 { 73 "./...file", 74 "...file", 75 }, 76 { 77 "path/", 78 "path", 79 }, 80 } 81 82 for _, c := range cases { 83 t.Run(c.input, func(t *testing.T) { 84 require.Equal(t, c.expected, sanitizePath(c.input)) 85 }) 86 } 87 } 88 89 func TestUnzipToPath(t *testing.T) { 90 testDir, _ := fileutils.FindDir("tests") 91 require.NotEmpty(t, testDir) 92 93 dir, err := ioutil.TempDir("", "unzip") 94 require.Nil(t, err) 95 defer os.RemoveAll(dir) 96 97 t.Run("invalid archive", func(t *testing.T) { 98 file, err := os.Open(testDir + "/testplugin.tar.gz") 99 require.Nil(t, err) 100 defer file.Close() 101 102 info, err := file.Stat() 103 require.Nil(t, err) 104 105 paths, err := UnzipToPath(file, info.Size(), dir) 106 require.NotNil(t, err) 107 require.True(t, errors.Is(err, zip.ErrFormat)) 108 require.Nil(t, paths) 109 }) 110 111 t.Run("valid archive", func(t *testing.T) { 112 file, err := os.Open(testDir + "/testarchive.zip") 113 require.Nil(t, err) 114 defer file.Close() 115 116 info, err := file.Stat() 117 require.Nil(t, err) 118 119 paths, err := UnzipToPath(file, info.Size(), dir) 120 require.Nil(t, err) 121 require.NotEmpty(t, paths) 122 123 expectedFiles := map[string]int64{ 124 dir + "/testfile.txt": 446, 125 dir + "/testdir/testfile2.txt": 866, 126 dir + "/testdir2/testfile3.txt": 845, 127 } 128 129 expectedDirs := []string{ 130 dir + "/testdir", 131 dir + "/testdir2", 132 } 133 134 err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { 135 require.Nil(t, err) 136 if path == dir { 137 return nil 138 } 139 require.Contains(t, paths, path) 140 if info.IsDir() { 141 require.Contains(t, expectedDirs, path) 142 } else { 143 require.Equal(t, expectedFiles[path], info.Size()) 144 } 145 return nil 146 }) 147 require.Nil(t, err) 148 }) 149 }