file patterns: evaluate allowed filters before the denied ones

Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
This commit is contained in:
Nicola Murino
2023-05-24 19:56:53 +02:00
parent 2238043efd
commit f8f8962ccb
6 changed files with 165 additions and 7 deletions

View File

@@ -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())
}
}