diff options
| -rw-r--r-- | xmpp/sasl.go | 30 | ||||
| -rw-r--r-- | xmpp/stream_pair.go | 30 | 
2 files changed, 35 insertions, 25 deletions
| diff --git a/xmpp/sasl.go b/xmpp/sasl.go index 8687782..e06bcd5 100644 --- a/xmpp/sasl.go +++ b/xmpp/sasl.go @@ -34,3 +34,33 @@ func (s *session) sasl() {  		}  	}  } + +// 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 +} diff --git a/xmpp/stream_pair.go b/xmpp/stream_pair.go index b353947..8f70318 100644 --- a/xmpp/stream_pair.go +++ b/xmpp/stream_pair.go @@ -91,31 +91,11 @@ func closeStream(s *session) {  	}  } -func getCharData(t xml.Token) string { -	switch c := t.(type) { -	case xml.CharData: -		return string(c) -	default: -		return "" -	} -} -  func streamFeaturesHandler(e []xml.Token) { -	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) { -					if getCharData(e[i+1]) == `PLAIN` { -						log.Println("Got offer for SASL PLAIN") -						return -					} -				} -			} -		} +	sasl := hasSaslPlain(e) +	if sasl { +		log.Println("Stream is compatible with SASL PLAIN mechanism") +	} else { +		log.Println("Stream is not compatible with SASL PLAIN mechanism!")  	} - -	log.Println("No compatible SASL mechanism offered!")  } | 
