90 lines
2.8 KiB
Go
90 lines
2.8 KiB
Go
package radius
|
|
|
|
import (
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
log "github.com/sirupsen/logrus"
|
|
"goauthentik.io/internal/outpost/flow"
|
|
"goauthentik.io/internal/outpost/radius/metrics"
|
|
"layeh.com/radius"
|
|
"layeh.com/radius/rfc2865"
|
|
)
|
|
|
|
func (rs *RadiusServer) Handle_AccessRequest(w radius.ResponseWriter, r *RadiusRequest) {
|
|
username := rfc2865.UserName_GetString(r.Packet)
|
|
|
|
fe := flow.NewFlowExecutor(r.Context(), r.pi.flowSlug, r.pi.s.ac.Client.GetConfig(), log.Fields{
|
|
"username": username,
|
|
"client": r.RemoteAddr(),
|
|
"requestId": r.ID,
|
|
})
|
|
fe.DelegateClientIP(r.RemoteAddr())
|
|
fe.Params.Add("goauthentik.io/outpost/radius", "true")
|
|
|
|
fe.Answers[flow.StageIdentification] = username
|
|
fe.Answers[flow.StagePassword] = rfc2865.UserPassword_GetString(r.Packet)
|
|
|
|
passed, err := fe.Execute()
|
|
|
|
if err != nil {
|
|
r.Log().WithField("username", username).WithError(err).Warning("failed to execute flow")
|
|
metrics.RequestsRejected.With(prometheus.Labels{
|
|
"outpost_name": rs.ac.Outpost.Name,
|
|
"reason": "flow_error",
|
|
"app": r.pi.appSlug,
|
|
}).Inc()
|
|
metrics.RequestsRejectedLegacy.With(prometheus.Labels{
|
|
"outpost_name": rs.ac.Outpost.Name,
|
|
"reason": "flow_error",
|
|
"app": r.pi.appSlug,
|
|
}).Inc()
|
|
_ = w.Write(r.Response(radius.CodeAccessReject))
|
|
return
|
|
}
|
|
if !passed {
|
|
metrics.RequestsRejected.With(prometheus.Labels{
|
|
"outpost_name": rs.ac.Outpost.Name,
|
|
"reason": "invalid_credentials",
|
|
"app": r.pi.appSlug,
|
|
}).Inc()
|
|
metrics.RequestsRejectedLegacy.With(prometheus.Labels{
|
|
"outpost_name": rs.ac.Outpost.Name,
|
|
"reason": "invalid_credentials",
|
|
"app": r.pi.appSlug,
|
|
}).Inc()
|
|
_ = w.Write(r.Response(radius.CodeAccessReject))
|
|
return
|
|
}
|
|
access, err := fe.CheckApplicationAccess(r.pi.appSlug)
|
|
if err != nil {
|
|
r.Log().WithField("username", username).WithError(err).Warning("failed to check access")
|
|
_ = w.Write(r.Response(radius.CodeAccessReject))
|
|
metrics.RequestsRejected.With(prometheus.Labels{
|
|
"outpost_name": rs.ac.Outpost.Name,
|
|
"reason": "access_check_fail",
|
|
"app": r.pi.appSlug,
|
|
}).Inc()
|
|
metrics.RequestsRejectedLegacy.With(prometheus.Labels{
|
|
"outpost_name": rs.ac.Outpost.Name,
|
|
"reason": "access_check_fail",
|
|
"app": r.pi.appSlug,
|
|
}).Inc()
|
|
return
|
|
}
|
|
if !access {
|
|
r.Log().WithField("username", username).Info("Access denied for user")
|
|
_ = w.Write(r.Response(radius.CodeAccessReject))
|
|
metrics.RequestsRejected.With(prometheus.Labels{
|
|
"outpost_name": rs.ac.Outpost.Name,
|
|
"reason": "access_denied",
|
|
"app": r.pi.appSlug,
|
|
}).Inc()
|
|
metrics.RequestsRejectedLegacy.With(prometheus.Labels{
|
|
"outpost_name": rs.ac.Outpost.Name,
|
|
"reason": "access_denied",
|
|
"app": r.pi.appSlug,
|
|
}).Inc()
|
|
return
|
|
}
|
|
_ = w.Write(r.Response(radius.CodeAccessAccept))
|
|
}
|