12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208 |
- package common
- import (
- "io/ioutil"
- "os"
- "path"
- "path/filepath"
- "runtime"
- "testing"
- "time"
- "github.com/pkg/sftp"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- "github.com/drakkan/sftpgo/dataprovider"
- "github.com/drakkan/sftpgo/vfs"
- )
- // MockOsFs mockable OsFs
- type MockOsFs struct {
- vfs.Fs
- hasVirtualFolders bool
- }
- // Name returns the name for the Fs implementation
- func (fs MockOsFs) Name() string {
- return "mockOsFs"
- }
- // HasVirtualFolders returns true if folders are emulated
- func (fs MockOsFs) HasVirtualFolders() bool {
- return fs.hasVirtualFolders
- }
- func (fs MockOsFs) IsUploadResumeSupported() bool {
- return !fs.hasVirtualFolders
- }
- func newMockOsFs(hasVirtualFolders bool, connectionID, rootDir string) vfs.Fs {
- return &MockOsFs{
- Fs: vfs.NewOsFs(connectionID, rootDir, nil),
- hasVirtualFolders: hasVirtualFolders,
- }
- }
- func TestListDir(t *testing.T) {
- user := dataprovider.User{
- Username: userTestUsername,
- HomeDir: filepath.Join(os.TempDir(), "home"),
- }
- mappedPath := filepath.Join(os.TempDir(), "vdir")
- user.Permissions = make(map[string][]string)
- user.Permissions["/"] = []string{dataprovider.PermUpload}
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath,
- },
- VirtualPath: "/vdir",
- })
- err := os.Mkdir(user.GetHomeDir(), os.ModePerm)
- assert.NoError(t, err)
- fs, err := user.GetFilesystem("")
- assert.NoError(t, err)
- c := NewBaseConnection("", ProtocolSFTP, user, fs)
- _, err = c.ListDir(user.GetHomeDir(), "/")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- c.User.Permissions["/"] = []string{dataprovider.PermAny}
- files, err := c.ListDir(user.GetHomeDir(), "/")
- if assert.NoError(t, err) {
- vdirFound := false
- for _, f := range files {
- if f.Name() == "vdir" {
- vdirFound = true
- break
- }
- }
- assert.True(t, vdirFound)
- }
- _, err = c.ListDir(mappedPath, "/vdir")
- assert.Error(t, err)
- err = os.RemoveAll(user.GetHomeDir())
- assert.NoError(t, err)
- }
- func TestCreateDir(t *testing.T) {
- user := dataprovider.User{
- Username: userTestUsername,
- HomeDir: filepath.Join(os.TempDir(), "home"),
- }
- mappedPath := filepath.Join(os.TempDir(), "vdir")
- user.Permissions = make(map[string][]string)
- user.Permissions["/"] = []string{dataprovider.PermAny}
- user.Permissions["/sub"] = []string{dataprovider.PermListItems}
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath,
- },
- VirtualPath: "/vdir",
- })
- err := os.Mkdir(user.GetHomeDir(), os.ModePerm)
- assert.NoError(t, err)
- fs, err := user.GetFilesystem("")
- assert.NoError(t, err)
- c := NewBaseConnection("", ProtocolSFTP, user, fs)
- err = c.CreateDir("", "/sub/dir")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.CreateDir("", "/vdir")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.CreateDir(filepath.Join(mappedPath, "adir"), "/vdir/adir")
- assert.Error(t, err)
- err = c.CreateDir(filepath.Join(user.GetHomeDir(), "dir"), "/dir")
- assert.NoError(t, err)
- err = os.RemoveAll(user.GetHomeDir())
- assert.NoError(t, err)
- }
- func TestRemoveFile(t *testing.T) {
- user := dataprovider.User{
- Username: userTestUsername,
- HomeDir: filepath.Join(os.TempDir(), "home"),
- }
- mappedPath := filepath.Join(os.TempDir(), "vdir")
- user.Permissions = make(map[string][]string)
- user.Permissions["/"] = []string{dataprovider.PermAny}
- user.Permissions["/sub"] = []string{dataprovider.PermListItems}
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath,
- },
- VirtualPath: "/vdir",
- QuotaFiles: -1,
- QuotaSize: -1,
- })
- user.Filters.FileExtensions = []dataprovider.ExtensionsFilter{
- {
- Path: "/p",
- AllowedExtensions: []string{},
- DeniedExtensions: []string{".zip"},
- },
- }
- err := os.Mkdir(user.GetHomeDir(), os.ModePerm)
- assert.NoError(t, err)
- err = os.Mkdir(mappedPath, os.ModePerm)
- assert.NoError(t, err)
- fs, err := user.GetFilesystem("")
- assert.NoError(t, err)
- c := NewBaseConnection("", ProtocolSFTP, user, fs)
- err = c.RemoveFile("", "/sub/file", nil)
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.RemoveFile("", "/p/file.zip", nil)
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- testFile := filepath.Join(mappedPath, "afile")
- err = ioutil.WriteFile(testFile, []byte("test data"), os.ModePerm)
- assert.NoError(t, err)
- info, err := os.Stat(testFile)
- assert.NoError(t, err)
- err = c.RemoveFile(filepath.Join(user.GetHomeDir(), "missing"), "/missing", info)
- assert.Error(t, err)
- err = c.RemoveFile(testFile, "/vdir/afile", info)
- assert.NoError(t, err)
- err = os.RemoveAll(mappedPath)
- assert.NoError(t, err)
- err = os.RemoveAll(user.GetHomeDir())
- assert.NoError(t, err)
- }
- func TestRemoveDir(t *testing.T) {
- user := dataprovider.User{
- Username: userTestUsername,
- HomeDir: filepath.Join(os.TempDir(), "home"),
- }
- mappedPath := filepath.Join(os.TempDir(), "vdir")
- user.Permissions = make(map[string][]string)
- user.Permissions["/"] = []string{dataprovider.PermAny}
- user.Permissions["/sub"] = []string{dataprovider.PermListItems}
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath,
- },
- VirtualPath: "/adir/vdir",
- })
- err := os.Mkdir(user.GetHomeDir(), os.ModePerm)
- assert.NoError(t, err)
- err = os.Mkdir(mappedPath, os.ModePerm)
- assert.NoError(t, err)
- fs, err := user.GetFilesystem("")
- assert.NoError(t, err)
- c := NewBaseConnection("", ProtocolSFTP, user, fs)
- err = c.RemoveDir(user.GetHomeDir(), "/")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.RemoveDir(mappedPath, "/adir/vdir")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.RemoveDir(mappedPath, "/adir")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetOpUnsupportedError().Error())
- }
- err = c.RemoveDir(mappedPath, "/adir/dir")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.RemoveDir(filepath.Join(user.GetHomeDir(), "/sub/dir"), "/sub/dir")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- testDir := filepath.Join(user.GetHomeDir(), "testDir")
- err = c.RemoveDir(testDir, "testDir")
- assert.Error(t, err)
- err = ioutil.WriteFile(testDir, []byte("data"), os.ModePerm)
- assert.NoError(t, err)
- err = c.RemoveDir(testDir, "testDir")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetGenericError(err).Error())
- }
- err = os.Remove(testDir)
- assert.NoError(t, err)
- testDirSub := filepath.Join(testDir, "sub")
- err = os.MkdirAll(testDirSub, os.ModePerm)
- assert.NoError(t, err)
- err = c.RemoveDir(testDir, "/testDir")
- assert.Error(t, err)
- err = os.RemoveAll(testDirSub)
- assert.NoError(t, err)
- err = c.RemoveDir(testDir, "/testDir")
- assert.NoError(t, err)
- err = c.RemoveDir(testDir, "/testDir")
- assert.Error(t, err)
- fs = newMockOsFs(true, "", user.GetHomeDir())
- c.Fs = fs
- err = c.RemoveDir(testDir, "/testDir")
- assert.NoError(t, err)
- err = os.RemoveAll(mappedPath)
- assert.NoError(t, err)
- err = os.RemoveAll(user.GetHomeDir())
- assert.NoError(t, err)
- }
- func TestRename(t *testing.T) {
- user := dataprovider.User{
- Username: userTestUsername,
- HomeDir: filepath.Join(os.TempDir(), "home"),
- QuotaSize: 10485760,
- }
- mappedPath1 := filepath.Join(os.TempDir(), "vdir1")
- mappedPath2 := filepath.Join(os.TempDir(), "vdir2")
- user.Permissions = make(map[string][]string)
- user.Permissions["/"] = []string{dataprovider.PermAny}
- user.Permissions["/sub"] = []string{dataprovider.PermListItems}
- user.Permissions["/sub1"] = []string{dataprovider.PermRename}
- user.Permissions["/dir"] = []string{dataprovider.PermListItems}
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath1,
- },
- VirtualPath: "/vdir1/sub",
- QuotaFiles: -1,
- QuotaSize: -1,
- })
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath2,
- },
- VirtualPath: "/vdir2",
- QuotaFiles: -1,
- QuotaSize: -1,
- })
- err := os.MkdirAll(filepath.Join(user.GetHomeDir(), "sub"), os.ModePerm)
- assert.NoError(t, err)
- err = os.MkdirAll(filepath.Join(user.GetHomeDir(), "dir", "sub"), os.ModePerm)
- assert.NoError(t, err)
- err = os.Mkdir(mappedPath1, os.ModePerm)
- assert.NoError(t, err)
- err = os.Mkdir(mappedPath2, os.ModePerm)
- assert.NoError(t, err)
- fs, err := user.GetFilesystem("")
- assert.NoError(t, err)
- c := NewBaseConnection("", ProtocolSFTP, user, fs)
- err = c.Rename(mappedPath1, "", "", "")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.Rename("", mappedPath2, "", "")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.Rename("missing", "", "", "")
- assert.Error(t, err)
- testFile := filepath.Join(user.GetHomeDir(), "file")
- err = ioutil.WriteFile(testFile, []byte("data"), os.ModePerm)
- assert.NoError(t, err)
- testSubFile := filepath.Join(user.GetHomeDir(), "sub", "file")
- err = ioutil.WriteFile(testSubFile, []byte("data"), os.ModePerm)
- assert.NoError(t, err)
- err = c.Rename(testSubFile, filepath.Join(user.GetHomeDir(), "file"), "/sub/file", "/file")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.Rename(testFile, filepath.Join(user.GetHomeDir(), "sub"), "/file", "/sub")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetOpUnsupportedError().Error())
- }
- err = c.Rename(testSubFile, testFile, "/file", "/sub1/file")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.Rename(filepath.Join(user.GetHomeDir(), "sub"), filepath.Join(user.GetHomeDir(), "adir"), "/vdir1", "/adir")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetOpUnsupportedError().Error())
- }
- err = c.Rename(filepath.Join(user.GetHomeDir(), "dir"), filepath.Join(user.GetHomeDir(), "adir"), "/dir", "/adir")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = os.MkdirAll(filepath.Join(user.GetHomeDir(), "testdir"), os.ModePerm)
- assert.NoError(t, err)
- err = c.Rename(filepath.Join(user.GetHomeDir(), "testdir"), filepath.Join(user.GetHomeDir(), "tdir", "sub"), "/testdir", "/tdir/sub")
- assert.Error(t, err)
- err = os.Remove(testSubFile)
- assert.NoError(t, err)
- err = c.Rename(filepath.Join(user.GetHomeDir(), "sub"), filepath.Join(user.GetHomeDir(), "adir"), "/sub", "/adir")
- assert.NoError(t, err)
- err = os.MkdirAll(filepath.Join(user.GetHomeDir(), "adir"), os.ModePerm)
- assert.NoError(t, err)
- err = ioutil.WriteFile(filepath.Join(user.GetHomeDir(), "adir", "file"), []byte("data"), os.ModePerm)
- assert.NoError(t, err)
- err = c.Rename(filepath.Join(user.GetHomeDir(), "adir", "file"), filepath.Join(user.GetHomeDir(), "file"), "/adir/file", "/file")
- assert.NoError(t, err)
- // rename between virtual folder this should fail since the virtual folder is not found inside the data provider
- // and so the remaining space cannot be computed
- err = c.Rename(filepath.Join(user.GetHomeDir(), "adir"), filepath.Join(user.GetHomeDir(), "another"), "/vdir1/sub/a", "/vdir2/b")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetGenericError(err).Error())
- }
- err = os.RemoveAll(mappedPath1)
- assert.NoError(t, err)
- err = os.RemoveAll(mappedPath2)
- assert.NoError(t, err)
- err = os.RemoveAll(user.GetHomeDir())
- assert.NoError(t, err)
- }
- func TestCreateSymlink(t *testing.T) {
- user := dataprovider.User{
- Username: userTestUsername,
- HomeDir: filepath.Join(os.TempDir(), "home"),
- }
- mappedPath1 := filepath.Join(os.TempDir(), "vdir1")
- mappedPath2 := filepath.Join(os.TempDir(), "vdir2")
- user.Permissions = make(map[string][]string)
- user.Permissions["/"] = []string{dataprovider.PermAny}
- user.Permissions["/sub"] = []string{dataprovider.PermListItems}
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath1,
- },
- VirtualPath: "/vdir1",
- QuotaFiles: -1,
- QuotaSize: -1,
- })
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath2,
- },
- VirtualPath: "/vdir2",
- QuotaFiles: -1,
- QuotaSize: -1,
- })
- err := os.Mkdir(user.GetHomeDir(), os.ModePerm)
- assert.NoError(t, err)
- err = os.Mkdir(mappedPath1, os.ModePerm)
- assert.NoError(t, err)
- err = os.Mkdir(mappedPath2, os.ModePerm)
- assert.NoError(t, err)
- fs, err := user.GetFilesystem("")
- assert.NoError(t, err)
- c := NewBaseConnection("", ProtocolSFTP, user, fs)
- err = c.CreateSymlink(user.GetHomeDir(), mappedPath1, "/", "/vdir1")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.CreateSymlink(filepath.Join(user.GetHomeDir(), "a"), mappedPath1, "/a", "/vdir1")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.CreateSymlink(filepath.Join(user.GetHomeDir(), "b"), mappedPath1, "/b", "/sub/b")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.CreateSymlink(filepath.Join(user.GetHomeDir(), "b"), mappedPath1, "/vdir1/b", "/vdir2/b")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetOpUnsupportedError().Error())
- }
- err = c.CreateSymlink(mappedPath1, filepath.Join(mappedPath1, "b"), "/vdir1/a", "/vdir1/b")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.CreateSymlink(filepath.Join(mappedPath1, "b"), mappedPath1, "/vdir1/a", "/vdir1/b")
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = os.Mkdir(filepath.Join(user.GetHomeDir(), "b"), os.ModePerm)
- assert.NoError(t, err)
- err = c.CreateSymlink(filepath.Join(user.GetHomeDir(), "b"), filepath.Join(user.GetHomeDir(), "c"), "/b", "/c")
- assert.NoError(t, err)
- err = c.CreateSymlink(filepath.Join(user.GetHomeDir(), "b"), filepath.Join(user.GetHomeDir(), "c"), "/b", "/c")
- assert.Error(t, err)
- err = os.RemoveAll(mappedPath1)
- assert.NoError(t, err)
- err = os.RemoveAll(mappedPath2)
- assert.NoError(t, err)
- err = os.RemoveAll(user.GetHomeDir())
- assert.NoError(t, err)
- }
- func TestDoStat(t *testing.T) {
- testFile := filepath.Join(os.TempDir(), "afile.txt")
- fs := vfs.NewOsFs("123", os.TempDir(), nil)
- u := dataprovider.User{
- Username: "user",
- HomeDir: os.TempDir(),
- }
- u.Permissions = make(map[string][]string)
- u.Permissions["/"] = []string{dataprovider.PermAny}
- err := ioutil.WriteFile(testFile, []byte("data"), os.ModePerm)
- require.NoError(t, err)
- err = os.Symlink(testFile, testFile+".sym")
- require.NoError(t, err)
- conn := NewBaseConnection(fs.ConnectionID(), ProtocolSFTP, u, fs)
- infoStat, err := conn.DoStat(testFile+".sym", 0)
- if assert.NoError(t, err) {
- assert.Equal(t, int64(4), infoStat.Size())
- }
- infoLstat, err := conn.DoStat(testFile+".sym", 1)
- if assert.NoError(t, err) {
- assert.NotEqual(t, int64(4), infoLstat.Size())
- }
- assert.False(t, os.SameFile(infoStat, infoLstat))
- err = os.Remove(testFile)
- assert.NoError(t, err)
- err = os.Remove(testFile + ".sym")
- assert.NoError(t, err)
- assert.Len(t, conn.GetTransfers(), 0)
- }
- func TestSetStat(t *testing.T) {
- oldSetStatMode := Config.SetstatMode
- Config.SetstatMode = 1
- user := dataprovider.User{
- Username: userTestUsername,
- HomeDir: filepath.Join(os.TempDir(), "home"),
- }
- user.Permissions = make(map[string][]string)
- user.Permissions["/"] = []string{dataprovider.PermAny}
- user.Permissions["/dir1"] = []string{dataprovider.PermChmod}
- user.Permissions["/dir2"] = []string{dataprovider.PermChown}
- user.Permissions["/dir3"] = []string{dataprovider.PermChtimes}
- dir1 := filepath.Join(user.GetHomeDir(), "dir1")
- dir2 := filepath.Join(user.GetHomeDir(), "dir2")
- dir3 := filepath.Join(user.GetHomeDir(), "dir3")
- err := os.Mkdir(user.GetHomeDir(), os.ModePerm)
- assert.NoError(t, err)
- err = os.Mkdir(dir1, os.ModePerm)
- assert.NoError(t, err)
- err = os.Mkdir(dir2, os.ModePerm)
- assert.NoError(t, err)
- err = os.Mkdir(dir3, os.ModePerm)
- assert.NoError(t, err)
- fs, err := user.GetFilesystem("")
- assert.NoError(t, err)
- c := NewBaseConnection("", ProtocolSFTP, user, fs)
- err = c.SetStat(user.GetHomeDir(), "/", &StatAttributes{})
- assert.NoError(t, err)
- Config.SetstatMode = oldSetStatMode
- // chmod
- err = c.SetStat(dir1, "/dir1/file", &StatAttributes{
- Mode: os.ModePerm,
- Flags: StatAttrPerms,
- })
- assert.NoError(t, err)
- err = c.SetStat(dir2, "/dir2/file", &StatAttributes{
- Mode: os.ModePerm,
- Flags: StatAttrPerms,
- })
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.SetStat(filepath.Join(user.GetHomeDir(), "missing"), "/missing", &StatAttributes{
- Mode: os.ModePerm,
- Flags: StatAttrPerms,
- })
- assert.Error(t, err)
- // chown
- if runtime.GOOS != osWindows {
- err = c.SetStat(dir1, "/dir2/file", &StatAttributes{
- UID: os.Getuid(),
- GID: os.Getgid(),
- Flags: StatAttrUIDGID,
- })
- assert.NoError(t, err)
- }
- err = c.SetStat(dir1, "/dir3/file", &StatAttributes{
- UID: os.Getuid(),
- GID: os.Getgid(),
- Flags: StatAttrUIDGID,
- })
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.SetStat(filepath.Join(user.GetHomeDir(), "missing"), "/missing", &StatAttributes{
- UID: os.Getuid(),
- GID: os.Getgid(),
- Flags: StatAttrUIDGID,
- })
- assert.Error(t, err)
- // chtimes
- err = c.SetStat(dir1, "/dir3/file", &StatAttributes{
- Atime: time.Now(),
- Mtime: time.Now(),
- Flags: StatAttrTimes,
- })
- assert.NoError(t, err)
- err = c.SetStat(dir1, "/dir1/file", &StatAttributes{
- Atime: time.Now(),
- Mtime: time.Now(),
- Flags: StatAttrTimes,
- })
- if assert.Error(t, err) {
- assert.EqualError(t, err, c.GetPermissionDeniedError().Error())
- }
- err = c.SetStat(filepath.Join(user.GetHomeDir(), "missing"), "/missing", &StatAttributes{
- Atime: time.Now(),
- Mtime: time.Now(),
- Flags: StatAttrTimes,
- })
- assert.Error(t, err)
- // truncate
- err = c.SetStat(filepath.Join(user.GetHomeDir(), "/missing/missing"), "/missing/missing", &StatAttributes{
- Size: 1,
- Flags: StatAttrSize,
- })
- assert.Error(t, err)
- err = c.SetStat(filepath.Join(dir3, "afile.txt"), "/dir3/afile.txt", &StatAttributes{
- Size: 1,
- Flags: StatAttrSize,
- })
- assert.Error(t, err)
- filePath := filepath.Join(user.GetHomeDir(), "afile.txt")
- err = ioutil.WriteFile(filePath, []byte("hello"), os.ModePerm)
- assert.NoError(t, err)
- err = c.SetStat(filePath, "/afile.txt", &StatAttributes{
- Flags: StatAttrSize,
- Size: 1,
- })
- assert.NoError(t, err)
- fi, err := os.Stat(filePath)
- if assert.NoError(t, err) {
- assert.Equal(t, int64(1), fi.Size())
- }
- vDir := filepath.Join(os.TempDir(), "vdir")
- err = os.MkdirAll(vDir, os.ModePerm)
- assert.NoError(t, err)
- c.User.VirtualFolders = nil
- c.User.VirtualFolders = append(c.User.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: vDir,
- },
- VirtualPath: "/vpath",
- QuotaSize: -1,
- QuotaFiles: -1,
- })
- filePath = filepath.Join(vDir, "afile.txt")
- err = ioutil.WriteFile(filePath, []byte("hello"), os.ModePerm)
- assert.NoError(t, err)
- err = c.SetStat(filePath, "/vpath/afile.txt", &StatAttributes{
- Flags: StatAttrSize,
- Size: 1,
- })
- assert.NoError(t, err)
- fi, err = os.Stat(filePath)
- if assert.NoError(t, err) {
- assert.Equal(t, int64(1), fi.Size())
- }
- err = os.RemoveAll(user.GetHomeDir())
- assert.NoError(t, err)
- err = os.RemoveAll(vDir)
- assert.NoError(t, err)
- }
- func TestSpaceForCrossRename(t *testing.T) {
- permissions := make(map[string][]string)
- permissions["/"] = []string{dataprovider.PermAny}
- user := dataprovider.User{
- Username: userTestUsername,
- Permissions: permissions,
- HomeDir: filepath.Clean(os.TempDir()),
- }
- fs, err := user.GetFilesystem("123")
- assert.NoError(t, err)
- conn := NewBaseConnection("", ProtocolSFTP, user, fs)
- quotaResult := vfs.QuotaCheckResult{
- HasSpace: true,
- }
- assert.False(t, conn.hasSpaceForCrossRename(quotaResult, -1, filepath.Join(os.TempDir(), "a missing file")))
- if runtime.GOOS != osWindows {
- testDir := filepath.Join(os.TempDir(), "dir")
- err = os.MkdirAll(testDir, os.ModePerm)
- assert.NoError(t, err)
- err = ioutil.WriteFile(filepath.Join(testDir, "afile.txt"), []byte("content"), os.ModePerm)
- assert.NoError(t, err)
- err = os.Chmod(testDir, 0001)
- assert.NoError(t, err)
- assert.False(t, conn.hasSpaceForCrossRename(quotaResult, -1, testDir))
- err = os.Chmod(testDir, os.ModePerm)
- assert.NoError(t, err)
- err = os.RemoveAll(testDir)
- assert.NoError(t, err)
- }
- testFile := filepath.Join(os.TempDir(), "afile.txt")
- err = ioutil.WriteFile(testFile, []byte("test data"), os.ModePerm)
- assert.NoError(t, err)
- quotaResult = vfs.QuotaCheckResult{
- HasSpace: false,
- QuotaSize: 0,
- }
- assert.True(t, conn.hasSpaceForCrossRename(quotaResult, 123, testFile))
- quotaResult = vfs.QuotaCheckResult{
- HasSpace: false,
- QuotaSize: 124,
- UsedSize: 125,
- }
- assert.False(t, conn.hasSpaceForCrossRename(quotaResult, 8, testFile))
- quotaResult = vfs.QuotaCheckResult{
- HasSpace: false,
- QuotaSize: 124,
- UsedSize: 124,
- }
- assert.True(t, conn.hasSpaceForCrossRename(quotaResult, 123, testFile))
- quotaResult = vfs.QuotaCheckResult{
- HasSpace: true,
- QuotaSize: 10,
- UsedSize: 1,
- }
- assert.True(t, conn.hasSpaceForCrossRename(quotaResult, -1, testFile))
- quotaResult = vfs.QuotaCheckResult{
- HasSpace: true,
- QuotaSize: 7,
- UsedSize: 0,
- }
- assert.False(t, conn.hasSpaceForCrossRename(quotaResult, -1, testFile))
- err = os.Remove(testFile)
- assert.NoError(t, err)
- testDir := filepath.Join(os.TempDir(), "testDir")
- err = os.MkdirAll(testDir, os.ModePerm)
- assert.NoError(t, err)
- err = ioutil.WriteFile(filepath.Join(testDir, "1"), []byte("1"), os.ModePerm)
- assert.NoError(t, err)
- err = ioutil.WriteFile(filepath.Join(testDir, "2"), []byte("2"), os.ModePerm)
- assert.NoError(t, err)
- quotaResult = vfs.QuotaCheckResult{
- HasSpace: true,
- QuotaFiles: 2,
- UsedFiles: 1,
- }
- assert.False(t, conn.hasSpaceForCrossRename(quotaResult, -1, testDir))
- quotaResult = vfs.QuotaCheckResult{
- HasSpace: true,
- QuotaFiles: 2,
- UsedFiles: 0,
- }
- assert.True(t, conn.hasSpaceForCrossRename(quotaResult, -1, testDir))
- err = os.RemoveAll(testDir)
- assert.NoError(t, err)
- }
- func TestRenamePermission(t *testing.T) {
- permissions := make(map[string][]string)
- permissions["/"] = []string{dataprovider.PermAny}
- permissions["/dir1"] = []string{dataprovider.PermRename}
- permissions["/dir2"] = []string{dataprovider.PermUpload}
- permissions["/dir3"] = []string{dataprovider.PermDelete}
- permissions["/dir4"] = []string{dataprovider.PermListItems}
- permissions["/dir5"] = []string{dataprovider.PermCreateDirs, dataprovider.PermUpload}
- permissions["/dir6"] = []string{dataprovider.PermCreateDirs, dataprovider.PermUpload,
- dataprovider.PermListItems, dataprovider.PermCreateSymlinks}
- permissions["/dir7"] = []string{dataprovider.PermAny}
- permissions["/dir8"] = []string{dataprovider.PermAny}
- user := dataprovider.User{
- Username: userTestUsername,
- Permissions: permissions,
- HomeDir: os.TempDir(),
- }
- fs, err := user.GetFilesystem("123")
- assert.NoError(t, err)
- conn := NewBaseConnection("", ProtocolSFTP, user, fs)
- request := sftp.NewRequest("Rename", "/testfile")
- request.Target = "/dir1/testfile"
- // rename is granted on Source and Target
- assert.True(t, conn.isRenamePermitted("", request.Filepath, request.Target, nil))
- request.Target = "/dir4/testfile"
- // rename is not granted on Target
- assert.False(t, conn.isRenamePermitted("", request.Filepath, request.Target, nil))
- request = sftp.NewRequest("Rename", "/dir1/testfile")
- request.Target = "/dir2/testfile" //nolint:goconst
- // rename is granted on Source but not on Target
- assert.False(t, conn.isRenamePermitted("", request.Filepath, request.Target, nil))
- request = sftp.NewRequest("Rename", "/dir4/testfile")
- request.Target = "/dir1/testfile"
- // rename is granted on Target but not on Source
- assert.False(t, conn.isRenamePermitted("", request.Filepath, request.Target, nil))
- request = sftp.NewRequest("Rename", "/dir4/testfile")
- request.Target = "/testfile"
- // rename is granted on Target but not on Source
- assert.False(t, conn.isRenamePermitted("", request.Filepath, request.Target, nil))
- request = sftp.NewRequest("Rename", "/dir3/testfile")
- request.Target = "/dir2/testfile"
- // delete is granted on Source and Upload on Target, the target is a file this is enough
- assert.True(t, conn.isRenamePermitted("", request.Filepath, request.Target, nil))
- request = sftp.NewRequest("Rename", "/dir2/testfile")
- request.Target = "/dir3/testfile"
- assert.False(t, conn.isRenamePermitted("", request.Filepath, request.Target, nil))
- tmpDir := filepath.Join(os.TempDir(), "dir")
- tmpDirLink := filepath.Join(os.TempDir(), "link")
- err = os.Mkdir(tmpDir, os.ModePerm)
- assert.NoError(t, err)
- err = os.Symlink(tmpDir, tmpDirLink)
- assert.NoError(t, err)
- request.Filepath = "/dir"
- request.Target = "/dir2/dir"
- // the source is a dir and the target has no createDirs perm
- info, err := os.Lstat(tmpDir)
- if assert.NoError(t, err) {
- assert.False(t, conn.isRenamePermitted(tmpDir, request.Filepath, request.Target, info))
- conn.User.Permissions["/dir2"] = []string{dataprovider.PermUpload, dataprovider.PermCreateDirs}
- // the source is a dir and the target has createDirs perm
- assert.True(t, conn.isRenamePermitted(tmpDir, request.Filepath, request.Target, info))
- request = sftp.NewRequest("Rename", "/testfile")
- request.Target = "/dir5/testfile"
- // the source is a dir and the target has createDirs and upload perm
- assert.True(t, conn.isRenamePermitted(tmpDir, request.Filepath, request.Target, info))
- }
- info, err = os.Lstat(tmpDirLink)
- if assert.NoError(t, err) {
- assert.True(t, info.Mode()&os.ModeSymlink == os.ModeSymlink)
- // the source is a symlink and the target has createDirs and upload perm
- assert.False(t, conn.isRenamePermitted(tmpDir, request.Filepath, request.Target, info))
- }
- err = os.RemoveAll(tmpDir)
- assert.NoError(t, err)
- err = os.Remove(tmpDirLink)
- assert.NoError(t, err)
- conn.User.VirtualFolders = append(conn.User.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: os.TempDir(),
- },
- VirtualPath: "/dir1",
- })
- request = sftp.NewRequest("Rename", "/dir1")
- request.Target = "/dir2/testfile"
- // renaming a virtual folder is not allowed
- assert.False(t, conn.isRenamePermitted("", request.Filepath, request.Target, nil))
- err = conn.checkRecursiveRenameDirPermissions("invalid", "invalid")
- assert.Error(t, err)
- dir3 := filepath.Join(conn.User.HomeDir, "dir3")
- dir6 := filepath.Join(conn.User.HomeDir, "dir6")
- err = os.MkdirAll(filepath.Join(dir3, "subdir"), os.ModePerm)
- assert.NoError(t, err)
- err = ioutil.WriteFile(filepath.Join(dir3, "subdir", "testfile"), []byte("test"), os.ModePerm)
- assert.NoError(t, err)
- err = conn.checkRecursiveRenameDirPermissions(dir3, dir6)
- assert.NoError(t, err)
- err = os.RemoveAll(dir3)
- assert.NoError(t, err)
- dir7 := filepath.Join(conn.User.HomeDir, "dir7")
- dir8 := filepath.Join(conn.User.HomeDir, "dir8")
- err = os.MkdirAll(filepath.Join(dir8, "subdir"), os.ModePerm)
- assert.NoError(t, err)
- err = ioutil.WriteFile(filepath.Join(dir8, "subdir", "testfile"), []byte("test"), os.ModePerm)
- assert.NoError(t, err)
- err = conn.checkRecursiveRenameDirPermissions(dir8, dir7)
- assert.NoError(t, err)
- err = os.RemoveAll(dir8)
- assert.NoError(t, err)
- assert.False(t, conn.isRenamePermitted(user.GetHomeDir(), "", "", nil))
- conn.User.Filters.FileExtensions = []dataprovider.ExtensionsFilter{
- {
- Path: "/p",
- AllowedExtensions: []string{},
- DeniedExtensions: []string{".zip"},
- },
- }
- testFile := filepath.Join(user.HomeDir, "testfile")
- err = ioutil.WriteFile(testFile, []byte("data"), os.ModePerm)
- assert.NoError(t, err)
- info, err = os.Stat(testFile)
- assert.NoError(t, err)
- assert.False(t, conn.isRenamePermitted(dir7, "/file", "/p/file.zip", info))
- err = os.Remove(testFile)
- assert.NoError(t, err)
- }
- func TestHasSpaceForRename(t *testing.T) {
- err := closeDataprovider()
- assert.NoError(t, err)
- _, err = initializeDataprovider(0)
- assert.NoError(t, err)
- user := dataprovider.User{
- Username: userTestUsername,
- HomeDir: filepath.Join(os.TempDir(), "home"),
- }
- mappedPath := filepath.Join(os.TempDir(), "vdir")
- user.Permissions = make(map[string][]string)
- user.Permissions["/"] = []string{dataprovider.PermAny}
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath,
- },
- VirtualPath: "/vdir1",
- })
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath,
- },
- VirtualPath: "/vdir2",
- QuotaSize: -1,
- QuotaFiles: -1,
- })
- fs, err := user.GetFilesystem("id")
- assert.NoError(t, err)
- c := NewBaseConnection("", ProtocolSFTP, user, fs)
- // with quota tracking disabled hasSpaceForRename will always return true
- assert.True(t, c.hasSpaceForRename("", "", 0, ""))
- quotaResult := c.HasSpace(true, "")
- assert.True(t, quotaResult.HasSpace)
- err = closeDataprovider()
- assert.NoError(t, err)
- _, err = initializeDataprovider(-1)
- assert.NoError(t, err)
- // rename inside the same mapped path
- assert.True(t, c.hasSpaceForRename("/vdir1/file", "/vdir2/file", 0, filepath.Join(mappedPath, "file")))
- // rename between user root dir and a virtual folder included in user quota
- assert.True(t, c.hasSpaceForRename("/file", "/vdir2/file", 0, filepath.Join(mappedPath, "file")))
- assert.True(t, c.isCrossFoldersRequest("/file", "/vdir2/file"))
- }
- func TestUpdateQuotaAfterRename(t *testing.T) {
- user := dataprovider.User{
- Username: userTestUsername,
- HomeDir: filepath.Join(os.TempDir(), "home"),
- }
- mappedPath := filepath.Join(os.TempDir(), "vdir")
- user.Permissions = make(map[string][]string)
- user.Permissions["/"] = []string{dataprovider.PermAny}
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath,
- },
- VirtualPath: "/vdir",
- QuotaFiles: -1,
- QuotaSize: -1,
- })
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath,
- },
- VirtualPath: "/vdir1",
- QuotaFiles: -1,
- QuotaSize: -1,
- })
- err := os.MkdirAll(user.GetHomeDir(), os.ModePerm)
- assert.NoError(t, err)
- err = os.MkdirAll(mappedPath, os.ModePerm)
- assert.NoError(t, err)
- fs, err := user.GetFilesystem("id")
- assert.NoError(t, err)
- c := NewBaseConnection("", ProtocolSFTP, user, fs)
- request := sftp.NewRequest("Rename", "/testfile")
- if runtime.GOOS != osWindows {
- request.Filepath = "/dir"
- request.Target = path.Join("/vdir", "dir")
- testDirPath := filepath.Join(mappedPath, "dir")
- err := os.MkdirAll(testDirPath, os.ModePerm)
- assert.NoError(t, err)
- err = os.Chmod(testDirPath, 0001)
- assert.NoError(t, err)
- err = c.updateQuotaAfterRename(request.Filepath, request.Target, testDirPath, 0)
- assert.Error(t, err)
- err = os.Chmod(testDirPath, os.ModePerm)
- assert.NoError(t, err)
- }
- testFile1 := "/testfile1"
- request.Target = testFile1
- request.Filepath = path.Join("/vdir", "file")
- err = c.updateQuotaAfterRename(request.Filepath, request.Target, filepath.Join(mappedPath, "file"), 0)
- assert.Error(t, err)
- err = ioutil.WriteFile(filepath.Join(mappedPath, "file"), []byte("test content"), os.ModePerm)
- assert.NoError(t, err)
- request.Filepath = testFile1
- request.Target = path.Join("/vdir", "file")
- err = c.updateQuotaAfterRename(request.Filepath, request.Target, filepath.Join(mappedPath, "file"), 12)
- assert.NoError(t, err)
- err = ioutil.WriteFile(filepath.Join(user.GetHomeDir(), "testfile1"), []byte("test content"), os.ModePerm)
- assert.NoError(t, err)
- request.Target = testFile1
- request.Filepath = path.Join("/vdir", "file")
- err = c.updateQuotaAfterRename(request.Filepath, request.Target, filepath.Join(mappedPath, "file"), 12)
- assert.NoError(t, err)
- request.Target = path.Join("/vdir1", "file")
- request.Filepath = path.Join("/vdir", "file")
- err = c.updateQuotaAfterRename(request.Filepath, request.Target, filepath.Join(mappedPath, "file"), 12)
- assert.NoError(t, err)
- err = os.RemoveAll(mappedPath)
- assert.NoError(t, err)
- err = os.RemoveAll(user.GetHomeDir())
- assert.NoError(t, err)
- }
- func TestHasSpace(t *testing.T) {
- user := dataprovider.User{
- Username: userTestUsername,
- HomeDir: filepath.Join(os.TempDir(), "home"),
- Password: userTestPwd,
- }
- mappedPath := filepath.Join(os.TempDir(), "vdir")
- user.Permissions = make(map[string][]string)
- user.Permissions["/"] = []string{dataprovider.PermAny}
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath,
- },
- VirtualPath: "/vdir",
- QuotaFiles: -1,
- QuotaSize: -1,
- })
- fs, err := user.GetFilesystem("id")
- assert.NoError(t, err)
- c := NewBaseConnection("", ProtocolSFTP, user, fs)
- quotaResult := c.HasSpace(true, "/")
- assert.True(t, quotaResult.HasSpace)
- user.VirtualFolders[0].QuotaFiles = 0
- user.VirtualFolders[0].QuotaSize = 0
- err = dataprovider.AddUser(user)
- assert.NoError(t, err)
- user, err = dataprovider.UserExists(user.Username)
- assert.NoError(t, err)
- c.User = user
- quotaResult = c.HasSpace(true, "/vdir/file")
- assert.True(t, quotaResult.HasSpace)
- user.VirtualFolders[0].QuotaFiles = 10
- user.VirtualFolders[0].QuotaSize = 1048576
- err = dataprovider.UpdateUser(user)
- assert.NoError(t, err)
- c.User = user
- quotaResult = c.HasSpace(true, "/vdir/file1")
- assert.True(t, quotaResult.HasSpace)
- quotaResult = c.HasSpace(true, "/file")
- assert.True(t, quotaResult.HasSpace)
- folder, err := dataprovider.GetFolderByPath(mappedPath)
- assert.NoError(t, err)
- err = dataprovider.UpdateVirtualFolderQuota(folder, 10, 1048576, true)
- assert.NoError(t, err)
- quotaResult = c.HasSpace(true, "/vdir/file1")
- assert.False(t, quotaResult.HasSpace)
- err = dataprovider.DeleteUser(user)
- assert.NoError(t, err)
- err = dataprovider.DeleteFolder(folder)
- assert.NoError(t, err)
- }
- func TestUpdateQuotaMoveVFolders(t *testing.T) {
- user := dataprovider.User{
- Username: userTestUsername,
- HomeDir: filepath.Join(os.TempDir(), "home"),
- Password: userTestPwd,
- QuotaFiles: 100,
- }
- mappedPath1 := filepath.Join(os.TempDir(), "vdir1")
- mappedPath2 := filepath.Join(os.TempDir(), "vdir2")
- user.Permissions = make(map[string][]string)
- user.Permissions["/"] = []string{dataprovider.PermAny}
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath1,
- },
- VirtualPath: "/vdir1",
- QuotaFiles: -1,
- QuotaSize: -1,
- })
- user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
- BaseVirtualFolder: vfs.BaseVirtualFolder{
- MappedPath: mappedPath2,
- },
- VirtualPath: "/vdir2",
- QuotaFiles: -1,
- QuotaSize: -1,
- })
- err := dataprovider.AddUser(user)
- assert.NoError(t, err)
- user, err = dataprovider.UserExists(user.Username)
- assert.NoError(t, err)
- folder1, err := dataprovider.GetFolderByPath(mappedPath1)
- assert.NoError(t, err)
- folder2, err := dataprovider.GetFolderByPath(mappedPath2)
- assert.NoError(t, err)
- err = dataprovider.UpdateVirtualFolderQuota(folder1, 1, 100, true)
- assert.NoError(t, err)
- err = dataprovider.UpdateVirtualFolderQuota(folder2, 2, 150, true)
- assert.NoError(t, err)
- fs, err := user.GetFilesystem("id")
- assert.NoError(t, err)
- c := NewBaseConnection("", ProtocolSFTP, user, fs)
- c.updateQuotaMoveBetweenVFolders(user.VirtualFolders[0], user.VirtualFolders[1], -1, 100, 1)
- folder1, err = dataprovider.GetFolderByPath(mappedPath1)
- assert.NoError(t, err)
- assert.Equal(t, 0, folder1.UsedQuotaFiles)
- assert.Equal(t, int64(0), folder1.UsedQuotaSize)
- folder2, err = dataprovider.GetFolderByPath(mappedPath2)
- assert.NoError(t, err)
- assert.Equal(t, 3, folder2.UsedQuotaFiles)
- assert.Equal(t, int64(250), folder2.UsedQuotaSize)
- c.updateQuotaMoveBetweenVFolders(user.VirtualFolders[1], user.VirtualFolders[0], 10, 100, 1)
- folder1, err = dataprovider.GetFolderByPath(mappedPath1)
- assert.NoError(t, err)
- assert.Equal(t, 0, folder1.UsedQuotaFiles)
- assert.Equal(t, int64(90), folder1.UsedQuotaSize)
- folder2, err = dataprovider.GetFolderByPath(mappedPath2)
- assert.NoError(t, err)
- assert.Equal(t, 2, folder2.UsedQuotaFiles)
- assert.Equal(t, int64(150), folder2.UsedQuotaSize)
- err = dataprovider.UpdateUserQuota(user, 1, 100, true)
- assert.NoError(t, err)
- c.updateQuotaMoveFromVFolder(user.VirtualFolders[1], -1, 50, 1)
- folder2, err = dataprovider.GetFolderByPath(mappedPath2)
- assert.NoError(t, err)
- assert.Equal(t, 1, folder2.UsedQuotaFiles)
- assert.Equal(t, int64(100), folder2.UsedQuotaSize)
- user, err = dataprovider.GetUserByID(user.ID)
- assert.NoError(t, err)
- assert.Equal(t, 1, user.UsedQuotaFiles)
- assert.Equal(t, int64(100), user.UsedQuotaSize)
- c.updateQuotaMoveToVFolder(user.VirtualFolders[1], -1, 100, 1)
- folder2, err = dataprovider.GetFolderByPath(mappedPath2)
- assert.NoError(t, err)
- assert.Equal(t, 2, folder2.UsedQuotaFiles)
- assert.Equal(t, int64(200), folder2.UsedQuotaSize)
- user, err = dataprovider.GetUserByID(user.ID)
- assert.NoError(t, err)
- assert.Equal(t, 1, user.UsedQuotaFiles)
- assert.Equal(t, int64(100), user.UsedQuotaSize)
- err = dataprovider.DeleteUser(user)
- assert.NoError(t, err)
- err = dataprovider.DeleteFolder(folder1)
- assert.NoError(t, err)
- err = dataprovider.DeleteFolder(folder2)
- assert.NoError(t, err)
- }
- func TestErrorsMapping(t *testing.T) {
- fs := vfs.NewOsFs("", os.TempDir(), nil)
- conn := NewBaseConnection("", ProtocolSFTP, dataprovider.User{}, fs)
- for _, protocol := range supportedProtocols {
- conn.SetProtocol(protocol)
- err := conn.GetFsError(os.ErrNotExist)
- if protocol == ProtocolSFTP {
- assert.EqualError(t, err, sftp.ErrSSHFxNoSuchFile.Error())
- } else if protocol == ProtocolWebDAV {
- assert.EqualError(t, err, os.ErrNotExist.Error())
- } else {
- assert.EqualError(t, err, ErrNotExist.Error())
- }
- err = conn.GetFsError(os.ErrPermission)
- if protocol == ProtocolSFTP {
- assert.EqualError(t, err, sftp.ErrSSHFxPermissionDenied.Error())
- } else {
- assert.EqualError(t, err, ErrPermissionDenied.Error())
- }
- err = conn.GetFsError(os.ErrClosed)
- if protocol == ProtocolSFTP {
- assert.EqualError(t, err, sftp.ErrSSHFxFailure.Error())
- } else {
- assert.EqualError(t, err, ErrGenericFailure.Error())
- }
- err = conn.GetFsError(ErrPermissionDenied)
- if protocol == ProtocolSFTP {
- assert.EqualError(t, err, sftp.ErrSSHFxFailure.Error())
- } else {
- assert.EqualError(t, err, ErrPermissionDenied.Error())
- }
- err = conn.GetFsError(nil)
- assert.NoError(t, err)
- err = conn.GetOpUnsupportedError()
- if protocol == ProtocolSFTP {
- assert.EqualError(t, err, sftp.ErrSSHFxOpUnsupported.Error())
- } else {
- assert.EqualError(t, err, ErrOpUnsupported.Error())
- }
- }
- }
- func TestMaxWriteSize(t *testing.T) {
- permissions := make(map[string][]string)
- permissions["/"] = []string{dataprovider.PermAny}
- user := dataprovider.User{
- Username: userTestUsername,
- Permissions: permissions,
- HomeDir: filepath.Clean(os.TempDir()),
- }
- fs, err := user.GetFilesystem("123")
- assert.NoError(t, err)
- conn := NewBaseConnection("", ProtocolFTP, user, fs)
- quotaResult := vfs.QuotaCheckResult{
- HasSpace: true,
- }
- size, err := conn.GetMaxWriteSize(quotaResult, false, 0)
- assert.NoError(t, err)
- assert.Equal(t, int64(0), size)
- conn.User.Filters.MaxUploadFileSize = 100
- size, err = conn.GetMaxWriteSize(quotaResult, false, 0)
- assert.NoError(t, err)
- assert.Equal(t, int64(100), size)
- quotaResult.QuotaSize = 1000
- size, err = conn.GetMaxWriteSize(quotaResult, false, 50)
- assert.NoError(t, err)
- assert.Equal(t, int64(100), size)
- quotaResult.QuotaSize = 1000
- quotaResult.UsedSize = 990
- size, err = conn.GetMaxWriteSize(quotaResult, false, 50)
- assert.NoError(t, err)
- assert.Equal(t, int64(60), size)
- quotaResult.QuotaSize = 0
- quotaResult.UsedSize = 0
- size, err = conn.GetMaxWriteSize(quotaResult, true, 100)
- assert.EqualError(t, err, ErrQuotaExceeded.Error())
- assert.Equal(t, int64(0), size)
- size, err = conn.GetMaxWriteSize(quotaResult, true, 10)
- assert.NoError(t, err)
- assert.Equal(t, int64(90), size)
- conn.Fs = newMockOsFs(true, fs.ConnectionID(), user.GetHomeDir())
- size, err = conn.GetMaxWriteSize(quotaResult, true, 100)
- assert.EqualError(t, err, ErrOpUnsupported.Error())
- assert.Equal(t, int64(0), size)
- }
|