diff --git a/engine/datamanager.go b/engine/datamanager.go index 59a80f8bf..53117e0bc 100644 --- a/engine/datamanager.go +++ b/engine/datamanager.go @@ -1829,6 +1829,13 @@ func (dm *DataManager) SetTiming(t *utils.TPTiming) (err error) { if dm == nil { return utils.ErrNoDatabaseConn } + // Check if time strings can be split in a time format before storing in db + if t.StartTime != utils.EmptyString && t.StartTime != utils.MetaASAP && !utils.IsTimeFormated(t.StartTime) { + return utils.ErrInvalidTime(t.StartTime) + } + if t.EndTime != utils.EmptyString && t.EndTime != utils.MetaASAP && !utils.IsTimeFormated(t.EndTime) { + return utils.ErrInvalidTime(t.EndTime) + } if err = dm.DataDB().SetTimingDrv(t); err != nil { return } diff --git a/engine/destinations_test.go b/engine/destinations_test.go index 94792ce02..e55e8c1c2 100644 --- a/engine/destinations_test.go +++ b/engine/destinations_test.go @@ -293,3 +293,15 @@ func TestDMSetReverseDestination(t *testing.T) { } } + +func TestDMSetTimingInvalidTime(t *testing.T) { + dm := NewDataManager(nil, nil, nil) + expErr := "INVALID_TIME:*any" + if err := dm.SetTiming(&utils.TPTiming{StartTime: "*any"}); err == nil || err.Error() != expErr { + t.Errorf("Expected error <%v>, received <%v>", expErr, err) + } + + if err := dm.SetTiming(&utils.TPTiming{EndTime: "*any"}); err == nil || err.Error() != expErr { + t.Errorf("Expected error <%v>, received <%v>", expErr, err) + } +} diff --git a/utils/apitpdata.go b/utils/apitpdata.go index 9f89e8dc9..4d43d6a83 100644 --- a/utils/apitpdata.go +++ b/utils/apitpdata.go @@ -221,6 +221,11 @@ func (t *TPTiming) IsActiveAt(tm time.Time) bool { return true } +// Returns true if string can be split in 3 sperated by ":" signs. "00:00:00" +func IsTimeFormated(t string) bool { + return len(strings.Split(t, ":")) == 3 +} + // Returns a time object that represents the end of the interval realtive to the received time func (t *TPTiming) getRightMargin(tm time.Time) (rigthtTime time.Time) { year, month, day := tm.Year(), tm.Month(), tm.Day() diff --git a/utils/apitpdata_test.go b/utils/apitpdata_test.go index 63c4f7b84..81b382fda 100644 --- a/utils/apitpdata_test.go +++ b/utils/apitpdata_test.go @@ -1180,3 +1180,17 @@ func TestGetRightMargin(t *testing.T) { }) } } + +func TestIsTimeFormatedTrue(t *testing.T) { + timeString := "12:12:12" + if !IsTimeFormated(timeString) { + t.Error("expected time to be formated, but returned false") + } +} + +func TestIsTimeFormatedFalse(t *testing.T) { + timeString := "*any" + if IsTimeFormated(timeString) { + t.Error("expected invalid time format, but returned true") + } +} diff --git a/utils/errors.go b/utils/errors.go index ea3041683..0813f87b4 100644 --- a/utils/errors.go +++ b/utils/errors.go @@ -273,6 +273,10 @@ func ErrNotConvertibleTF(from, to string) error { return fmt.Errorf("%s : from: %s to:%s", ErrNotConvertibleNoCaps.Error(), from, to) } +func ErrInvalidTime(s string) error { + return fmt.Errorf("INVALID_TIME:%s", s) +} + // NewSTIRError returns a error with a *stir_authorize prefix func NewSTIRError(reason string) error { return fmt.Errorf("%s: %s", MetaSTIRAuthenticate, reason)