start handling inner
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
@ -14,6 +14,7 @@ type context struct {
|
||||
settings interface{}
|
||||
endStatus protocol.Status
|
||||
endModifier func(p *radius.Packet) *radius.Packet
|
||||
handleInner func(protocol.Payload, protocol.StateManager) (protocol.Payload, error)
|
||||
}
|
||||
|
||||
func (ctx *context) RootPayload() protocol.Payload { return ctx.rootPayload }
|
||||
@ -23,8 +24,8 @@ func (ctx *context) GetProtocolState(p protocol.Type) any { return ctx.typeS
|
||||
func (ctx *context) SetProtocolState(p protocol.Type, st any) { ctx.typeState[p] = st }
|
||||
func (ctx *context) IsProtocolStart(p protocol.Type) bool { return ctx.typeState[p] == nil }
|
||||
func (ctx *context) Log() *log.Entry { return ctx.log }
|
||||
func (ctx *context) HandleInnerEAP(protocol.Payload, protocol.StateManager) protocol.Payload {
|
||||
return nil
|
||||
func (ctx *context) HandleInnerEAP(p protocol.Payload, st protocol.StateManager) (protocol.Payload, error) {
|
||||
return ctx.handleInner(p, st)
|
||||
}
|
||||
|
||||
func (ctx *context) ForInnerProtocol(p protocol.Type) protocol.Context {
|
||||
|
@ -25,16 +25,16 @@ func sendErrorResponse(w radius.ResponseWriter, r *radius.Request) {
|
||||
}
|
||||
|
||||
func (p *Packet) HandleRadiusPacket(w radius.ResponseWriter, r *radius.Request) {
|
||||
p.r = r
|
||||
rst := rfc2865.State_GetString(r.Packet)
|
||||
if rst == "" {
|
||||
rst = base64.StdEncoding.EncodeToString(securecookie.GenerateRandomKey(12))
|
||||
}
|
||||
p.state = rst
|
||||
|
||||
rep, err := p.handleInner(r)
|
||||
rp := &Packet{
|
||||
eap: rep,
|
||||
}
|
||||
rp := &Packet{r: r}
|
||||
rep, err := p.handleInner()
|
||||
rp.eap = rep
|
||||
|
||||
rres := r.Response(radius.CodeAccessReject)
|
||||
if err == nil {
|
||||
@ -73,11 +73,11 @@ func (p *Packet) HandleRadiusPacket(w radius.ResponseWriter, r *radius.Request)
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Packet) handleInner(r *radius.Request) (*eap.Payload, error) {
|
||||
st := p.stm.GetEAPState(p.state)
|
||||
func (p *Packet) handleEAP(pp protocol.Payload, stm protocol.StateManager) (*eap.Payload, error) {
|
||||
st := stm.GetEAPState(p.state)
|
||||
if st == nil {
|
||||
log.Debug("Root-EAP: blank state")
|
||||
st = protocol.BlankState(p.stm.GetEAPSettings())
|
||||
st = protocol.BlankState(stm.GetEAPSettings())
|
||||
}
|
||||
|
||||
nextChallengeToOffer, err := st.GetNextProtocol()
|
||||
@ -91,8 +91,8 @@ func (p *Packet) handleInner(r *radius.Request) (*eap.Payload, error) {
|
||||
next := func() (*eap.Payload, error) {
|
||||
st.ProtocolIndex += 1
|
||||
st.TypeState = map[protocol.Type]any{}
|
||||
p.stm.SetEAPState(p.state, st)
|
||||
return p.handleInner(r)
|
||||
stm.SetEAPState(p.state, st)
|
||||
return p.handleEAP(pp, stm)
|
||||
}
|
||||
|
||||
if _, ok := p.eap.Payload.(*legacy_nak.Payload); ok {
|
||||
@ -101,14 +101,17 @@ func (p *Packet) handleInner(r *radius.Request) (*eap.Payload, error) {
|
||||
return next()
|
||||
}
|
||||
|
||||
np, t, _ := emptyPayload(p.stm, nextChallengeToOffer)
|
||||
np, t, _ := emptyPayload(stm, nextChallengeToOffer)
|
||||
|
||||
ctx := &context{
|
||||
req: r,
|
||||
req: p.r,
|
||||
rootPayload: p.eap,
|
||||
typeState: st.TypeState,
|
||||
log: log.WithField("type", fmt.Sprintf("%T", np)).WithField("code", t),
|
||||
settings: p.stm.GetEAPSettings().ProtocolSettings[t],
|
||||
settings: stm.GetEAPSettings().ProtocolSettings[t],
|
||||
handleInner: func(pp protocol.Payload, sm protocol.StateManager) (protocol.Payload, error) {
|
||||
return p.handleEAP(pp, sm)
|
||||
},
|
||||
}
|
||||
if !np.Offerable() {
|
||||
ctx.log.Debug("Root-EAP: protocol not offerable, skipping")
|
||||
@ -117,7 +120,7 @@ func (p *Packet) handleInner(r *radius.Request) (*eap.Payload, error) {
|
||||
ctx.log.Debug("Root-EAP: Passing to protocol")
|
||||
|
||||
res := p.GetChallengeForType(ctx, np, t)
|
||||
p.stm.SetEAPState(p.state, st)
|
||||
stm.SetEAPState(p.state, st)
|
||||
|
||||
if ctx.endModifier != nil {
|
||||
p.endModifier = ctx.endModifier
|
||||
@ -138,6 +141,10 @@ func (p *Packet) handleInner(r *radius.Request) (*eap.Payload, error) {
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (p *Packet) handleInner() (*eap.Payload, error) {
|
||||
return p.handleEAP(p.eap, p.stm)
|
||||
}
|
||||
|
||||
func (p *Packet) GetChallengeForType(ctx *context, np protocol.Payload, t protocol.Type) *eap.Payload {
|
||||
res := &eap.Payload{
|
||||
Code: protocol.CodeRequest,
|
||||
|
@ -9,6 +9,7 @@ import (
|
||||
)
|
||||
|
||||
type Packet struct {
|
||||
r *radius.Request
|
||||
eap *eap.Payload
|
||||
stm protocol.StateManager
|
||||
state string
|
||||
|
@ -24,7 +24,7 @@ type Context interface {
|
||||
SetProtocolState(p Type, s interface{})
|
||||
IsProtocolStart(p Type) bool
|
||||
|
||||
HandleInnerEAP(Payload, StateManager) Payload
|
||||
HandleInnerEAP(Payload, StateManager) (Payload, error)
|
||||
EndInnerProtocol(Status, func(p *radius.Packet) *radius.Packet)
|
||||
|
||||
Log() *log.Entry
|
||||
|
@ -26,7 +26,7 @@ type Payload struct {
|
||||
|
||||
eap *eap.Payload
|
||||
st *State
|
||||
settings *Settings
|
||||
settings Settings
|
||||
raw []byte
|
||||
}
|
||||
|
||||
@ -74,7 +74,7 @@ func (p *Payload) Handle(ctx protocol.Context) protocol.Payload {
|
||||
defer func() {
|
||||
ctx.SetProtocolState(TypePEAP, p.st)
|
||||
}()
|
||||
p.settings = ctx.ProtocolSettings().(*Settings)
|
||||
p.settings = ctx.ProtocolSettings().(Settings)
|
||||
|
||||
rootEap := ctx.RootPayload().(*eap.Payload)
|
||||
|
||||
@ -99,7 +99,11 @@ func (p *Payload) Handle(ctx protocol.Context) protocol.Payload {
|
||||
}
|
||||
}
|
||||
|
||||
return ctx.HandleInnerEAP(ep, p)
|
||||
res, err := ctx.HandleInnerEAP(ep, p)
|
||||
if err != nil {
|
||||
ctx.Log().WithError(err).Warning("PEAP: failed to handle inner EAP")
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (p *Payload) GetEAPSettings() protocol.Settings {
|
||||
|
@ -11,6 +11,6 @@ type Settings struct {
|
||||
InnerProtocols protocol.Settings
|
||||
}
|
||||
|
||||
func (s *Settings) TLSConfig() *tls.Config {
|
||||
func (s Settings) TLSConfig() *tls.Config {
|
||||
return s.Config
|
||||
}
|
||||
|
@ -16,6 +16,6 @@ type Settings struct {
|
||||
HandshakeSuccessful func(ctx protocol.Context, certs []*x509.Certificate) protocol.Status
|
||||
}
|
||||
|
||||
func (s *Settings) TLSConfig() *tls.Config {
|
||||
func (s Settings) TLSConfig() *tls.Config {
|
||||
return s.Config
|
||||
}
|
||||
|
Reference in New Issue
Block a user