From 064e271b5e3b2bbb8031f06fce48a2645a355f96 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 11 Aug 2020 13:06:12 +0300 Subject: [PATCH] Added *ipnet filter --- engine/filters.go | 40 +++++++++++++++++---- engine/filters_test.go | 76 +++++++++++++++++++++++++++++++++++++++ packages/debian/changelog | 1 + utils/consts.go | 2 ++ 4 files changed, 113 insertions(+), 6 deletions(-) diff --git a/engine/filters.go b/engine/filters.go index 27a3a0b24..76872e6d7 100644 --- a/engine/filters.go +++ b/engine/filters.go @@ -218,19 +218,21 @@ func (fltr *Filter) Compile() (err error) { return } -var supportedFiltersType utils.StringSet = utils.NewStringSet([]string{utils.MetaString, utils.MetaPrefix, utils.MetaSuffix, +var supportedFiltersType utils.StringSet = utils.NewStringSet([]string{ + utils.MetaString, utils.MetaPrefix, utils.MetaSuffix, utils.MetaTimings, utils.MetaRSR, utils.MetaDestinations, utils.MetaEmpty, utils.MetaExists, utils.MetaLessThan, utils.MetaLessOrEqual, utils.MetaGreaterThan, utils.MetaGreaterOrEqual, utils.MetaEqual, - utils.MetaNotEqual}) -var needsFieldName utils.StringSet = utils.NewStringSet([]string{utils.MetaString, utils.MetaPrefix, - utils.MetaSuffix, utils.MetaTimings, utils.MetaRSR, utils.MetaDestinations, utils.MetaLessThan, + utils.MetaNotEqual, utils.MetaIPNet}) +var needsFieldName utils.StringSet = utils.NewStringSet([]string{ + utils.MetaString, utils.MetaPrefix, utils.MetaSuffix, + utils.MetaTimings, utils.MetaRSR, utils.MetaDestinations, utils.MetaLessThan, utils.MetaEmpty, utils.MetaExists, utils.MetaLessOrEqual, utils.MetaGreaterThan, - utils.MetaGreaterOrEqual, utils.MetaEqual, utils.MetaNotEqual}) + utils.MetaGreaterOrEqual, utils.MetaEqual, utils.MetaNotEqual, utils.MetaIPNet}) var needsValues utils.StringSet = utils.NewStringSet([]string{utils.MetaString, utils.MetaPrefix, utils.MetaSuffix, utils.MetaTimings, utils.MetaRSR, utils.MetaDestinations, utils.MetaLessThan, utils.MetaLessOrEqual, utils.MetaGreaterThan, utils.MetaGreaterOrEqual, - utils.MetaEqual, utils.MetaNotEqual}) + utils.MetaEqual, utils.MetaNotEqual, utils.MetaIPNet}) // NewFilterRule returns a new filter func NewFilterRule(rfType, fieldName string, vals []string) (*FilterRule, error) { @@ -331,6 +333,8 @@ func (fltr *FilterRule) Pass(dDP utils.DataProvider) (result bool, err error) { result, err = fltr.passGreaterThan(dDP) case utils.MetaEqual, utils.MetaNotEqual: result, err = fltr.passEqualTo(dDP) + case utils.MetaIPNet, utils.MetaNotIPNet: + result, err = fltr.passIPNet(dDP) default: err = utils.ErrPrefixNotErrNotImplemented(fltr.Type) } @@ -567,6 +571,30 @@ func (fltr *FilterRule) passEqualTo(dDP utils.DataProvider) (bool, error) { return false, nil } +func (fltr *FilterRule) passIPNet(dDP utils.DataProvider) (bool, error) { + strVal, err := fltr.rsrElement.ParseDataProvider(dDP) + if err != nil { + if err == utils.ErrNotFound { + return false, nil + } + return false, err + } + _, ip, err := net.ParseCIDR(strVal) + if err != nil { + return false, err + } + for _, val := range fltr.rsrValues { + sval, err := val.ParseDataProvider(dDP) + if err != nil { + continue + } + if ip.Contains(net.ParseIP(sval)) { + return true, nil + } + } + return false, nil +} + func newDynamicDP(cfg *config.CGRConfig, connMgr *ConnManager, tenant string, initialDP utils.DataProvider) *dynamicDP { return &dynamicDP{ diff --git a/engine/filters_test.go b/engine/filters_test.go index 988c67ef0..7e4829e45 100644 --- a/engine/filters_test.go +++ b/engine/filters_test.go @@ -1368,3 +1368,79 @@ func TestVerifyInlineFilterS(t *testing.T) { t.Errorf("Expected error received nil") } } + +func TestFilterPassIPNet(t *testing.T) { + cd := utils.MapStorage{ + "IP": "192.0.2.1/24", + "WrongIP": "192.0.2.1", + } + rf := &FilterRule{Type: utils.MetaIPNet, + Element: "~IP", Values: []string{"192.0.2.0"}} + if err := rf.CompileValues(); err != nil { + t.Fatal(err) + } + if passes, err := rf.passIPNet(cd); err != nil { + t.Error(err) + } else if !passes { + t.Error("Not passes filter") + } + rf = &FilterRule{Type: utils.MetaIPNet, + Element: "~IP", Values: []string{"~IP2", "192.0.3.0"}} + if err := rf.CompileValues(); err != nil { + t.Fatal(err) + } + if passes, err := rf.passIPNet(cd); err != nil { + t.Error(err) + } else if passes { + t.Error("Filter passes") + } + //not + rf = &FilterRule{Type: utils.MetaNotIPNet, + Element: "~IP", Values: []string{"192.0.2.0"}} + if err := rf.CompileValues(); err != nil { + t.Fatal(err) + } + if passes, err := rf.Pass(cd); err != nil { + t.Error(err) + } else if passes { + t.Error("Filter passes") + } + rf = &FilterRule{Type: utils.MetaNotIPNet, + Element: "~IP", Values: []string{"192.0.3.0"}} + if err := rf.CompileValues(); err != nil { + t.Fatal(err) + } + if passes, err := rf.Pass(cd); err != nil { + t.Error(err) + } else if !passes { + t.Error("Not passes filter") + } + + rf = &FilterRule{Type: utils.MetaIPNet, + Element: "~IP2", Values: []string{"192.0.2.0"}} + if err := rf.CompileValues(); err != nil { + t.Fatal(err) + } + if passes, err := rf.passIPNet(cd); err != nil { + t.Error(err) + } else if passes { + t.Error("Filter passes") + } + + rf = &FilterRule{Type: utils.MetaIPNet, + Element: "~WrongIP", Values: []string{"192.0.2.0"}} + if err := rf.CompileValues(); err != nil { + t.Fatal(err) + } + if _, err := rf.passIPNet(cd); err == nil { + t.Error(err) + } + rf = &FilterRule{Type: utils.MetaIPNet, + Element: "~IP{*duration}", Values: []string{"192.0.2.0"}} + if err := rf.CompileValues(); err != nil { + t.Fatal(err) + } + if _, err := rf.Pass(cd); err == nil { + t.Error(err) + } +} diff --git a/packages/debian/changelog b/packages/debian/changelog index 1b5194781..38d463953 100644 --- a/packages/debian/changelog +++ b/packages/debian/changelog @@ -90,6 +90,7 @@ cgrates (0.11.0~dev) UNRELEASED; urgency=medium * [ERs] Add support for *template type * [EEs] Add support for *template type * [LoaderS] In case of empty output directory path don't move the processed file + * [FilterS] Added *ipnet filter to check if the network contains the IP -- DanB Wed, 19 Feb 2020 13:25:52 +0200 diff --git a/utils/consts.go b/utils/consts.go index 1bc8adea9..6cfb67dab 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -996,6 +996,7 @@ const ( MetaGreaterOrEqual = "*gte" MetaResources = "*resources" MetaEqual = "*eq" + MetaIPNet = "*ipnet" MetaNotString = "*notstring" MetaNotPrefix = "*notprefix" @@ -1008,6 +1009,7 @@ const ( MetaNotDestinations = "*notdestinations" MetaNotResources = "*notresources" MetaNotEqual = "*noteq" + MetaNotIPNet = "*notipnet" MetaEC = "*ec" )