diff options
| author | xengineering <me@xengineering.eu> | 2023-05-22 21:07:57 +0200 | 
|---|---|---|
| committer | xengineering <me@xengineering.eu> | 2023-05-22 21:07:57 +0200 | 
| commit | efd5c81ca00136d3a673d99e699f16d050fcfaa6 (patch) | |
| tree | 43f07ee17df972cab179cd1cd1c4990eafca4ce6 | |
| parent | 4fa114cd1efcba90054247f30fad957c8f0ec06d (diff) | |
| download | limox-efd5c81ca00136d3a673d99e699f16d050fcfaa6.tar limox-efd5c81ca00136d3a673d99e699f16d050fcfaa6.tar.zst limox-efd5c81ca00136d3a673d99e699f16d050fcfaa6.zip | |
Introduce new xmpp/sasl.go
| -rw-r--r-- | xmpp/routing.go | 44 | ||||
| -rw-r--r-- | xmpp/sasl.go | 50 | 
2 files changed, 50 insertions, 44 deletions
| diff --git a/xmpp/routing.go b/xmpp/routing.go index 23f92bb..48c9763 100644 --- a/xmpp/routing.go +++ b/xmpp/routing.go @@ -2,7 +2,6 @@ package xmpp  import (  	"encoding/xml" -	"encoding/base64"  	"errors"  	"log"  ) @@ -101,46 +100,3 @@ func streamFeatures(b []xml.Token, c *Conn) error {  	return nil  } - -func sendSaslAuth(b []xml.Token, c *Conn) error { -	mechanisms := make([]string, 0) -	for i, v := range(b) { -		switch token := v.(type) { -		case xml.StartElement: -			expected := xml.Name{"urn:ietf:params:xml:ns:xmpp-sasl", "mechanism"} -			if token.Name == expected { -				if i >= (len(b)-1) { continue } -				switch payload := b[i+1].(type) { -				case xml.CharData: -					mechanisms = append(mechanisms, string(payload)) -				} -			} -		} -	} - -	for _, v := range(mechanisms) { -		if v == "PLAIN" { -			start := xml.StartElement{ -				xml.Name{"urn:ietf:params:xml:ns:xmpp-sasl", "auth"}, -				[]xml.Attr{ -					xml.Attr{xml.Name{"", "mechanism"}, "PLAIN"}, -				}, -			} - -			data := []byte("\x00" + username(c.jid) + "\x00" + c.pwd) -			dst := make([]byte, base64.StdEncoding.EncodedLen(len(data))) -			base64.StdEncoding.Encode(dst, data) -			payload := xml.CharData(dst) - -			end := start.End() - -			c.enc.encodeNow(start) -			c.enc.encode(payload) -			c.enc.encodeNow(end) - -			return nil -		} -	} - -	return errors.New("No compatible SASL mechanism given") -} diff --git a/xmpp/sasl.go b/xmpp/sasl.go new file mode 100644 index 0000000..cbc1f11 --- /dev/null +++ b/xmpp/sasl.go @@ -0,0 +1,50 @@ +package xmpp + +import ( +	"encoding/xml" +	"encoding/base64" +	"errors" +) + +func sendSaslAuth(b []xml.Token, c *Conn) error { +	mechanisms := make([]string, 0) +	for i, v := range(b) { +		switch token := v.(type) { +		case xml.StartElement: +			expected := xml.Name{"urn:ietf:params:xml:ns:xmpp-sasl", "mechanism"} +			if token.Name == expected { +				if i >= (len(b)-1) { continue } +				switch payload := b[i+1].(type) { +				case xml.CharData: +					mechanisms = append(mechanisms, string(payload)) +				} +			} +		} +	} + +	for _, v := range(mechanisms) { +		if v == "PLAIN" { +			start := xml.StartElement{ +				xml.Name{"urn:ietf:params:xml:ns:xmpp-sasl", "auth"}, +				[]xml.Attr{ +					xml.Attr{xml.Name{"", "mechanism"}, "PLAIN"}, +				}, +			} + +			data := []byte("\x00" + username(c.jid) + "\x00" + c.pwd) +			dst := make([]byte, base64.StdEncoding.EncodedLen(len(data))) +			base64.StdEncoding.Encode(dst, data) +			payload := xml.CharData(dst) + +			end := start.End() + +			c.enc.encodeNow(start) +			c.enc.encode(payload) +			c.enc.encodeNow(end) + +			return nil +		} +	} + +	return errors.New("No compatible SASL mechanism given") +} | 
