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  }