mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-07 06:40:54 +03:00
file patterns: evaluate allowed filters before the denied ones
Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
This commit is contained in:
@@ -16,6 +16,7 @@ package common
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
@@ -645,3 +646,160 @@ func TestFsFileCopier(t *testing.T) {
|
||||
_, ok = fs.(vfs.FsFileCopier)
|
||||
assert.True(t, ok)
|
||||
}
|
||||
|
||||
func TestFilterListDirs(t *testing.T) {
|
||||
filters := dataprovider.UserFilters{
|
||||
BaseUserFilters: sdk.BaseUserFilters{
|
||||
FilePatterns: []sdk.PatternsFilter{
|
||||
{
|
||||
Path: "/dir1",
|
||||
DenyPolicy: sdk.DenyPolicyDefault,
|
||||
AllowedPatterns: []string{"*.jpg"},
|
||||
},
|
||||
{
|
||||
Path: "/dir2",
|
||||
DenyPolicy: sdk.DenyPolicyHide,
|
||||
AllowedPatterns: []string{"*.jpg"},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
virtualFolders := []vfs.VirtualFolder{
|
||||
{
|
||||
VirtualPath: "/dir1/vdir1",
|
||||
},
|
||||
{
|
||||
VirtualPath: "/dir1/vdir2",
|
||||
},
|
||||
{
|
||||
VirtualPath: "/dir1/vdir3",
|
||||
},
|
||||
{
|
||||
VirtualPath: "/dir2/vdir1",
|
||||
},
|
||||
{
|
||||
VirtualPath: "/dir2/vdir2",
|
||||
},
|
||||
{
|
||||
VirtualPath: "/dir2/vdir3.jpg",
|
||||
},
|
||||
}
|
||||
user := dataprovider.User{
|
||||
Filters: filters,
|
||||
VirtualFolders: virtualFolders,
|
||||
}
|
||||
|
||||
dirContents := []os.FileInfo{
|
||||
vfs.NewFileInfo("file1.txt", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("file1.jpg", false, 123, time.Now(), false),
|
||||
}
|
||||
|
||||
filtered := user.FilterListDir(dirContents, "/dir1")
|
||||
assert.Len(t, filtered, 5)
|
||||
|
||||
filtered = user.FilterListDir(dirContents, "/dir2")
|
||||
assert.Len(t, filtered, 2)
|
||||
|
||||
dirContents = []os.FileInfo{
|
||||
vfs.NewFileInfo("file1.txt", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("vdir3.jpg", false, 123, time.Now(), false),
|
||||
}
|
||||
|
||||
filtered = user.FilterListDir(dirContents, "/dir1")
|
||||
assert.Len(t, filtered, 5)
|
||||
|
||||
dirContents = []os.FileInfo{
|
||||
vfs.NewFileInfo("file1.txt", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("vdir3.jpg", false, 123, time.Now(), false),
|
||||
}
|
||||
|
||||
filtered = user.FilterListDir(dirContents, "/dir2")
|
||||
if assert.Len(t, filtered, 1) {
|
||||
assert.True(t, filtered[0].IsDir())
|
||||
}
|
||||
|
||||
user.VirtualFolders = nil
|
||||
dirContents = []os.FileInfo{
|
||||
vfs.NewFileInfo("file1.txt", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("vdir3.jpg", false, 123, time.Now(), false),
|
||||
}
|
||||
filtered = user.FilterListDir(dirContents, "/dir1")
|
||||
assert.Len(t, filtered, 2)
|
||||
|
||||
dirContents = []os.FileInfo{
|
||||
vfs.NewFileInfo("file1.txt", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("vdir3.jpg", false, 123, time.Now(), false),
|
||||
}
|
||||
filtered = user.FilterListDir(dirContents, "/dir2")
|
||||
if assert.Len(t, filtered, 1) {
|
||||
assert.False(t, filtered[0].IsDir())
|
||||
}
|
||||
|
||||
dirContents = []os.FileInfo{
|
||||
vfs.NewFileInfo("file1.jpg", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("file1.txt", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("file2.txt", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("vdir3.jpg", false, 123, time.Now(), false),
|
||||
}
|
||||
filtered = user.FilterListDir(dirContents, "/dir2")
|
||||
if assert.Len(t, filtered, 2) {
|
||||
assert.False(t, filtered[0].IsDir())
|
||||
assert.False(t, filtered[1].IsDir())
|
||||
}
|
||||
|
||||
user.VirtualFolders = virtualFolders
|
||||
user.Filters = filters
|
||||
filtered = user.FilterListDir(nil, "/dir1")
|
||||
assert.Len(t, filtered, 3)
|
||||
filtered = user.FilterListDir(nil, "/dir2")
|
||||
assert.Len(t, filtered, 1)
|
||||
|
||||
dirContents = []os.FileInfo{
|
||||
vfs.NewFileInfo("file1.jPg", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("file1.txt", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("file2.txt", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("vdir3.jpg", false, 456, time.Now(), false),
|
||||
}
|
||||
filtered = user.FilterListDir(dirContents, "/dir2")
|
||||
assert.Len(t, filtered, 2)
|
||||
|
||||
user = dataprovider.User{
|
||||
Filters: dataprovider.UserFilters{
|
||||
BaseUserFilters: sdk.BaseUserFilters{
|
||||
FilePatterns: []sdk.PatternsFilter{
|
||||
{
|
||||
Path: "/dir3",
|
||||
AllowedPatterns: []string{"ic35"},
|
||||
DeniedPatterns: []string{"*"},
|
||||
DenyPolicy: sdk.DenyPolicyHide,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
dirContents = []os.FileInfo{
|
||||
vfs.NewFileInfo("file1.jpg", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("file1.txt", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("file2.txt", false, 123, time.Now(), false),
|
||||
vfs.NewFileInfo("vdir3.jpg", false, 456, time.Now(), false),
|
||||
}
|
||||
filtered = user.FilterListDir(dirContents, "/dir3")
|
||||
assert.Len(t, filtered, 0)
|
||||
|
||||
dirContents = nil
|
||||
for i := 0; i < 100; i++ {
|
||||
dirContents = append(dirContents, vfs.NewFileInfo(fmt.Sprintf("ic%02d", i), i%2 == 0, int64(i), time.Now(), false))
|
||||
}
|
||||
dirContents = append(dirContents, vfs.NewFileInfo("ic350", false, 123, time.Now(), false))
|
||||
dirContents = append(dirContents, vfs.NewFileInfo(".ic35", false, 123, time.Now(), false))
|
||||
dirContents = append(dirContents, vfs.NewFileInfo("ic35.", false, 123, time.Now(), false))
|
||||
dirContents = append(dirContents, vfs.NewFileInfo("*ic35", false, 123, time.Now(), false))
|
||||
dirContents = append(dirContents, vfs.NewFileInfo("ic35*", false, 123, time.Now(), false))
|
||||
dirContents = append(dirContents, vfs.NewFileInfo("ic35.*", false, 123, time.Now(), false))
|
||||
dirContents = append(dirContents, vfs.NewFileInfo("file.jpg", false, 123, time.Now(), false))
|
||||
|
||||
filtered = user.FilterListDir(dirContents, "/dir3")
|
||||
if assert.Len(t, filtered, 1) {
|
||||
assert.Equal(t, "ic35", filtered[0].Name())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user