radagent: return ErrNotFound for missing radius attributes

This commit is contained in:
ionutboangiu
2026-02-23 19:16:23 +02:00
committed by Dan Christian Bogos
parent fb03793c6b
commit 9e49897666
3 changed files with 34 additions and 30 deletions

View File

@@ -640,15 +640,11 @@ func TestAgReqParseFieldRadius(t *testing.T) {
for _, v := range tplFlds {
v.ComputePath()
}
expected := ""
if out, err := agReq.ParseField(tplFlds[0]); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(out, expected) {
t.Errorf("expecting: <%+v>, received: <%+v>", expected, out)
if _, err := agReq.ParseField(tplFlds[0]); err != utils.ErrNotFound {
t.Errorf("expected ErrNotFound, got: %v", err)
}
if _, err := agReq.ParseField(tplFlds[1]); err == nil ||
err.Error() != "Empty source value for fieldID: <MandatoryTrue>" {
t.Error(err)
if _, err := agReq.ParseField(tplFlds[1]); err != utils.ErrNotFound {
t.Errorf("expected ErrNotFound, got: %v", err)
}
}

View File

@@ -52,9 +52,8 @@ func radAppendAttributes(packet *radigo.Packet, nm *utils.OrderedNavigableMap) e
}
// newRADataProvider constructs a DataProvider
func newRADataProvider(req *radigo.Packet) (dP utils.DataProvider) {
dP = &radiusDP{req: req, cache: utils.MapStorage{}}
return
func newRADataProvider(req *radigo.Packet) utils.DataProvider {
return &radiusDP{req: req, cache: utils.MapStorage{}}
}
// radiusDP implements utils.DataProvider, serving as radigo.Packet data decoder
@@ -71,17 +70,16 @@ func (pk *radiusDP) String() string {
}
// FieldAsInterface is part of utils.DataProvider interface
func (pk *radiusDP) FieldAsInterface(fldPath []string) (data any, err error) {
func (pk *radiusDP) FieldAsInterface(fldPath []string) (any, error) {
if len(fldPath) == 0 || len(fldPath) > 2 {
return nil, utils.ErrNotFound
}
if data, err = pk.cache.FieldAsInterface(fldPath); err != nil {
if err != utils.ErrNotFound { // item found in cache
return
}
err = nil // cancel previous err
} else {
return // data found in cache
data, err := pk.cache.FieldAsInterface(fldPath)
if err == nil {
return data, nil
}
if err != utils.ErrNotFound {
return nil, err
}
var attrName, vendorName string
if len(fldPath) == 2 {
@@ -89,19 +87,20 @@ func (pk *radiusDP) FieldAsInterface(fldPath []string) (data any, err error) {
} else {
attrName = fldPath[0]
}
if avps := pk.req.AttributesWithName(attrName, vendorName); len(avps) != 0 {
data = avps[0].GetStringValue()
avps := pk.req.AttributesWithName(attrName, vendorName)
if len(avps) == 0 {
return nil, utils.ErrNotFound
}
data = avps[0].GetStringValue()
pk.cache.Set(fldPath, data)
return
return data, nil
}
// FieldAsString is part of utils.DataProvider interface
func (pk *radiusDP) FieldAsString(fldPath []string) (data string, err error) {
var valIface any
valIface, err = pk.FieldAsInterface(fldPath)
func (pk *radiusDP) FieldAsString(fldPath []string) (string, error) {
valIface, err := pk.FieldAsInterface(fldPath)
if err != nil {
return
return "", err
}
return utils.IfaceAsString(valIface), nil
}

View File

@@ -173,10 +173,8 @@ func TestRadiusDPFieldAsInterfaceCached(t *testing.T) {
t.Errorf("Expecting: pass123, received: <%v>", data)
}
if data, err := dp.FieldAsInterface([]string{"Non-Existent-Field"}); err != nil {
t.Error(err)
} else if data != nil {
t.Errorf("Expecting: nil, received: <%v>", data)
if _, err := dp.FieldAsInterface([]string{"Non-Existent-Field"}); err != utils.ErrNotFound {
t.Errorf("expected ErrNotFound, got: %v", err)
}
if _, err := dp.FieldAsInterface([]string{"vendor", "attribute", "extra"}); err != utils.ErrNotFound {
@@ -197,6 +195,17 @@ func TestRadiusDPFieldAsInterfaceVSA(t *testing.T) {
}
}
func TestRadiusDPFieldAsInterfaceNotFound(t *testing.T) {
pkt := radigo.NewPacket(radigo.AccountingRequest, 1, dictRad, coder, "CGRateS.org")
dp := newRADataProvider(pkt)
if _, err := dp.FieldAsInterface([]string{"Nonexistent-Attr"}); err != utils.ErrNotFound {
t.Errorf("expected ErrNotFound, got: %v", err)
}
if _, err := dp.FieldAsInterface([]string{"Cisco", "Nonexistent-Attr"}); err != utils.ErrNotFound {
t.Errorf("expected ErrNotFound for VSA, got: %v", err)
}
}
func TestLibradFieldAsInterfaceWithInvalidPathLength(t *testing.T) {
pk := &radiusDP{}
fldPath := []string{"vendor", "attribute", "extra"}