diff --git a/docs/virtual-folders.md b/docs/virtual-folders.md index 36093ef3..cfd70c34 100644 --- a/docs/virtual-folders.md +++ b/docs/virtual-folders.md @@ -16,8 +16,6 @@ For example if the configure folder has configured `/tmp/mapped` or `C:\mapped` The same virtual folder can be shared among users, different folder quota limits for each user are supported. Folder quota limits can also be included inside the user quota but in this case the folder is considered "private" and sharing it with other users will break user quota calculation. -The filesystem paths that you want to expose as virtual folders must exist. - Using the REST API you can: - monitor folders quota usage diff --git a/sftpd/sftpd_test.go b/sftpd/sftpd_test.go index 3fa50c40..dd0e540b 100644 --- a/sftpd/sftpd_test.go +++ b/sftpd/sftpd_test.go @@ -3138,13 +3138,14 @@ func TestVirtualFolders(t *testing.T) { u.Permissions[path.Join(testDir1, "subdir")] = []string{dataprovider.PermCreateSymlinks, dataprovider.PermUpload, dataprovider.PermDelete} - err := os.MkdirAll(mappedPath, os.ModePerm) - assert.NoError(t, err) user, _, err := httpdtest.AddUser(u, http.StatusCreated) assert.NoError(t, err) client, err := getSftpClient(user, usePubKey) if assert.NoError(t, err) { defer client.Close() + // check virtual folder auto creation + _, err = os.Stat(mappedPath) + assert.NoError(t, err) testFileSize := int64(131072) testFilePath := filepath.Join(homeBasePath, testFileName) err = createTestFile(testFilePath, testFileSize) diff --git a/vfs/osfs.go b/vfs/osfs.go index e9d16253..56e4b0db 100644 --- a/vfs/osfs.go +++ b/vfs/osfs.go @@ -212,6 +212,14 @@ func (fs *OsFs) CheckRootPath(username string, uid int, gid int) bool { if err != nil { return false } + if _, err = fs.Stat(v.MappedPath); fs.IsNotExist(err) { + err = os.MkdirAll(v.MappedPath, os.ModePerm) + fsLog(fs, logger.LevelDebug, "virtual directory %#v for user %#v does not exist, try to create, mkdir error: %v", + v.MappedPath, username, err) + if err == nil { + SetPathPermissions(fs, fs.rootDir, uid, gid) + } + } } return (err == nil) }