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() }