diff --git a/internal/common/eventmanager.go b/internal/common/eventmanager.go index b155a33f..3d32df7b 100644 --- a/internal/common/eventmanager.go +++ b/internal/common/eventmanager.go @@ -331,7 +331,7 @@ func (*eventRulesContainer) checkFsEventMatch(conditions *dataprovider.EventCond if !checkEventConditionPatterns(params.Role, conditions.Options.RoleNames) { return false } - if !checkEventGroupConditionPatters(params.Groups, conditions.Options.GroupNames) { + if !checkEventGroupConditionPatterns(params.Groups, conditions.Options.GroupNames) { return false } if !checkEventConditionPatterns(params.VirtualPath, conditions.Options.FsPaths) { @@ -1138,7 +1138,7 @@ func checkUserConditionOptions(user *dataprovider.User, conditions *dataprovider if !checkEventConditionPatterns(user.Role, conditions.RoleNames) { return false } - if !checkEventGroupConditionPatters(user.Groups, conditions.GroupNames) { + if !checkEventGroupConditionPatterns(user.Groups, conditions.GroupNames) { return false } return true @@ -1149,24 +1149,29 @@ func checkEventConditionPatterns(name string, patterns []dataprovider.ConditionP if len(patterns) == 0 { return true } + matches := false 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 false + return matches } -func checkEventGroupConditionPatters(groups []sdk.GroupMapping, patterns []dataprovider.ConditionPattern) bool { +func checkEventGroupConditionPatterns(groups []sdk.GroupMapping, patterns []dataprovider.ConditionPattern) bool { if len(patterns) == 0 { return true } for _, group := range groups { - for _, p := range patterns { - if checkEventConditionPattern(p, group.Name) { - return true - } + if checkEventConditionPatterns(group.Name, patterns) { + return true } } diff --git a/internal/common/eventmanager_test.go b/internal/common/eventmanager_test.go index 7ccd84ae..4032cdd9 100644 --- a/internal/common/eventmanager_test.go +++ b/internal/common/eventmanager_test.go @@ -355,6 +355,55 @@ func TestDoubleStarMatching(t *testing.T) { assert.False(t, res) res = checkEventConditionPattern(c, "/mydir/sub/dir/a.txt") 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) {