64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
package ircevent
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/ergochat/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})
|
|
})
|
|
}
|