From 01504c4fe6f676b0fd922393845b7713f85d9baa Mon Sep 17 00:00:00 2001 From: TeoV Date: Thu, 11 Apr 2019 11:00:35 +0300 Subject: [PATCH] Add verification in case of wrong time format for SetActionPlan --- apier/v1/apier.go | 27 +++++++++++++++++++++++++ apier/v2/apierv2_it_test.go | 40 ++++++++++++++++++++++++++++++++++++- utils/errors.go | 1 + 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/apier/v1/apier.go b/apier/v1/apier.go index 495fbda1f..7005862bb 100644 --- a/apier/v1/apier.go +++ b/apier/v1/apier.go @@ -601,6 +601,9 @@ func (self *ApierV1) SetActionPlan(attrs AttrSetActionPlan, reply *string) (err timing.Months.Parse(apiAtm.Months, ";") timing.MonthDays.Parse(apiAtm.MonthDays, ";") timing.WeekDays.Parse(apiAtm.WeekDays, ";") + if !verifyFormat(apiAtm.Time) { + return 0, fmt.Errorf("%s:%s", utils.ErrUnsupportedFormat.Error(), apiAtm.Time) + } timing.StartTime = apiAtm.Time ap.ActionTimings = append(ap.ActionTimings, &engine.ActionTiming{ Uuid: utils.GenUUID(), @@ -646,6 +649,30 @@ func (self *ApierV1) SetActionPlan(attrs AttrSetActionPlan, reply *string) (err return nil } +func verifyFormat(tStr string) bool { + if tStr == utils.EmptyString || + tStr == utils.MetaEveryMinute || + tStr == utils.MetaHourly { + return true + } + + if len(tStr) > 8 { // hh:mm:ss + return false + } + if a := strings.Split(tStr, utils.InInFieldSep); len(a) != 3 { + return false + } else { + if _, err := strconv.Atoi(a[0]); err != nil { + return false + } else if _, err := strconv.Atoi(a[1]); err != nil { + return false + } else if _, err := strconv.Atoi(a[2]); err != nil { + return false + } + } + return true +} + type AttrGetActionPlan struct { ID string } diff --git a/apier/v2/apierv2_it_test.go b/apier/v2/apierv2_it_test.go index 2151f91a6..fcf75edb0 100644 --- a/apier/v2/apierv2_it_test.go +++ b/apier/v2/apierv2_it_test.go @@ -210,10 +210,11 @@ func TestApierV2itSetAccountWithAP(t *testing.T) { if err := apierRPC.Call("ApierV2.SetActions", argActs1, &reply); err != nil { t.Error(err) } + tNow := time.Now().Add(time.Duration(time.Minute)) argAP1 := &v1.AttrSetActionPlan{Id: "TestApierV2itSetAccountWithAP_AP_1", ActionPlan: []*v1.AttrActionPlan{ {ActionsId: argActs1.ActionsId, - Time: time.Now().Add(time.Duration(time.Minute)).String(), + Time: fmt.Sprintf("%v:%v:%v", tNow.Hour(), tNow.Minute(), tNow.Second()), // 10:4:12 Weight: 20.0}}} if _, err := dm.DataDB().GetActionPlan(argAP1.Id, true, utils.NonTransactional); err == nil || err != utils.ErrNotFound { t.Error(err) @@ -349,6 +350,43 @@ func TestApierV2itSetActionWithCategory(t *testing.T) { } } +func TestApierV2itSetActionPlanWithWrongTiming(t *testing.T) { + var reply string + tNow := time.Now().Add(time.Duration(time.Minute)).String() + argAP1 := &v1.AttrSetActionPlan{Id: "TestApierV2itSetAccountWithAPWithWrongTiming", + ActionPlan: []*v1.AttrActionPlan{ + &v1.AttrActionPlan{ + ActionsId: "TestApierV2itSetAccountWithAP_ACT_1", + Time: tNow, + Weight: 20.0, + }, + }, + } + + if err := apierRPC.Call("ApierV1.SetActionPlan", argAP1, &reply); err == nil || + err.Error() != fmt.Sprintf("UNSUPPORTED_FORMAT:%s", tNow) { + t.Error("Expecting error ", err) + } +} + +func TestApierV2itSetActionPlanWithWrongTiming2(t *testing.T) { + var reply string + argAP1 := &v1.AttrSetActionPlan{Id: "TestApierV2itSetAccountWithAPWithWrongTiming", + ActionPlan: []*v1.AttrActionPlan{ + &v1.AttrActionPlan{ + ActionsId: "TestApierV2itSetAccountWithAP_ACT_1", + Time: "aa:bb:cc", + Weight: 20.0, + }, + }, + } + + if err := apierRPC.Call("ApierV1.SetActionPlan", argAP1, &reply); err == nil || + err.Error() != fmt.Sprintf("UNSUPPORTED_FORMAT:aa:bb:cc") { + t.Error("Expecting error ", err) + } +} + func TestApierV2itKillEngine(t *testing.T) { if err := engine.KillEngine(delay); err != nil { t.Error(err) diff --git a/utils/errors.go b/utils/errors.go index e91142fae..cbd6b7d8a 100644 --- a/utils/errors.go +++ b/utils/errors.go @@ -77,6 +77,7 @@ var ( ErrNotConnected = errors.New("NOT_CONNECTED") RalsErrorPrfx = "RALS_ERROR" DispatcherErrorPrefix = "DISPATCHER_ERROR" + ErrUnsupportedFormat = errors.New("UNSUPPORTED_FORMAT") ) // NewCGRError initialises a new CGRError