mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-06 22:30:56 +03:00
sftpd: add statvfs@openssh.com support
This commit is contained in:
@@ -456,6 +456,12 @@ func TestBasicSFTPFsHandling(t *testing.T) {
|
||||
assert.Equal(t, expectedQuotaFiles, user.UsedQuotaFiles)
|
||||
assert.Equal(t, expectedQuotaSize, user.UsedQuotaSize)
|
||||
|
||||
stat, err := client.StatVFS("/")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, uint64(u.QuotaSize/4096), stat.Blocks)
|
||||
assert.Equal(t, uint64((u.QuotaSize-testFileSize)/4096), stat.Bfree)
|
||||
assert.Equal(t, uint64(1), stat.Files-stat.Ffree)
|
||||
|
||||
err = os.Remove(testFilePath)
|
||||
assert.NoError(t, err)
|
||||
err = os.Remove(localDownloadPath)
|
||||
@@ -6371,6 +6377,136 @@ func TestGetVirtualFolderForPath(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestStatVFS(t *testing.T) {
|
||||
usePubKey := false
|
||||
user, _, err := httpdtest.AddUser(getTestUser(usePubKey), http.StatusCreated)
|
||||
assert.NoError(t, err)
|
||||
testFileSize := int64(65535)
|
||||
client, err := getSftpClient(user, usePubKey)
|
||||
if assert.NoError(t, err) {
|
||||
defer client.Close()
|
||||
|
||||
stat, err := client.StatVFS("/")
|
||||
assert.NoError(t, err)
|
||||
assert.Greater(t, stat.ID, uint32(0))
|
||||
assert.Greater(t, stat.Blocks, uint64(0))
|
||||
assert.Greater(t, stat.Bsize, uint64(0))
|
||||
|
||||
_, err = client.StatVFS("missing-path")
|
||||
assert.Error(t, err)
|
||||
assert.True(t, os.IsNotExist(err))
|
||||
}
|
||||
user.QuotaFiles = 100
|
||||
user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "")
|
||||
assert.NoError(t, err)
|
||||
client, err = getSftpClient(user, usePubKey)
|
||||
if assert.NoError(t, err) {
|
||||
defer client.Close()
|
||||
|
||||
testFilePath := filepath.Join(homeBasePath, testFileName)
|
||||
err = createTestFile(testFilePath, testFileSize)
|
||||
assert.NoError(t, err)
|
||||
err = sftpUploadFile(testFilePath, testFileName, testFileSize, client)
|
||||
assert.NoError(t, err)
|
||||
err = os.Remove(testFilePath)
|
||||
assert.NoError(t, err)
|
||||
|
||||
stat, err := client.StatVFS("/")
|
||||
assert.NoError(t, err)
|
||||
assert.Greater(t, stat.ID, uint32(0))
|
||||
assert.Greater(t, stat.Blocks, uint64(0))
|
||||
assert.Greater(t, stat.Bsize, uint64(0))
|
||||
assert.Equal(t, uint64(100), stat.Files)
|
||||
assert.Equal(t, uint64(99), stat.Ffree)
|
||||
}
|
||||
|
||||
user.QuotaSize = 8192
|
||||
user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "")
|
||||
assert.NoError(t, err)
|
||||
client, err = getSftpClient(user, usePubKey)
|
||||
if assert.NoError(t, err) {
|
||||
defer client.Close()
|
||||
|
||||
stat, err := client.StatVFS("/")
|
||||
assert.NoError(t, err)
|
||||
assert.Greater(t, stat.ID, uint32(0))
|
||||
assert.Greater(t, stat.Blocks, uint64(0))
|
||||
assert.Greater(t, stat.Bsize, uint64(0))
|
||||
assert.Equal(t, uint64(100), stat.Files)
|
||||
assert.Equal(t, uint64(0), stat.Ffree)
|
||||
assert.Equal(t, uint64(2), stat.Blocks)
|
||||
assert.Equal(t, uint64(0), stat.Bfree)
|
||||
}
|
||||
user.QuotaFiles = 0
|
||||
user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "")
|
||||
assert.NoError(t, err)
|
||||
client, err = getSftpClient(user, usePubKey)
|
||||
if assert.NoError(t, err) {
|
||||
defer client.Close()
|
||||
|
||||
stat, err := client.StatVFS("/")
|
||||
assert.NoError(t, err)
|
||||
assert.Greater(t, stat.ID, uint32(0))
|
||||
assert.Greater(t, stat.Blocks, uint64(0))
|
||||
assert.Greater(t, stat.Bsize, uint64(0))
|
||||
assert.Greater(t, stat.Files, uint64(0))
|
||||
assert.Equal(t, uint64(0), stat.Ffree)
|
||||
assert.Equal(t, uint64(2), stat.Blocks)
|
||||
assert.Equal(t, uint64(0), stat.Bfree)
|
||||
}
|
||||
|
||||
user.QuotaSize = 1
|
||||
user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "")
|
||||
assert.NoError(t, err)
|
||||
client, err = getSftpClient(user, usePubKey)
|
||||
if assert.NoError(t, err) {
|
||||
defer client.Close()
|
||||
|
||||
stat, err := client.StatVFS("/")
|
||||
assert.NoError(t, err)
|
||||
assert.Greater(t, stat.ID, uint32(0))
|
||||
assert.Equal(t, uint64(1), stat.Blocks)
|
||||
assert.Equal(t, uint64(1), stat.Bsize)
|
||||
assert.Greater(t, stat.Files, uint64(0))
|
||||
assert.Equal(t, uint64(0), stat.Ffree)
|
||||
assert.Equal(t, uint64(1), stat.Blocks)
|
||||
assert.Equal(t, uint64(0), stat.Bfree)
|
||||
}
|
||||
|
||||
_, err = httpdtest.RemoveUser(user, http.StatusOK)
|
||||
assert.NoError(t, err)
|
||||
err = os.RemoveAll(user.GetHomeDir())
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestStatVFSCloudBackend(t *testing.T) {
|
||||
usePubKey := true
|
||||
u := getTestUser(usePubKey)
|
||||
u.FsConfig.Provider = dataprovider.AzureBlobFilesystemProvider
|
||||
u.FsConfig.AzBlobConfig.SASURL = "https://myaccount.blob.core.windows.net/sasurl"
|
||||
user, _, err := httpdtest.AddUser(u, http.StatusCreated)
|
||||
assert.NoError(t, err)
|
||||
client, err := getSftpClient(user, usePubKey)
|
||||
if assert.NoError(t, err) {
|
||||
defer client.Close()
|
||||
|
||||
err = dataprovider.UpdateUserQuota(user, 100, 8192, true)
|
||||
assert.NoError(t, err)
|
||||
stat, err := client.StatVFS("/")
|
||||
assert.NoError(t, err)
|
||||
assert.Greater(t, stat.ID, uint32(0))
|
||||
assert.Greater(t, stat.Blocks, uint64(0))
|
||||
assert.Greater(t, stat.Bsize, uint64(0))
|
||||
assert.Equal(t, uint64(1000000+100), stat.Files)
|
||||
assert.Equal(t, uint64(2147483648+2), stat.Blocks)
|
||||
assert.Equal(t, uint64(1000000), stat.Ffree)
|
||||
assert.Equal(t, uint64(2147483648), stat.Bfree)
|
||||
}
|
||||
|
||||
_, err = httpdtest.RemoveUser(user, http.StatusOK)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestSSHCommands(t *testing.T) {
|
||||
usePubKey := false
|
||||
user, _, err := httpdtest.AddUser(getTestUser(usePubKey), http.StatusCreated)
|
||||
|
||||
Reference in New Issue
Block a user