summaryrefslogtreecommitdiff
path: root/xmpp/sasl.go
diff options
context:
space:
mode:
Diffstat (limited to 'xmpp/sasl.go')
-rw-r--r--xmpp/sasl.go40
1 files changed, 39 insertions, 1 deletions
diff --git a/xmpp/sasl.go b/xmpp/sasl.go
index 8687782..512fd58 100644
--- a/xmpp/sasl.go
+++ b/xmpp/sasl.go
@@ -29,8 +29,46 @@ func (s *session) sasl() {
for _, t := range tokens {
err := s.ed.encodeToken(t)
if err != nil {
- log.Println("Could not encode stream end!")
+ log.Println("Could not encode SASL PLAIN element!")
return
}
}
}
+
+// hasSaslPlain scans the given stream features XML element for the SASL PLAIN
+// mechanism which is supported by xengineering.eu/limox/xmpp. It returns true
+// if the stream has support for this mechanism and false otherwise.
+func hasSaslPlain(e []xml.Token) bool {
+ mechanism := xml.Name{`urn:ietf:params:xml:ns:xmpp-sasl`, `mechanism`}
+
+ for i, t := range e {
+ switch s := t.(type) {
+ case xml.StartElement:
+ if s.Name == mechanism {
+ if i+1 < len(e) {
+ subtype := func() string {
+ switch c := e[i+1].(type) {
+ case xml.CharData:
+ return string(c)
+ default:
+ return ""
+ }
+ }()
+ if subtype == `PLAIN` {
+ return true
+ }
+ }
+ }
+ }
+ }
+
+ return false
+}
+
+func saslSuccessHandler(s *session, e []xml.Token) {
+ runStreamPair(s)
+}
+
+func saslFailureHandler(s *session, e []xml.Token) {
+ log.Println("SASL autentication failed!")
+}