Files
authentik/internal/outpost/radius/api.go
Jens L. 61c6887e82 providers/radius: Add support for custom attributes (#10509)
* unrelated: show logs for failed blueprints

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* add dictionaries

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* unrelated: remove some unused api functions

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* add initial api

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* placeholder backend

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* idk

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* add proper mappings

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* format

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix tests

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2024-07-25 19:08:33 +02:00

63 lines
1.6 KiB
Go

package radius
import (
"context"
"errors"
"net"
"sort"
"strings"
log "github.com/sirupsen/logrus"
)
func parseCIDRs(raw string) []*net.IPNet {
parts := strings.Split(raw, ",")
cidrs := make([]*net.IPNet, len(parts))
for i, p := range parts {
_, ipnet, err := net.ParseCIDR(strings.TrimSpace(p))
if err != nil {
log.WithError(err).WithField("cidr", p).Error("Failed to parse CIDR")
continue
}
cidrs[i] = ipnet
}
sort.Slice(cidrs, func(i, j int) bool {
_, bi := cidrs[i].Mask.Size()
_, bj := cidrs[j].Mask.Size()
return bi < bj
})
return cidrs
}
func (rs *RadiusServer) Refresh() error {
outposts, _, err := rs.ac.Client.OutpostsApi.OutpostsRadiusList(context.Background()).Execute()
if err != nil {
return err
}
if len(outposts.Results) < 1 {
return errors.New("no radius provider defined")
}
providers := make([]*ProviderInstance, len(outposts.Results))
for idx, provider := range outposts.Results {
logger := log.WithField("logger", "authentik.outpost.radius").WithField("provider", provider.Name)
providers[idx] = &ProviderInstance{
SharedSecret: []byte(provider.GetSharedSecret()),
ClientNetworks: parseCIDRs(provider.GetClientNetworks()),
MFASupport: provider.GetMfaSupport(),
appSlug: provider.ApplicationSlug,
flowSlug: provider.AuthFlowSlug,
providerId: provider.Pk,
s: rs,
log: logger,
}
}
rs.providers = providers
rs.log.Info("Update providers")
return nil
}
func (rs *RadiusServer) StartRadiusServer() error {
rs.log.WithField("listen", rs.s.Addr).Info("Starting radius server")
return rs.s.ListenAndServe()
}