sftpd: fix relative symlinks handling

Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
This commit is contained in:
Nicola Murino
2022-09-30 19:23:54 +02:00
parent 1e21aa9453
commit 0e8c41bbd1
6 changed files with 101 additions and 24 deletions

View File

@@ -313,6 +313,71 @@ func TestBaseConnection(t *testing.T) {
assert.NoError(t, err)
}
func TestRelativeSymlinks(t *testing.T) {
u := getTestUser()
user, _, err := httpdtest.AddUser(u, http.StatusCreated)
assert.NoError(t, err)
err = os.RemoveAll(user.GetHomeDir())
assert.NoError(t, err)
conn, client, err := getSftpClient(user)
if assert.NoError(t, err) {
defer conn.Close()
defer client.Close()
linkName := testFileName + "_link"
err = client.Symlink("non-existent-file", linkName)
assert.NoError(t, err)
err = client.Remove(linkName)
assert.NoError(t, err)
testDir := "sub"
err = client.Mkdir(testDir)
assert.NoError(t, err)
f, err := client.Create(path.Join(testDir, testFileName))
assert.NoError(t, err)
_, err = f.Write(testFileContent)
assert.NoError(t, err)
err = f.Close()
assert.NoError(t, err)
err = client.Symlink(path.Join(testDir, testFileName), linkName)
assert.NoError(t, err)
_, err = client.Stat(linkName)
assert.NoError(t, err)
p, err := client.ReadLink(linkName)
assert.NoError(t, err)
assert.Equal(t, path.Join("/", testDir, testFileName), p)
err = client.Remove(linkName)
assert.NoError(t, err)
err = client.Symlink(testFileName, path.Join(testDir, linkName))
assert.NoError(t, err)
_, err = client.Stat(path.Join(testDir, linkName))
assert.NoError(t, err)
p, err = client.ReadLink(path.Join(testDir, linkName))
assert.NoError(t, err)
assert.Equal(t, path.Join("/", testDir, testFileName), p)
f, err = client.Create(testFileName)
assert.NoError(t, err)
_, err = f.Write(testFileContent)
assert.NoError(t, err)
err = f.Close()
assert.NoError(t, err)
err = client.Symlink(testFileName, linkName)
assert.NoError(t, err)
_, err = client.Stat(linkName)
assert.NoError(t, err)
p, err = client.ReadLink(linkName)
assert.NoError(t, err)
assert.Equal(t, path.Join("/", testFileName), p)
}
_, err = httpdtest.RemoveUser(user, http.StatusOK)
assert.NoError(t, err)
err = os.RemoveAll(user.GetHomeDir())
assert.NoError(t, err)
}
func TestCheckFsAfterUpdate(t *testing.T) {
u := getTestUser()
user, _, err := httpdtest.AddUser(u, http.StatusCreated)
@@ -2264,19 +2329,19 @@ func TestVirtualFoldersLink(t *testing.T) {
assert.NoError(t, err)
err = client.Symlink(path.Join(vdirPath2, testFileName), path.Join(vdirPath2, testDir, testFileName+".link"))
assert.NoError(t, err)
err = client.Symlink(testFileName, path.Join(vdirPath1, testFileName+".link1"))
err = client.Symlink(path.Join("/", testFileName), path.Join(vdirPath1, testFileName+".link1"))
if assert.Error(t, err) {
assert.Contains(t, err.Error(), "SSH_FX_OP_UNSUPPORTED")
}
err = client.Symlink(testFileName, path.Join(vdirPath1, testDir, testFileName+".link1"))
err = client.Symlink(path.Join("/", testFileName), path.Join(vdirPath1, testDir, testFileName+".link1"))
if assert.Error(t, err) {
assert.Contains(t, err.Error(), "SSH_FX_OP_UNSUPPORTED")
}
err = client.Symlink(testFileName, path.Join(vdirPath2, testFileName+".link1"))
err = client.Symlink(path.Join("/", testFileName), path.Join(vdirPath2, testFileName+".link1"))
if assert.Error(t, err) {
assert.Contains(t, err.Error(), "SSH_FX_OP_UNSUPPORTED")
}
err = client.Symlink(testFileName, path.Join(vdirPath2, testDir, testFileName+".link1"))
err = client.Symlink(path.Join("/", testFileName), path.Join(vdirPath2, testDir, testFileName+".link1"))
if assert.Error(t, err) {
assert.Contains(t, err.Error(), "SSH_FX_OP_UNSUPPORTED")
}