mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-07 14:50:55 +03:00
check for multiple inverse matches (#1332)
* update check for multiple inverse matches Signed-off-by: David Stäheli <mistrdave@gmail.com> * after match, direct return true Signed-off-by: David Stäheli <mistrdave@gmail.com> * apply same behaviour to checkEventGroupConditionPatterns Signed-off-by: David Stäheli <mistrdave@gmail.com> * fix spellmistake of function name Signed-off-by: David Stäheli <mistrdave@gmail.com> --------- Signed-off-by: David Stäheli <mistrdave@gmail.com>
This commit is contained in:
@@ -331,7 +331,7 @@ func (*eventRulesContainer) checkFsEventMatch(conditions *dataprovider.EventCond
|
|||||||
if !checkEventConditionPatterns(params.Role, conditions.Options.RoleNames) {
|
if !checkEventConditionPatterns(params.Role, conditions.Options.RoleNames) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if !checkEventGroupConditionPatters(params.Groups, conditions.Options.GroupNames) {
|
if !checkEventGroupConditionPatterns(params.Groups, conditions.Options.GroupNames) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if !checkEventConditionPatterns(params.VirtualPath, conditions.Options.FsPaths) {
|
if !checkEventConditionPatterns(params.VirtualPath, conditions.Options.FsPaths) {
|
||||||
@@ -1138,7 +1138,7 @@ func checkUserConditionOptions(user *dataprovider.User, conditions *dataprovider
|
|||||||
if !checkEventConditionPatterns(user.Role, conditions.RoleNames) {
|
if !checkEventConditionPatterns(user.Role, conditions.RoleNames) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if !checkEventGroupConditionPatters(user.Groups, conditions.GroupNames) {
|
if !checkEventGroupConditionPatterns(user.Groups, conditions.GroupNames) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
@@ -1149,24 +1149,29 @@ func checkEventConditionPatterns(name string, patterns []dataprovider.ConditionP
|
|||||||
if len(patterns) == 0 {
|
if len(patterns) == 0 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
matches := false
|
||||||
for _, p := range patterns {
|
for _, p := range patterns {
|
||||||
if checkEventConditionPattern(p, name) {
|
// assume, that multiple InverseMatches are set
|
||||||
|
if p.InverseMatch {
|
||||||
|
if checkEventConditionPattern(p, name) {
|
||||||
|
matches = true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else if checkEventConditionPattern(p, name) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return matches
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkEventGroupConditionPatters(groups []sdk.GroupMapping, patterns []dataprovider.ConditionPattern) bool {
|
func checkEventGroupConditionPatterns(groups []sdk.GroupMapping, patterns []dataprovider.ConditionPattern) bool {
|
||||||
if len(patterns) == 0 {
|
if len(patterns) == 0 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
for _, group := range groups {
|
for _, group := range groups {
|
||||||
for _, p := range patterns {
|
if checkEventConditionPatterns(group.Name, patterns) {
|
||||||
if checkEventConditionPattern(p, group.Name) {
|
return true
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -355,6 +355,55 @@ func TestDoubleStarMatching(t *testing.T) {
|
|||||||
assert.False(t, res)
|
assert.False(t, res)
|
||||||
res = checkEventConditionPattern(c, "/mydir/sub/dir/a.txt")
|
res = checkEventConditionPattern(c, "/mydir/sub/dir/a.txt")
|
||||||
assert.True(t, res)
|
assert.True(t, res)
|
||||||
|
|
||||||
|
c.InverseMatch = true
|
||||||
|
assert.True(t, checkEventConditionPattern(c, "/mydir"))
|
||||||
|
assert.True(t, checkEventConditionPattern(c, "/mydirname/f.txt"))
|
||||||
|
assert.True(t, checkEventConditionPattern(c, "/mydir/sub"))
|
||||||
|
assert.True(t, checkEventConditionPattern(c, "/mydir/sub/dir"))
|
||||||
|
assert.False(t, checkEventConditionPattern(c, "/mydir/sub/dir/a.txt"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMutlipleDoubleStarMatching(t *testing.T) {
|
||||||
|
patterns := []dataprovider.ConditionPattern{
|
||||||
|
{
|
||||||
|
Pattern: "/**/*.txt",
|
||||||
|
InverseMatch: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Pattern: "/**/*.tmp",
|
||||||
|
InverseMatch: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
assert.False(t, checkEventConditionPatterns("/mydir", patterns))
|
||||||
|
assert.True(t, checkEventConditionPatterns("/mydir/test.tmp", patterns))
|
||||||
|
assert.True(t, checkEventConditionPatterns("/mydir/test.txt", patterns))
|
||||||
|
assert.False(t, checkEventConditionPatterns("/mydir/test.csv", patterns))
|
||||||
|
assert.False(t, checkEventConditionPatterns("/mydir/sub", patterns))
|
||||||
|
assert.True(t, checkEventConditionPatterns("/mydir/sub/test.tmp", patterns))
|
||||||
|
assert.True(t, checkEventConditionPatterns("/mydir/sub/test.txt", patterns))
|
||||||
|
assert.False(t, checkEventConditionPatterns("/mydir/sub/test.csv", patterns))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMultipleDoubleStarMatchingInverse(t *testing.T) {
|
||||||
|
patterns := []dataprovider.ConditionPattern{
|
||||||
|
{
|
||||||
|
Pattern: "/**/*.txt",
|
||||||
|
InverseMatch: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Pattern: "/**/*.tmp",
|
||||||
|
InverseMatch: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
assert.True(t, checkEventConditionPatterns("/mydir", patterns))
|
||||||
|
assert.False(t, checkEventConditionPatterns("/mydir/test.tmp", patterns))
|
||||||
|
assert.False(t, checkEventConditionPatterns("/mydir/test.txt", patterns))
|
||||||
|
assert.True(t, checkEventConditionPatterns("/mydir/test.csv", patterns))
|
||||||
|
assert.True(t, checkEventConditionPatterns("/mydir/sub", patterns))
|
||||||
|
assert.False(t, checkEventConditionPatterns("/mydir/sub/test.tmp", patterns))
|
||||||
|
assert.False(t, checkEventConditionPatterns("/mydir/sub/test.txt", patterns))
|
||||||
|
assert.True(t, checkEventConditionPatterns("/mydir/sub/test.csv", patterns))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestEventManager(t *testing.T) {
|
func TestEventManager(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user