irc-go/ircevent/irc_sasl.go

65 lines
1.4 KiB
Go

package ircevent
import (
"encoding/base64"
"errors"
"fmt"
"git.tcp.direct/ircd/irc-go/ircmsg"
)
type saslResult struct {
Failed bool
Err error
}
func sliceContains(str string, list []string) bool {
for _, x := range list {
if x == str {
return true
}
}
return false
}
func (irc *Connection) submitSASLResult(r saslResult) {
select {
case irc.saslChan <- r:
default:
}
}
func (irc *Connection) setupSASLCallbacks() {
irc.AddCallback("AUTHENTICATE", func(e ircmsg.Message) {
str := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s\x00%s\x00%s", irc.SASLLogin, irc.SASLLogin, irc.SASLPassword)))
irc.Send("AUTHENTICATE", str)
})
irc.AddCallback(RPL_LOGGEDOUT, func(e ircmsg.Message) {
irc.SendRaw("CAP END")
irc.SendRaw("QUIT")
irc.submitSASLResult(saslResult{true, errors.New(e.Params[1])})
})
irc.AddCallback(ERR_NICKLOCKED, func(e ircmsg.Message) {
irc.SendRaw("CAP END")
irc.SendRaw("QUIT")
irc.submitSASLResult(saslResult{true, errors.New(e.Params[1])})
})
irc.AddCallback(RPL_SASLSUCCESS, func(e ircmsg.Message) {
irc.submitSASLResult(saslResult{false, nil})
})
irc.AddCallback(ERR_SASLFAIL, func(e ircmsg.Message) {
irc.SendRaw("CAP END")
irc.SendRaw("QUIT")
irc.submitSASLResult(saslResult{true, errors.New(e.Params[1])})
})
// this could potentially happen with auto-login via certfp?
irc.AddCallback(ERR_SASLALREADY, func(e ircmsg.Message) {
irc.submitSASLResult(saslResult{false, nil})
})
}