forked from lug/matterbridge
		
	
		
			
				
	
	
		
			54 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package irc
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/base64"
 | 
						|
	"errors"
 | 
						|
	"fmt"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
type SASLResult struct {
 | 
						|
	Failed bool
 | 
						|
	Err    error
 | 
						|
}
 | 
						|
 | 
						|
func (irc *Connection) setupSASLCallbacks(result chan<- *SASLResult) {
 | 
						|
	irc.AddCallback("CAP", func(e *Event) {
 | 
						|
		if len(e.Arguments) == 3 {
 | 
						|
			if e.Arguments[1] == "LS" {
 | 
						|
				if !strings.Contains(e.Arguments[2], "sasl") {
 | 
						|
					result <- &SASLResult{true, errors.New("no SASL capability " + e.Arguments[2])}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if e.Arguments[1] == "ACK" {
 | 
						|
				if irc.SASLMech != "PLAIN" {
 | 
						|
					result <- &SASLResult{true, errors.New("only PLAIN is supported")}
 | 
						|
				}
 | 
						|
				irc.SendRaw("AUTHENTICATE " + irc.SASLMech)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	})
 | 
						|
	irc.AddCallback("AUTHENTICATE", func(e *Event) {
 | 
						|
		str := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s\x00%s\x00%s", irc.SASLLogin, irc.SASLLogin, irc.SASLPassword)))
 | 
						|
		irc.SendRaw("AUTHENTICATE " + str)
 | 
						|
	})
 | 
						|
	irc.AddCallback("901", func(e *Event) {
 | 
						|
		irc.SendRaw("CAP END")
 | 
						|
		irc.SendRaw("QUIT")
 | 
						|
		result <- &SASLResult{true, errors.New(e.Arguments[1])}
 | 
						|
	})
 | 
						|
	irc.AddCallback("902", func(e *Event) {
 | 
						|
		irc.SendRaw("CAP END")
 | 
						|
		irc.SendRaw("QUIT")
 | 
						|
		result <- &SASLResult{true, errors.New(e.Arguments[1])}
 | 
						|
	})
 | 
						|
	irc.AddCallback("903", func(e *Event) {
 | 
						|
		result <- &SASLResult{false, nil}
 | 
						|
	})
 | 
						|
	irc.AddCallback("904", func(e *Event) {
 | 
						|
		irc.SendRaw("CAP END")
 | 
						|
		irc.SendRaw("QUIT")
 | 
						|
		result <- &SASLResult{true, errors.New(e.Arguments[1])}
 | 
						|
	})
 | 
						|
}
 |