aboutsummaryrefslogtreecommitdiff
path: root/weed/sftpd/sftp_server_test.go
blob: 0af94ca14091ebf0acdaf643369b794b9d75d959 (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
98
99
100
101
102
103
package sftpd

import (
	"testing"

	"github.com/seaweedfs/seaweedfs/weed/sftpd/user"
	"github.com/stretchr/testify/assert"
)

func stringPtr(s string) *string {
	return &s
}

func TestToAbsolutePath(t *testing.T) {
	tests := []struct {
		name        string
		homeDir     *string // Use pointer to distinguish between unset and empty
		userPath    string
		expected    string
		expectError bool
	}{
		{
			name:     "normal path",
			userPath: "/foo.txt",
			expected: "/sftp/testuser/foo.txt",
		},
		{
			name:     "root path",
			userPath: "/",
			expected: "/sftp/testuser",
		},
		{
			name:     "path with dot",
			userPath: "/./foo.txt",
			expected: "/sftp/testuser/foo.txt",
		},
		{
			name:        "path traversal attempts",
			userPath:    "/../foo.txt",
			expectError: true,
		},
		{
			name:        "path traversal attempts 2",
			userPath:    "../../foo.txt",
			expectError: true,
		},
		{
			name:        "path traversal attempts 3",
			userPath:    "/subdir/../../foo.txt",
			expectError: true,
		},
		{
			name:     "empty path",
			userPath: "",
			expected: "/sftp/testuser",
		},
		{
			name:     "multiple slashes",
			userPath: "//foo.txt",
			expected: "/sftp/testuser/foo.txt",
		},
		{
			name:     "trailing slash",
			userPath: "/foo/",
			expected: "/sftp/testuser/foo",
		},
		{
			name:     "empty HomeDir passthrough",
			homeDir:  stringPtr(""),
			userPath: "/foo.txt",
			expected: "/foo.txt",
		},
		{
			name:     "root HomeDir passthrough",
			homeDir:  stringPtr("/"),
			userPath: "/foo.txt",
			expected: "/foo.txt",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			homeDir := "/sftp/testuser" // default
			if tt.homeDir != nil {
				homeDir = *tt.homeDir
			}

			fs := &SftpServer{
				user: &user.User{
					HomeDir: homeDir,
				},
			}

			got, err := fs.toAbsolutePath(tt.userPath)
			if tt.expectError {
				assert.Error(t, err)
			} else {
				assert.NoError(t, err)
				assert.Equal(t, tt.expected, got)
			}
		})
	}
}