56 lines
1.2 KiB
Go
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()
|
|
}
|