diff --git a/engine/event.go b/engine/event.go index df1fdecda..e6a9627f7 100644 --- a/engine/event.go +++ b/engine/event.go @@ -45,7 +45,7 @@ type Event interface { GetDisconnectCause(string) string GetOriginatorIP(string) string GetExtraFields() map[string]string - MissingParameter() bool + MissingParameter(string) bool ParseEventValue(*utils.RSRField, string) string PassesFieldFilter(*utils.RSRField) (bool, string) AsStoredCdr(timezone string) *StoredCdr diff --git a/engine/storedcdr.go b/engine/storedcdr.go index bc1fd3cb5..e809ad819 100644 --- a/engine/storedcdr.go +++ b/engine/storedcdr.go @@ -638,7 +638,7 @@ func (storedCdr *StoredCdr) GetOriginatorIP(fieldName string) string { func (storedCdr *StoredCdr) GetExtraFields() map[string]string { return storedCdr.ExtraFields } -func (storedCdr *StoredCdr) MissingParameter() bool { +func (storedCdr *StoredCdr) MissingParameter(timezone string) bool { return len(storedCdr.AccId) == 0 || len(storedCdr.Category) == 0 || len(storedCdr.Tenant) == 0 || diff --git a/engine/storedcdr_test.go b/engine/storedcdr_test.go index 8345871bd..4a58aae1e 100644 --- a/engine/storedcdr_test.go +++ b/engine/storedcdr_test.go @@ -533,7 +533,7 @@ func TestStoredCdrEventFields(t *testing.T) { if at, _ := cdr.GetAnswerTime(utils.META_DEFAULT, ""); at != time.Date(2013, 11, 7, 8, 42, 27, 0, time.UTC) { t.Error("Received: ", at) } - if et, _ := cdr.GetEndTime(); et != time.Date(2013, 11, 7, 8, 42, 37, 0, time.UTC) { + if et, _ := cdr.GetEndTime(utils.META_DEFAULT, ""); et != time.Date(2013, 11, 7, 8, 42, 37, 0, time.UTC) { t.Error("Received: ", et) } if dur, _ := cdr.GetDuration(utils.META_DEFAULT); dur != cdr.Usage { diff --git a/sessionmanager/fsevent.go b/sessionmanager/fsevent.go index 59de3a042..15fb10f1b 100644 --- a/sessionmanager/fsevent.go +++ b/sessionmanager/fsevent.go @@ -168,7 +168,7 @@ func (fsev FSEvent) GetReqType(fieldName string) string { } return utils.FirstNonEmpty(fsev[fieldName], fsev[REQTYPE], reqTypeDetected, config.CgrConfig().DefaultReqType) } -func (fsev FSEvent) MissingParameter() bool { +func (fsev FSEvent) MissingParameter(timezone string) bool { return strings.TrimSpace(fsev.GetDirection(utils.META_DEFAULT)) == "" || strings.TrimSpace(fsev.GetAccount(utils.META_DEFAULT)) == "" || strings.TrimSpace(fsev.GetSubject(utils.META_DEFAULT)) == "" || diff --git a/sessionmanager/fssessionmanager.go b/sessionmanager/fssessionmanager.go index 099e4b8d4..98d8d1499 100644 --- a/sessionmanager/fssessionmanager.go +++ b/sessionmanager/fssessionmanager.go @@ -191,7 +191,7 @@ func (sm *FSSessionManager) onChannelAnswer(ev engine.Event, connId string) { if ev.GetReqType(utils.META_DEFAULT) == utils.META_NONE { // Do not process this request return } - if ev.MissingParameter() { + if ev.MissingParameter(sm.timezone) { sm.DisconnectSession(ev, connId, MISSING_PARAMETER) } s := NewSession(ev, connId, sm) diff --git a/sessionmanager/genericvent.go b/sessionmanager/genericvent.go index 9aedee66a..b52ca2bb4 100644 --- a/sessionmanager/genericvent.go +++ b/sessionmanager/genericvent.go @@ -194,7 +194,15 @@ func (self GenericEvent) GetExtraFields() map[string]string { return extraFields } -func (self GenericEvent) MissingParameter() bool { +func (self GenericEvent) MissingParameter(timezone string) bool { + switch self.GetName() { + case utils.CGR_AUTHORIZATION: + if setupTime, err := self.GetSetupTime(utils.META_DEFAULT, timezone); err != nil || setupTime == nilTime { + return true + } + return len(self.GetAccount(utils.META_DEFAULT)) == 0 || + len(self.GetDestination(utils.META_DEFAULT)) == 0 + } return false } diff --git a/sessionmanager/kamailiosm.go b/sessionmanager/kamailiosm.go index 3c64c77aa..f6ed04f85 100644 --- a/sessionmanager/kamailiosm.go +++ b/sessionmanager/kamailiosm.go @@ -54,7 +54,7 @@ func (self *KamailioSessionManager) onCgrAuth(evData []byte, connId string) { if kev.GetReqType(utils.META_DEFAULT) == utils.META_NONE { // Do not process this request return } - if kev.MissingParameter() { + if kev.MissingParameter(self.timezone) { if kar, err := kev.AsKamAuthReply(0.0, "", utils.ErrMandatoryIeMissing); err != nil { utils.Logger.Err(fmt.Sprintf(" Failed building auth reply %s", err.Error())) } else if err = self.conns[connId].Send(kar.String()); err != nil { @@ -127,7 +127,7 @@ func (self *KamailioSessionManager) onCallStart(evData []byte, connId string) { if kamEv.GetReqType(utils.META_DEFAULT) == utils.META_NONE { // Do not process this request return } - if kamEv.MissingParameter() { + if kamEv.MissingParameter(self.timezone) { self.DisconnectSession(kamEv, connId, utils.ErrMandatoryIeMissing.Error()) return } @@ -146,7 +146,7 @@ func (self *KamailioSessionManager) onCallEnd(evData []byte, connId string) { if kev.GetReqType(utils.META_DEFAULT) == utils.META_NONE { // Do not process this request return } - if kev.MissingParameter() { + if kev.MissingParameter(self.timezone) { utils.Logger.Err(fmt.Sprintf(" Mandatory IE missing out of event: %+v", kev)) } go self.ProcessCdr(kev.AsStoredCdr(self.Timezone())) diff --git a/sessionmanager/kamevent.go b/sessionmanager/kamevent.go index e6343508b..4c9fe9fde 100644 --- a/sessionmanager/kamevent.go +++ b/sessionmanager/kamevent.go @@ -229,11 +229,11 @@ func (kev KamEvent) GetCdrSource() string { return "KAMAILIO_" + kev.GetName() } -func (kev KamEvent) MissingParameter() bool { +func (kev KamEvent) MissingParameter(timezone string) bool { var nullTime time.Time switch kev.GetName() { case CGR_AUTH_REQUEST: - if setupTime, err := kev.GetSetupTime(utils.META_DEFAULT, config.CgrConfig().DefaultTimezone); err != nil || setupTime == nullTime { + if setupTime, err := kev.GetSetupTime(utils.META_DEFAULT, timezone); err != nil || setupTime == nullTime { return true } return len(kev.GetAccount(utils.META_DEFAULT)) == 0 || @@ -244,7 +244,7 @@ func (kev KamEvent) MissingParameter() bool { len(kev.GetDestination(utils.META_DEFAULT)) == 0 || len(kev[KAM_TR_INDEX]) == 0 || len(kev[KAM_TR_LABEL]) == 0 case CGR_CALL_START: - if aTime, err := kev.GetAnswerTime(utils.META_DEFAULT, config.CgrConfig().DefaultTimezone); err != nil || aTime == nullTime { + if aTime, err := kev.GetAnswerTime(utils.META_DEFAULT, timezone); err != nil || aTime == nullTime { return true } return len(kev.GetUUID()) == 0 || diff --git a/sessionmanager/kamevent_test.go b/sessionmanager/kamevent_test.go index dbfdd908f..421afbf9f 100644 --- a/sessionmanager/kamevent_test.go +++ b/sessionmanager/kamevent_test.go @@ -72,35 +72,35 @@ func TestKevAsKamAuthReply(t *testing.T) { func TestKevMissingParameter(t *testing.T) { kamEv := KamEvent{"event": "CGR_AUTH_REQUEST", "tr_index": "36045", "tr_label": "612369399", "cgr_reqtype": utils.META_POSTPAID, "cgr_account": "1001", "cgr_destination": "1002"} - if !kamEv.MissingParameter() { + if !kamEv.MissingParameter("") { t.Error("Failed detecting missing parameters") } kamEv["cgr_setuptime"] = "1419962256" - if kamEv.MissingParameter() { + if kamEv.MissingParameter("") { t.Error("False detecting missing parameters") } kamEv = KamEvent{"event": "UNKNOWN"} - if !kamEv.MissingParameter() { + if !kamEv.MissingParameter("") { t.Error("Failed detecting missing parameters") } kamEv = KamEvent{"event": CGR_LCR_REQUEST, "tr_index": "36045", "tr_label": "612369399", "cgr_reqtype": utils.META_POSTPAID, "cgr_account": "1001"} - if !kamEv.MissingParameter() { + if !kamEv.MissingParameter("") { t.Error("Failed detecting missing parameters") } kamEv = KamEvent{"event": CGR_LCR_REQUEST, CGR_ACCOUNT: "1001", CGR_DESTINATION: "1002", "tr_index": "36045", "tr_label": "612369399"} - if kamEv.MissingParameter() { + if kamEv.MissingParameter("") { t.Error("False detecting missing parameters") } kamEv = KamEvent{"event": "CGR_CALL_START", "callid": "9d28ec3ee068babdfe036623f42c0969@0:0:0:0:0:0:0:0", "from_tag": "3131b566", "cgr_reqtype": utils.META_POSTPAID, "cgr_account": "1001", "cgr_destination": "1002"} - if !kamEv.MissingParameter() { + if !kamEv.MissingParameter("") { t.Error("Failed detecting missing parameters") } kamEv["h_entry"] = "463" kamEv["h_id"] = "2605" kamEv["cgr_answertime"] = "1419964961" - if kamEv.MissingParameter() { + if kamEv.MissingParameter("") { t.Error("False detecting missing parameters") } } diff --git a/sessionmanager/osipsevent.go b/sessionmanager/osipsevent.go index 9fa4057e8..42332eba0 100644 --- a/sessionmanager/osipsevent.go +++ b/sessionmanager/osipsevent.go @@ -207,7 +207,7 @@ func (osipsEv *OsipsEvent) GetOriginatorIP(fieldName string) string { } return osipsEv.osipsEvent.OriginatorAddress.IP.String() } -func (osipsev *OsipsEvent) MissingParameter() bool { +func (osipsev *OsipsEvent) MissingParameter(timezone string) bool { var nilTime time.Time if osipsev.GetName() == "E_ACC_EVENT" && osipsev.osipsEvent.AttrValues["method"] == "INVITE" { return len(osipsev.GetUUID()) == 0 || @@ -219,15 +219,15 @@ func (osipsev *OsipsEvent) MissingParameter() bool { len(osipsev.osipsEvent.AttrValues[TIME]) == 0 } else if osipsev.GetName() == "E_ACC_EVENT" && osipsev.osipsEvent.AttrValues["method"] == "UPDATE" { // Updated event out of start/stop // Data needed when stopping a prepaid loop or building a CDR with start/stop event - setupTime, err := osipsev.GetSetupTime(TIME, config.CgrConfig().DefaultTimezone) + setupTime, err := osipsev.GetSetupTime(TIME, timezone) if err != nil || setupTime.Equal(nilTime) { return true } - aTime, err := osipsev.GetAnswerTime(utils.META_DEFAULT, config.CgrConfig().DefaultTimezone) + aTime, err := osipsev.GetAnswerTime(utils.META_DEFAULT, timezone) if err != nil || aTime.Equal(nilTime) { return true } - endTime, err := osipsev.GetEndTime(utils.META_DEFAULT, config.CgrConfig().DefaultTimezone) + endTime, err := osipsev.GetEndTime(utils.META_DEFAULT, timezone) if err != nil || endTime.Equal(nilTime) { return true } diff --git a/sessionmanager/osipsevent_test.go b/sessionmanager/osipsevent_test.go index a74915f2f..59b24c0e3 100644 --- a/sessionmanager/osipsevent_test.go +++ b/sessionmanager/osipsevent_test.go @@ -128,14 +128,14 @@ func TestOsipsEventGetValues(t *testing.T) { } func TestOsipsEventMissingParameter(t *testing.T) { - if !osipsEv.MissingParameter() { + if !osipsEv.MissingParameter("") { t.Errorf("Wrongly detected missing parameter: %+v", osipsEv) } osipsEv2 := &OsipsEvent{osipsEvent: &osipsdagram.OsipsEvent{Name: "E_ACC_CDR", AttrValues: map[string]string{"to_tag": "4ea9687f", "cgr_account": "dan", "setuptime": "7", "created": "1406370492", "method": "INVITE", "callid": "ODVkMDI2Mzc2MDY5N2EzODhjNTAzNTdlODhiZjRlYWQ", "sip_reason": "OK", "time": "1406370499", "cgr_reqtype": utils.META_PREPAID, "cgr_subject": "dan", "cgr_tenant": "itsyscom.com", "sip_code": "200", "duration": "20", "from_tag": "eb082607"}}} - if !osipsEv2.MissingParameter() { + if !osipsEv2.MissingParameter("") { t.Error("Failed to detect missing parameter.") } } diff --git a/sessionmanager/osipssm.go b/sessionmanager/osipssm.go index 51d73a07c..315cf86fc 100644 --- a/sessionmanager/osipssm.go +++ b/sessionmanager/osipssm.go @@ -259,7 +259,7 @@ func (osm *OsipsSessionManager) onAccEvent(osipsDgram *osipsdagram.OsipsEvent) { // Handler of call start event. Mostly starts a session if needed func (osm *OsipsSessionManager) callStart(osipsEv *OsipsEvent) error { - if osipsEv.MissingParameter() { + if osipsEv.MissingParameter(osm.timezone) { if err := osm.DisconnectSession(osipsEv, "", utils.ErrMandatoryIeMissing.Error()); err != nil { return err } @@ -282,7 +282,7 @@ func (osm *OsipsSessionManager) callEnd(osipsEv *OsipsEvent) error { if err := origEvent.updateDurationFromEvent(osipsEv); err != nil { return err } - if origEvent.MissingParameter() { + if origEvent.MissingParameter(osm.timezone) { return utils.ErrMandatoryIeMissing } if err := osm.sessions.removeSession(s, origEvent); err != nil { // Unreference it early so we avoid concurrency