diff --git a/agents/radagent.go b/agents/radagent.go index 88b22f6b2..c2d343d24 100644 --- a/agents/radagent.go +++ b/agents/radagent.go @@ -534,6 +534,9 @@ func (ra *RadiusAgent) V1AlterSessions(_ *context.Context, cgrEv utils.CGREvent, if optTpl, err := cgrEv.OptAsString(utils.MetaRadCoATemplate); err == nil { coaTpl = optTpl } + if _, found := ra.cgrCfg.TemplatesCfg()[coaTpl]; !found { + return fmt.Errorf("%w: CoA Template %s", utils.ErrNotFound, coaTpl) + } replyCode, err := ra.sendRadDaReq(radigo.CoARequest, coaTpl, originID, utils.MapStorage(cgrEv.Event), nil) diff --git a/config/configsanity.go b/config/configsanity.go index ce1d91f19..28831c60e 100644 --- a/config/configsanity.go +++ b/config/configsanity.go @@ -373,6 +373,16 @@ func (cfg *CGRConfig) checkConfigSanity() error { } //Radius Agent if cfg.radiusAgentCfg.Enabled { + if cfg.radiusAgentCfg.CoATemplate != "" { + if _, found := cfg.templates[cfg.radiusAgentCfg.CoATemplate]; !found { + return fmt.Errorf("<%s> CoA Template %s not defined", utils.RadiusAgent, cfg.radiusAgentCfg.CoATemplate) + } + } + if cfg.radiusAgentCfg.DMRTemplate != "" { + if _, found := cfg.templates[cfg.radiusAgentCfg.DMRTemplate]; !found { + return fmt.Errorf("<%s> DMR Template %s not defined", utils.RadiusAgent, cfg.radiusAgentCfg.DMRTemplate) + } + } for _, connID := range cfg.radiusAgentCfg.SessionSConns { if strings.HasPrefix(connID, utils.MetaInternal) && !cfg.sessionSCfg.Enabled { return fmt.Errorf("<%s> not enabled but requested by <%s> component", utils.SessionS, utils.RadiusAgent) diff --git a/config/configsanity_test.go b/config/configsanity_test.go index 067150d4d..7df227b9a 100644 --- a/config/configsanity_test.go +++ b/config/configsanity_test.go @@ -608,8 +608,22 @@ func TestConfigSanityRadiusAgent(t *testing.T) { }, } + cfg.radiusAgentCfg.CoATemplate = "test_coa" // point to non-existent template + expected := " CoA Template test_coa not defined" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("expected %v, received %v", expected, err) + } + cfg.radiusAgentCfg.CoATemplate = "*coa" // point to default CoA template + + cfg.radiusAgentCfg.DMRTemplate = "test_dmr" // point to non-existent template + expected = " DMR Template test_dmr not defined" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("expected %v, received %v", expected, err) + } + cfg.radiusAgentCfg.DMRTemplate = "*dmr" // point to default DMR template + cfg.radiusAgentCfg.SessionSConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS)} - expected := " not enabled but requested by component" + expected = " not enabled but requested by component" if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) } @@ -683,6 +697,15 @@ func TestConfigSanityRadiusAgent(t *testing.T) { t.Errorf("Expecting: %+q received: %+q", expected, err) } cfg.radiusAgentCfg.RequestProcessors[0].Filters = []string{"*string:~*req.Account:1001"} + if err := cfg.checkConfigSanity(); err != nil { + t.Error(err) + } + + cfg.radiusAgentCfg.CoATemplate = "" + cfg.radiusAgentCfg.DMRTemplate = "" + if err := cfg.checkConfigSanity(); err != nil { + t.Error(err) + } } func TestConfigSanityDNSAgent(t *testing.T) { diff --git a/data/conf/samples/radius_coa_disconnect/templates.json b/data/conf/samples/radius_coa_disconnect/templates.json index d334a2408..8bdad5d9c 100644 --- a/data/conf/samples/radius_coa_disconnect/templates.json +++ b/data/conf/samples/radius_coa_disconnect/templates.json @@ -11,7 +11,7 @@ {"tag": "Acct-Session-Id", "path": "*radDAReq.Acct-Session-Id", "type": "*variable", "value": "~*oreq.Acct-Session-Id"}, {"tag": "Filter-Id", "path": "*radDAReq.Filter-Id", "type": "*variable", - "value": "~*req.CustomFilter"}, + "value": "~*req.CustomFilter"} ] }