summaryrefslogtreecommitdiffstats
path: root/hugofs/nosymlink_test.go
blob: 6d0b99dccbb225835653e50b7a48e26d47cd55b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// Copyright 2019 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package hugofs

import (
	"os"
	"path/filepath"
	"testing"

	"github.com/gohugoio/hugo/htesting"

	"github.com/spf13/afero"

	"github.com/stretchr/testify/require"
)

func TestNoSymlinkFs(t *testing.T) {
	if skipSymlink() {
		t.Skip("Skip; os.Symlink needs administrator rights on Windows")
	}
	assert := require.New(t)
	workDir, clean, err := htesting.CreateTempDir(Os, "hugo-nosymlink")
	assert.NoError(err)
	defer clean()
	wd, _ := os.Getwd()
	defer func() {
		os.Chdir(wd)
	}()

	blogDir := filepath.Join(workDir, "blog")
	blogFile := filepath.Join(blogDir, "a.txt")
	assert.NoError(os.MkdirAll(blogDir, 0777))
	afero.WriteFile(Os, filepath.Join(blogFile), []byte("content"), 0777)
	os.Chdir(workDir)
	assert.NoError(os.Symlink("blog", "symlinkdedir"))
	os.Chdir(blogDir)
	assert.NoError(os.Symlink("a.txt", "symlinkdedfile.txt"))

	fs := NewNoSymlinkFs(Os)
	ls := fs.(afero.Lstater)
	symlinkedDir := filepath.Join(workDir, "symlinkdedir")
	symlinkedFile := filepath.Join(blogDir, "symlinkdedfile.txt")

	// Check Stat and Lstat
	for _, stat := range []func(name string) (os.FileInfo, error){
		func(name string) (os.FileInfo, error) {
			return fs.Stat(name)
		},
		func(name string) (os.FileInfo, error) {
			fi, _, err := ls.LstatIfPossible(name)
			return fi, err
		},
	} {
		_, err = stat(symlinkedDir)
		assert.Equal(ErrPermissionSymlink, err)
		_, err = stat(symlinkedFile)
		assert.Equal(ErrPermissionSymlink, err)

		fi, err := stat(filepath.Join(workDir, "blog"))
		assert.NoError(err)
		assert.NotNil(fi)

		fi, err = stat(blogFile)
		assert.NoError(err)
		assert.NotNil(fi)
	}

	// Check Open
	_, err = fs.Open(symlinkedDir)
	assert.Equal(ErrPermissionSymlink, err)
	_, err = fs.OpenFile(symlinkedDir, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
	assert.Equal(ErrPermissionSymlink, err)
	_, err = fs.OpenFile(symlinkedFile, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
	assert.Equal(ErrPermissionSymlink, err)
	_, err = fs.Open(symlinkedFile)
	assert.Equal(ErrPermissionSymlink, err)
	f, err := fs.Open(blogDir)
	assert.NoError(err)
	f.Close()
	f, err = fs.Open(blogFile)
	assert.NoError(err)
	f.Close()

	// os.OpenFile(logFile, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)

}