From 3603d12c3ebf501a048fb2187e895e89cc5ba404 Mon Sep 17 00:00:00 2001 From: gezimbll Date: Tue, 6 Jan 2026 17:26:28 +0100 Subject: [PATCH] prevent account actions to be executed when account is nil --- engine/action.go | 24 ++++++++++++++++++++++++ engine/action_plan.go | 3 +++ engine/action_plan_test.go | 4 ---- engine/actions_test.go | 19 +++++++++++++++++++ 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/engine/action.go b/engine/action.go index fbdff717d..b766deda7 100644 --- a/engine/action.go +++ b/engine/action.go @@ -156,6 +156,30 @@ type actionTypeFunc func(*Account, *Action, Actions, *FilterS, any, SharedAction var actionFuncMap = make(map[string]actionTypeFunc) +var accountActions = map[string]bool{ + utils.MetaTopUp: true, + utils.MetaDebit: true, + utils.MetaResetTriggers: true, + utils.MetaSetRecurrent: true, + utils.MetaUnsetRecurrent: true, + utils.MetaAllowNegative: true, + utils.MetaDenyNegative: true, + utils.MetaResetAccount: true, + utils.MetaTopUpReset: true, + utils.MetaDebitReset: true, + utils.MetaTransferBalance: true, + utils.MetaResetCounters: true, + utils.MetaEnableAccount: true, + utils.MetaDisableAccount: true, + utils.MetaTransferMonetaryDefault: true, + utils.MetaPublishAccount: true, + utils.MetaCDRAccount: true, + utils.SetExpiry: true, + utils.TopUpZeroNegative: true, + utils.MetaSetBalance: true, + utils.MetaRemoveBalance: true, +} + func init() { actionFuncMap[utils.MetaLog] = logAction actionFuncMap[utils.MetaResetTriggers] = resetTriggersAction diff --git a/engine/action_plan.go b/engine/action_plan.go index fddc99020..ccee75e2e 100644 --- a/engine/action_plan.go +++ b/engine/action_plan.go @@ -308,6 +308,9 @@ func (at *ActionTiming) Execute(fltrS *FilterS, originService string) (err error err = nil if len(at.accountIDs) == 0 { // action timing executing without accounts for _, act := range acts { + if accountActions[act.ActionType] { + continue + } if expDate, parseErr := utils.ParseTimeDetectLayout(act.ExpirationString, config.CgrConfig().GeneralCfg().DefaultTimezone); (act.Balance == nil || act.Balance.EmptyExpirationDate()) && parseErr == nil && !expDate.IsZero() { diff --git a/engine/action_plan_test.go b/engine/action_plan_test.go index 940932d60..4eb0f56c5 100644 --- a/engine/action_plan_test.go +++ b/engine/action_plan_test.go @@ -301,10 +301,6 @@ func TestActionTimingExErr(t *testing.T) { if err := at.Execute(nil, ""); err == nil || err != utils.ErrPartiallyExecuted { t.Error(err) } - at.actions[0].ActionType = utils.MetaDebitReset - if err := at.Execute(nil, ""); err == nil || err != utils.ErrPartiallyExecuted { - t.Error(err) - } at.accountIDs = utils.StringMap{"cgrates.org:zeroNegative": true} at.actions[0].ActionType = utils.MetaResetStatQueue if err := at.Execute(nil, ""); err == nil || err != utils.ErrPartiallyExecuted { diff --git a/engine/actions_test.go b/engine/actions_test.go index 87305eea1..28e835f8a 100644 --- a/engine/actions_test.go +++ b/engine/actions_test.go @@ -7653,3 +7653,22 @@ func TestUnsetRecurrentAction(t *testing.T) { t.Errorf("expected trigger2.Recurrent to remain true") } } + +func TestAccountActions(t *testing.T) { + for actType := range accountActions { + a := &Action{ + ActionType: actType, + Balance: &BalanceFilter{ + Type: utils.StringPointer("test"), + Value: &utils.ValueFormula{Static: 1.1}, + }, + } + at := &ActionTiming{ + actions: []*Action{a}, + } + err := at.Execute(nil, "") + if err != nil { + t.Errorf("Got error for action account type %s, error %v ", actType, err) + } + } +}