Files
authentik/internal/outpost/radius/eap/packet.go
Jens Langhammer 1575b96262 separate eap logic into protocol
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-07-01 22:42:59 +02:00

56 lines
1.2 KiB
Go

package eap
import (
"fmt"
"goauthentik.io/internal/outpost/radius/eap/protocol"
"goauthentik.io/internal/outpost/radius/eap/protocol/eap"
"layeh.com/radius"
)
type Packet struct {
eap *eap.Payload
stm StateManager
state string
endModifier func(p *radius.Packet) *radius.Packet
}
func emptyPayload(stm StateManager, t protocol.Type) (protocol.Payload, error) {
for _, cons := range stm.GetEAPSettings().Protocols {
if np := cons(); np.Type() == t {
return np, nil
}
}
return nil, fmt.Errorf("unsupported EAP type %d", t)
}
func Decode(stm StateManager, raw []byte) (*Packet, error) {
packet := &Packet{
eap: &eap.Payload{},
stm: stm,
endModifier: func(p *radius.Packet) *radius.Packet {
return p
},
}
// FIXME: We're decoding twice here, first to get the msg type, then come back to assign the payload type
// then re-parse to parse the payload correctly
err := packet.eap.Decode(raw)
if err != nil {
return nil, err
}
p, err := emptyPayload(stm, packet.eap.MsgType)
if err != nil {
return nil, err
}
packet.eap.Payload = p
err = packet.eap.Decode(raw)
if err != nil {
return nil, err
}
return packet, nil
}
func (p *Packet) Encode() ([]byte, error) {
return p.eap.Encode()
}