From c600e10faf59e96be6b0ad440bd4c5d8cc13d38a Mon Sep 17 00:00:00 2001
From: xengineering <me@xengineering.eu>
Date: Tue, 27 Jun 2023 16:43:45 +0200
Subject: xmpp: Re-introduce SASL authentication

---
 xmpp/sasl.go    | 36 ++++++++++++++++++++++++++++++++++++
 xmpp/session.go |  4 ++++
 2 files changed, 40 insertions(+)
 create mode 100644 xmpp/sasl.go

(limited to 'xmpp')

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 {
-- 
cgit v1.2.3-70-g09d2