diff options
Diffstat (limited to 'xmpp/sasl.go')
| -rw-r--r-- | xmpp/sasl.go | 40 | 
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!") +} | 
