|
@@ -763,60 +763,70 @@ func TestStartDirectory(t *testing.T) {
|
|
|
startDir := "/st@ rt/dir"
|
|
|
u := getTestUser(usePubKey)
|
|
|
u.Filters.StartDirectory = startDir
|
|
|
- user, _, err := httpdtest.AddUser(u, http.StatusCreated)
|
|
|
+ localUser, _, err := httpdtest.AddUser(u, http.StatusCreated)
|
|
|
assert.NoError(t, err)
|
|
|
- conn, client, err := getSftpClient(user, usePubKey)
|
|
|
- if assert.NoError(t, err) {
|
|
|
- defer conn.Close()
|
|
|
- defer client.Close()
|
|
|
+ u = getTestSFTPUser(usePubKey)
|
|
|
+ u.Filters.StartDirectory = startDir
|
|
|
+ sftpUser, _, err := httpdtest.AddUser(u, http.StatusCreated)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ for _, user := range []dataprovider.User{localUser, sftpUser} {
|
|
|
+ conn, client, err := getSftpClient(user, usePubKey)
|
|
|
+ if assert.NoError(t, err) {
|
|
|
+ defer conn.Close()
|
|
|
+ defer client.Close()
|
|
|
|
|
|
- currentDir, err := client.Getwd()
|
|
|
- assert.NoError(t, err)
|
|
|
- assert.Equal(t, startDir, currentDir)
|
|
|
+ currentDir, err := client.Getwd()
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, startDir, currentDir)
|
|
|
|
|
|
- entries, err := client.ReadDir(".")
|
|
|
- assert.NoError(t, err)
|
|
|
- assert.Len(t, entries, 0)
|
|
|
+ entries, err := client.ReadDir(".")
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Len(t, entries, 0)
|
|
|
|
|
|
- testFilePath := filepath.Join(homeBasePath, testFileName)
|
|
|
- testFileSize := int64(65535)
|
|
|
- err = createTestFile(testFilePath, testFileSize)
|
|
|
- assert.NoError(t, err)
|
|
|
- err = sftpUploadFile(testFilePath, testFileName, testFileSize, client)
|
|
|
- assert.NoError(t, err)
|
|
|
- localDownloadPath := filepath.Join(homeBasePath, testDLFileName)
|
|
|
- err = sftpDownloadFile(testFileName, localDownloadPath, testFileSize, client)
|
|
|
- assert.NoError(t, err)
|
|
|
- _, err = client.Stat(testFileName)
|
|
|
- assert.NoError(t, err)
|
|
|
- err = client.Rename(testFileName, testFileName+"_rename")
|
|
|
- assert.NoError(t, err)
|
|
|
+ testFilePath := filepath.Join(homeBasePath, testFileName)
|
|
|
+ testFileSize := int64(65535)
|
|
|
+ err = createTestFile(testFilePath, testFileSize)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = sftpUploadFile(testFilePath, testFileName, testFileSize, client)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ localDownloadPath := filepath.Join(homeBasePath, testDLFileName)
|
|
|
+ err = sftpDownloadFile(testFileName, localDownloadPath, testFileSize, client)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ _, err = client.Stat(testFileName)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = client.Rename(testFileName, testFileName+"_rename")
|
|
|
+ assert.NoError(t, err)
|
|
|
|
|
|
- entries, err = client.ReadDir(".")
|
|
|
- assert.NoError(t, err)
|
|
|
- assert.Len(t, entries, 1)
|
|
|
+ entries, err = client.ReadDir(".")
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Len(t, entries, 1)
|
|
|
|
|
|
- currentDir, err = client.RealPath("..")
|
|
|
- assert.NoError(t, err)
|
|
|
- assert.Equal(t, path.Dir(startDir), currentDir)
|
|
|
+ currentDir, err = client.RealPath("..")
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, path.Dir(startDir), currentDir)
|
|
|
|
|
|
- currentDir, err = client.RealPath("../..")
|
|
|
- assert.NoError(t, err)
|
|
|
- assert.Equal(t, "/", currentDir)
|
|
|
+ currentDir, err = client.RealPath("../..")
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, "/", currentDir)
|
|
|
|
|
|
- currentDir, err = client.RealPath("../../..")
|
|
|
- assert.NoError(t, err)
|
|
|
- assert.Equal(t, "/", currentDir)
|
|
|
+ currentDir, err = client.RealPath("../../..")
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, "/", currentDir)
|
|
|
|
|
|
- err = os.Remove(testFilePath)
|
|
|
- assert.NoError(t, err)
|
|
|
- err = os.Remove(localDownloadPath)
|
|
|
- assert.NoError(t, err)
|
|
|
- }
|
|
|
+ err = client.Remove(testFileName + "_rename")
|
|
|
+ assert.NoError(t, err)
|
|
|
|
|
|
- _, err = httpdtest.RemoveUser(user, http.StatusOK)
|
|
|
+ err = os.Remove(testFilePath)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = os.Remove(localDownloadPath)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ _, err = httpdtest.RemoveUser(sftpUser, http.StatusOK)
|
|
|
assert.NoError(t, err)
|
|
|
- err = os.RemoveAll(user.GetHomeDir())
|
|
|
+ _, err = httpdtest.RemoveUser(localUser, http.StatusOK)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = os.RemoveAll(localUser.GetHomeDir())
|
|
|
assert.NoError(t, err)
|
|
|
}
|
|
|
|
|
@@ -1181,22 +1191,59 @@ func TestProxyProtocol(t *testing.T) {
|
|
|
func TestRealPath(t *testing.T) {
|
|
|
usePubKey := true
|
|
|
u := getTestUser(usePubKey)
|
|
|
- user, _, err := httpdtest.AddUser(u, http.StatusCreated)
|
|
|
+ localUser, _, err := httpdtest.AddUser(u, http.StatusCreated)
|
|
|
assert.NoError(t, err)
|
|
|
- conn, client, err := getSftpClient(user, usePubKey)
|
|
|
- if assert.NoError(t, err) {
|
|
|
- defer conn.Close()
|
|
|
- defer client.Close()
|
|
|
- p, err := client.RealPath("../..")
|
|
|
- assert.NoError(t, err)
|
|
|
- assert.Equal(t, "/", p)
|
|
|
- p, err = client.RealPath("../test")
|
|
|
- assert.NoError(t, err)
|
|
|
- assert.Equal(t, "/test", p)
|
|
|
+ u = getTestSFTPUser(usePubKey)
|
|
|
+ sftpUser, _, err := httpdtest.AddUser(u, http.StatusCreated)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ for _, user := range []dataprovider.User{localUser, sftpUser} {
|
|
|
+ conn, client, err := getSftpClient(user, usePubKey)
|
|
|
+ if assert.NoError(t, err) {
|
|
|
+ defer conn.Close()
|
|
|
+ defer client.Close()
|
|
|
+
|
|
|
+ p, err := client.RealPath("../..")
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, "/", p)
|
|
|
+ p, err = client.RealPath("../test")
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, "/test", p)
|
|
|
+ subdir := "testsubdir"
|
|
|
+ err = client.Mkdir(subdir)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ linkName := testFileName + "_link"
|
|
|
+ err = client.Symlink(testFileName, path.Join(subdir, linkName))
|
|
|
+ assert.NoError(t, err)
|
|
|
+ p, err = client.RealPath(path.Join(subdir, linkName))
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, path.Join("/", testFileName), p)
|
|
|
+ // an existing path
|
|
|
+ sftpFile, err := client.OpenFile(testFileName, os.O_RDWR|os.O_CREATE|os.O_TRUNC)
|
|
|
+ if assert.NoError(t, err) {
|
|
|
+ testData := []byte("hello world")
|
|
|
+ n, err := sftpFile.WriteAt(testData, 0)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, len(testData), n)
|
|
|
+ }
|
|
|
+ p, err = client.RealPath(path.Join(subdir, linkName))
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, path.Join("/", testFileName), p)
|
|
|
+ // now a link outside the home dir
|
|
|
+ err = os.Symlink(filepath.Clean(os.TempDir()), filepath.Join(localUser.GetHomeDir(), subdir, "temp"))
|
|
|
+ assert.NoError(t, err)
|
|
|
+ _, err = client.RealPath(path.Join(subdir, "temp"))
|
|
|
+ assert.ErrorIs(t, err, os.ErrPermission)
|
|
|
+ err = os.Remove(filepath.Join(localUser.GetHomeDir(), subdir, "temp"))
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = os.RemoveAll(filepath.Join(localUser.GetHomeDir(), subdir))
|
|
|
+ assert.NoError(t, err)
|
|
|
+ }
|
|
|
}
|
|
|
- _, err = httpdtest.RemoveUser(user, http.StatusOK)
|
|
|
+ _, err = httpdtest.RemoveUser(sftpUser, http.StatusOK)
|
|
|
assert.NoError(t, err)
|
|
|
- err = os.RemoveAll(user.GetHomeDir())
|
|
|
+ _, err = httpdtest.RemoveUser(localUser, http.StatusOK)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = os.RemoveAll(localUser.GetHomeDir())
|
|
|
assert.NoError(t, err)
|
|
|
}
|
|
|
|
|
@@ -7138,13 +7185,15 @@ func TestPermList(t *testing.T) {
|
|
|
defer conn.Close()
|
|
|
defer client.Close()
|
|
|
_, err = client.ReadDir(".")
|
|
|
- assert.Error(t, err, "read remote dir without permission should not succeed")
|
|
|
+ assert.ErrorIs(t, err, os.ErrPermission, "read remote dir without permission should not succeed")
|
|
|
_, err = client.Stat("test_file")
|
|
|
- assert.Error(t, err, "stat remote file without permission should not succeed")
|
|
|
+ assert.ErrorIs(t, err, os.ErrPermission, "stat remote file without permission should not succeed")
|
|
|
_, err = client.Lstat("test_file")
|
|
|
- assert.Error(t, err, "lstat remote file without permission should not succeed")
|
|
|
+ assert.ErrorIs(t, err, os.ErrPermission, "lstat remote file without permission should not succeed")
|
|
|
_, err = client.ReadLink("test_link")
|
|
|
- assert.Error(t, err, "read remote link without permission on source dir should not succeed")
|
|
|
+ assert.ErrorIs(t, err, os.ErrPermission, "read remote link without permission on source dir should not succeed")
|
|
|
+ _, err = client.RealPath(".")
|
|
|
+ assert.ErrorIs(t, err, os.ErrPermission, "real path without permission should not succeed")
|
|
|
f, err := client.Create(testFileName)
|
|
|
if assert.NoError(t, err) {
|
|
|
_, err = f.Write([]byte("content"))
|