From 5df20653f56ba1ee092181dcfcc8f21098b0b4a7 Mon Sep 17 00:00:00 2001 From: ionutboangiu Date: Tue, 15 Mar 2022 18:28:05 +0200 Subject: [PATCH] Implement function to check whether filter rules are valid or not --- apis/filters.go | 18 +++++++++++++++++- engine/filters.go | 31 +++++++++++++++++++++++++------ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/apis/filters.go b/apis/filters.go index 7375fee23..b0a800dce 100644 --- a/apis/filters.go +++ b/apis/filters.go @@ -19,6 +19,7 @@ along with this program. If not, see package apis import ( + "fmt" "time" "github.com/cgrates/birpc/context" @@ -26,11 +27,26 @@ import ( "github.com/cgrates/cgrates/utils" ) +func validateFilterRules(rules []*engine.FilterRule) error { + for _, rule := range rules { + if !rule.IsValid() { + return fmt.Errorf("there exists at least one filter rule that is not valid") + } + } + return nil +} + //SetFilter add a new Filter func (adms *AdminSv1) SetFilter(ctx *context.Context, arg *engine.FilterWithAPIOpts, reply *string) (err error) { if missing := utils.MissingStructFields(arg.Filter, []string{utils.ID}); len(missing) != 0 { return utils.NewErrMandatoryIeMissing(missing...) } + if len(arg.Rules) == 0 { + return utils.NewErrMandatoryIeMissing("Filter Rules") + } + if err = validateFilterRules(arg.Rules); err != nil { + return utils.APIErrorHandler(err) + } if arg.Tenant == utils.EmptyString { arg.Tenant = adms.cfg.GeneralCfg().DefaultTenant } @@ -62,7 +78,7 @@ func (adms *AdminSv1) SetFilter(ctx *context.Context, arg *engine.FilterWithAPIO return utils.APIErrorHandler(err) } *reply = utils.OK - return nil + return } //GetFilter returns a Filter diff --git a/engine/filters.go b/engine/filters.go index a973f028f..102827be1 100644 --- a/engine/filters.go +++ b/engine/filters.go @@ -218,19 +218,19 @@ func (fltr *Filter) Compile() (err error) { var supportedFiltersType utils.StringSet = utils.NewStringSet([]string{ utils.MetaString, utils.MetaPrefix, utils.MetaSuffix, - utils.MetaCronExp, utils.MetaRSR, - utils.MetaEmpty, utils.MetaExists, utils.MetaLessThan, utils.MetaLessOrEqual, + utils.MetaCronExp, utils.MetaRSR, utils.MetaEmpty, + utils.MetaExists, utils.MetaLessThan, utils.MetaLessOrEqual, utils.MetaGreaterThan, utils.MetaGreaterOrEqual, utils.MetaEqual, utils.MetaIPNet, utils.MetaAPIBan, utils.MetaActivationInterval, - utils.MetaRegex, utils.MetaNever, utils.MetaCronExp}) + utils.MetaRegex, utils.MetaNever}) var needsFieldName utils.StringSet = utils.NewStringSet([]string{ utils.MetaString, utils.MetaPrefix, utils.MetaSuffix, utils.MetaCronExp, utils.MetaRSR, utils.MetaLessThan, utils.MetaEmpty, utils.MetaExists, utils.MetaLessOrEqual, utils.MetaGreaterThan, utils.MetaGreaterOrEqual, utils.MetaEqual, utils.MetaIPNet, utils.MetaAPIBan, utils.MetaActivationInterval, utils.MetaRegex}) -var needsValues utils.StringSet = utils.NewStringSet([]string{utils.MetaString, utils.MetaPrefix, - utils.MetaSuffix, utils.MetaCronExp, utils.MetaRSR, +var needsValues utils.StringSet = utils.NewStringSet([]string{ + utils.MetaString, utils.MetaPrefix, utils.MetaSuffix, utils.MetaCronExp, utils.MetaRSR, utils.MetaLessThan, utils.MetaLessOrEqual, utils.MetaGreaterThan, utils.MetaGreaterOrEqual, utils.MetaEqual, utils.MetaIPNet, utils.MetaAPIBan, utils.MetaActivationInterval, utils.MetaRegex}) @@ -277,6 +277,23 @@ type FilterRule struct { negative *bool } +// IsValid checks whether a filter rule is valid or not +func (fltr *FilterRule) IsValid() bool { + // Type must be specified + if fltr.Type == utils.EmptyString { + return false + } + // Element must be specified only when the type is different from *never + if fltr.Element == utils.EmptyString && fltr.Type != utils.MetaNever { + return fltr.Type == utils.MetaNever + } + if len(fltr.Values) == 0 && !utils.IsSliceMember([]string{utils.MetaExists, utils.MetaNotExists, + utils.MetaEmpty, utils.MetaNotEmpty}, fltr.Type) { + return false + } + return true +} + // CompileValues compiles RSR fields func (fltr *FilterRule) CompileValues() (err error) { switch fltr.Type { @@ -291,7 +308,7 @@ func (fltr *FilterRule) CompileValues() (err error) { if fltr.rsrFilters, err = utils.ParseRSRFiltersFromSlice(fltr.Values); err != nil { return } - case utils.MetaExists, utils.MetaNotExists, utils.MetaEmpty, utils.MetaNotEmpty: // only the element is builded + case utils.MetaExists, utils.MetaNotExists, utils.MetaEmpty, utils.MetaNotEmpty: // only the element is built case utils.MetaActivationInterval, utils.MetaNotActivationInterval: fltr.rsrValues = make(config.RSRParsers, len(fltr.Values)) for i, strVal := range fltr.Values { @@ -299,6 +316,8 @@ func (fltr *FilterRule) CompileValues() (err error) { return } } + case utils.MetaNever: //return since there is not need for the values to be compiled in this case + return default: if fltr.rsrValues, err = config.NewRSRParsersFromSlice(fltr.Values); err != nil { return