From 92a5b349fbbdc0dec33e3a57c3d8aadcbdebd7d2 Mon Sep 17 00:00:00 2001 From: DanB Date: Mon, 23 Apr 2018 18:27:36 +0200 Subject: [PATCH] Protect new subsystems against empty event in APIs --- engine/attributes.go | 3 +++ engine/resources.go | 15 +++++++++++++-- engine/stats.go | 4 ++++ engine/suppliers.go | 2 ++ engine/thresholds.go | 4 ++++ 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/engine/attributes.go b/engine/attributes.go index 2eaaa8de4..1ac7895c9 100644 --- a/engine/attributes.go +++ b/engine/attributes.go @@ -204,6 +204,9 @@ func (alS *AttributeService) V1GetAttributeForEvent(ev *utils.CGREvent, func (alS *AttributeService) V1ProcessEvent(ev *utils.CGREvent, reply *AttrSProcessEventReply) (err error) { + if ev.Event == nil { + return utils.NewErrMandatoryIeMissing("Event") + } evReply, err := alS.processEvent(ev) if err != nil { if err != utils.ErrNotFound { diff --git a/engine/resources.go b/engine/resources.go index 6790b762d..e18249257 100644 --- a/engine/resources.go +++ b/engine/resources.go @@ -530,8 +530,10 @@ func (rS *ResourceService) processThresholds(r *Resource) (err error) { // V1ResourcesForEvent returns active resource configs matching the event func (rS *ResourceService) V1ResourcesForEvent(args utils.ArgRSv1ResourceUsage, reply *Resources) (err error) { - if args.CGREvent.Tenant == "" { - return utils.NewErrMandatoryIeMissing("Tenant") + if missing := utils.MissingStructFields(args, []string{"Tenant", "ID"}); len(missing) != 0 { //Params missing + return utils.NewErrMandatoryIeMissing(missing...) + } else if args.CGREvent.Event == nil { + return utils.NewErrMandatoryIeMissing("Event") } var mtcRLs Resources if args.UsageID != "" { // only cached if UsageID is present @@ -559,6 +561,9 @@ func (rS *ResourceService) V1AuthorizeResources(args utils.ArgRSv1ResourceUsage, if missing := utils.MissingStructFields(&args, []string{"UsageID"}); len(missing) != 0 { //Params missing return utils.NewErrMandatoryIeMissing(missing...) } + if args.CGREvent.Event == nil { + return utils.NewErrMandatoryIeMissing("Event") + } mtcRLs := rS.cachedResourcesForEvent(args.TenantID()) if mtcRLs == nil { if mtcRLs, err = rS.matchingResourcesForEvent(&args.CGREvent, args.UsageTTL); err != nil { @@ -589,6 +594,9 @@ func (rS *ResourceService) V1AllocateResource(args utils.ArgRSv1ResourceUsage, r if missing := utils.MissingStructFields(&args, []string{"UsageID"}); len(missing) != 0 { //Params missing return utils.NewErrMandatoryIeMissing(missing...) } + if args.CGREvent.Event == nil { + return utils.NewErrMandatoryIeMissing("Event") + } var wasCached bool mtcRLs := rS.cachedResourcesForEvent(args.UsageID) if mtcRLs == nil { @@ -645,6 +653,9 @@ func (rS *ResourceService) V1ReleaseResource(args utils.ArgRSv1ResourceUsage, re if missing := utils.MissingStructFields(&args, []string{"UsageID"}); len(missing) != 0 { //Params missing return utils.NewErrMandatoryIeMissing(missing...) } + if args.CGREvent.Event == nil { + return utils.NewErrMandatoryIeMissing("Event") + } mtcRLs := rS.cachedResourcesForEvent(args.UsageID) if mtcRLs == nil { if mtcRLs, err = rS.matchingResourcesForEvent(&args.CGREvent, args.UsageTTL); err != nil { diff --git a/engine/stats.go b/engine/stats.go index 9bf0fc4e6..ced12136b 100644 --- a/engine/stats.go +++ b/engine/stats.go @@ -268,6 +268,8 @@ func (sS *StatService) processEvent(ev *utils.CGREvent) (err error) { func (sS *StatService) V1ProcessEvent(ev *utils.CGREvent, reply *string) (err error) { if missing := utils.MissingStructFields(ev, []string{"Tenant", "ID"}); len(missing) != 0 { //Params missing return utils.NewErrMandatoryIeMissing(missing...) + } else if ev.Event == nil { + return utils.NewErrMandatoryIeMissing("Event") } if err = sS.processEvent(ev); err == nil { *reply = utils.OK @@ -279,6 +281,8 @@ func (sS *StatService) V1ProcessEvent(ev *utils.CGREvent, reply *string) (err er func (sS *StatService) V1GetStatQueuesForEvent(ev *utils.CGREvent, reply *[]string) (err error) { if missing := utils.MissingStructFields(ev, []string{"Tenant", "ID"}); len(missing) != 0 { //Params missing return utils.NewErrMandatoryIeMissing(missing...) + } else if ev.Event == nil { + return utils.NewErrMandatoryIeMissing("Event") } var sQs StatQueues if sQs, err = sS.matchingStatQueuesForEvent(ev); err != nil { diff --git a/engine/suppliers.go b/engine/suppliers.go index 5457d582b..7cf2569f9 100644 --- a/engine/suppliers.go +++ b/engine/suppliers.go @@ -348,6 +348,8 @@ type optsGetSuppliers struct { func (spS *SupplierService) V1GetSuppliers(args *ArgsGetSuppliers, reply *SortedSuppliers) (err error) { if missing := utils.MissingStructFields(&args.CGREvent, []string{"Tenant", "ID"}); len(missing) != 0 { return utils.NewErrMandatoryIeMissing(missing...) + } else if args.CGREvent.Event == nil { + return utils.NewErrMandatoryIeMissing("Event") } sSps, err := spS.sortedSuppliersForEvent(args) if err != nil { diff --git a/engine/thresholds.go b/engine/thresholds.go index 6e02de0d0..1d6b2d2f2 100644 --- a/engine/thresholds.go +++ b/engine/thresholds.go @@ -328,6 +328,8 @@ func (tS *ThresholdService) processEvent(args *ArgsProcessEvent) (hits int, err func (tS *ThresholdService) V1ProcessEvent(args *ArgsProcessEvent, reply *int) (err error) { if missing := utils.MissingStructFields(args, []string{"Tenant", "ID"}); len(missing) != 0 { //Params missing return utils.NewErrMandatoryIeMissing(missing...) + } else if args.CGREvent.Event == nil { + return utils.NewErrMandatoryIeMissing("Event") } if hits, err := tS.processEvent(args); err != nil { return err @@ -341,6 +343,8 @@ func (tS *ThresholdService) V1ProcessEvent(args *ArgsProcessEvent, reply *int) ( func (tS *ThresholdService) V1GetThresholdsForEvent(args *ArgsProcessEvent, reply *Thresholds) (err error) { if missing := utils.MissingStructFields(args, []string{"Tenant", "ID"}); len(missing) != 0 { //Params missing return utils.NewErrMandatoryIeMissing(missing...) + } else if args.CGREvent.Event == nil { + return utils.NewErrMandatoryIeMissing("Event") } var ts Thresholds if ts, err = tS.matchingThresholdsForEvent(args); err == nil {