diff options
| -rw-r--r-- | xmpp/sasl.go | 36 | ||||
| -rw-r--r-- | xmpp/session.go | 4 | 
2 files changed, 40 insertions, 0 deletions
diff --git a/xmpp/sasl.go b/xmpp/sasl.go new file mode 100644 index 0000000..1cb3670 --- /dev/null +++ b/xmpp/sasl.go @@ -0,0 +1,36 @@ +package xmpp + +import ( +	"encoding/xml" +	"encoding/base64" +	"log" +) + +func (s *session) sasl() { +	tokens := make([]xml.Token, 0, 3) + +	start := xml.StartElement{ +		xml.Name{"urn:ietf:params:xml:ns:xmpp-sasl", "auth"}, +		[]xml.Attr{ +			xml.Attr{xml.Name{"", "mechanism"}, "PLAIN"}, +		}, +	} +	tokens = append(tokens, start) + +	data := []byte("\x00" + username(s.jid) + "\x00" + s.pwd) +	dst := make([]byte, base64.StdEncoding.EncodedLen(len(data))) +	base64.StdEncoding.Encode(dst, data) +	payload := xml.CharData(dst) +	tokens = append(tokens, payload) + +	end := start.End() +	tokens = append(tokens, end) + +	for _, t := range tokens { +		err := s.ed.encodeToken(t) +		if err != nil { +			log.Println("Could not encode stream end!") +			return +		} +	} +} diff --git a/xmpp/session.go b/xmpp/session.go index 88a01ae..e0819da 100644 --- a/xmpp/session.go +++ b/xmpp/session.go @@ -13,6 +13,7 @@ type SessionShouldDisconnect struct{}  type session struct {  	jid       string +	pwd       string  	in        chan any  	out       chan<- any  	transport *tls.Conn @@ -25,6 +26,7 @@ func StartSession(out chan<- any, jid string, pwd string) (in chan<- any) {  	s := session{}  	s.jid = jid +	s.pwd = pwd  	s.in = make(chan any)  	s.out = out  	s.rx = make(chan xml.Token, 0) @@ -50,6 +52,8 @@ func (s *session) run() {  	s.openStream()  	defer s.closeStreams() +	s.sasl() +  	s.out <- SessionConnect{}  	for {  | 
