mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-23 04:22:05 +01:00
SMACK-280: The SASL mechanisms work transparent with packet listeners
git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@11615 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
parent
ad65a76e77
commit
e3efee2e8f
3 changed files with 121 additions and 12 deletions
|
@ -22,6 +22,9 @@ package org.jivesoftware.smack;
|
||||||
|
|
||||||
import org.jivesoftware.smack.Connection.ListenerWrapper;
|
import org.jivesoftware.smack.Connection.ListenerWrapper;
|
||||||
import org.jivesoftware.smack.packet.*;
|
import org.jivesoftware.smack.packet.*;
|
||||||
|
import org.jivesoftware.smack.sasl.SASLMechanism.Challenge;
|
||||||
|
import org.jivesoftware.smack.sasl.SASLMechanism.Failure;
|
||||||
|
import org.jivesoftware.smack.sasl.SASLMechanism.Success;
|
||||||
import org.jivesoftware.smack.util.PacketParserUtils;
|
import org.jivesoftware.smack.util.PacketParserUtils;
|
||||||
import org.xmlpull.mxp1.MXParser;
|
import org.xmlpull.mxp1.MXParser;
|
||||||
import org.xmlpull.v1.XmlPullParser;
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
@ -281,14 +284,28 @@ class PacketReader {
|
||||||
else {
|
else {
|
||||||
// SASL authentication has failed. The server may close the connection
|
// SASL authentication has failed. The server may close the connection
|
||||||
// depending on the number of retries
|
// depending on the number of retries
|
||||||
|
final Failure failure = PacketParserUtils.parseSASLFailure(parser);
|
||||||
|
processPacket(failure);
|
||||||
connection.getSASLAuthentication().authenticationFailed();
|
connection.getSASLAuthentication().authenticationFailed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (parser.getName().equals("challenge")) {
|
else if (parser.getName().equals("challenge")) {
|
||||||
// The server is challenging the SASL authentication made by the client
|
// The server is challenging the SASL authentication made by the client
|
||||||
connection.getSASLAuthentication().challengeReceived(parser.nextText());
|
String challengeData = parser.nextText();
|
||||||
|
processPacket(new Challenge(challengeData));
|
||||||
|
connection.getSASLAuthentication().challengeReceived(challengeData);
|
||||||
}
|
}
|
||||||
else if (parser.getName().equals("success")) {
|
else if (parser.getName().equals("success")) {
|
||||||
|
processPacket(new Success(parser.nextText()));
|
||||||
|
// We now need to bind a resource for the connection
|
||||||
|
// Open a new stream and wait for the response
|
||||||
|
connection.packetWriter.openStream();
|
||||||
|
// Reset the state of the parser since a new stream element is going
|
||||||
|
// to be sent by the server
|
||||||
|
resetParser();
|
||||||
|
// The SASL authentication with the server was successful. The next step
|
||||||
|
// will be to bind the resource
|
||||||
|
connection.getSASLAuthentication().authenticated();
|
||||||
}
|
}
|
||||||
else if (parser.getName().equals("compressed")) {
|
else if (parser.getName().equals("compressed")) {
|
||||||
// Server confirmed that it's possible to use stream compression. Start
|
// Server confirmed that it's possible to use stream compression. Start
|
||||||
|
@ -304,17 +321,6 @@ class PacketReader {
|
||||||
// Disconnect the connection
|
// Disconnect the connection
|
||||||
connection.disconnect();
|
connection.disconnect();
|
||||||
}
|
}
|
||||||
else if (parser.getName().equals("success")) {
|
|
||||||
// We now need to bind a resource for the connection
|
|
||||||
// Open a new stream and wait for the response
|
|
||||||
connection.packetWriter.openStream();
|
|
||||||
// Reset the state of the parser since a new stream element is going
|
|
||||||
// to be sent by the server
|
|
||||||
resetParser();
|
|
||||||
// The SASL authentication with the server was successful. The next step
|
|
||||||
// will be to bind the resource
|
|
||||||
connection.getSASLAuthentication().authenticated();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
eventType = parser.next();
|
eventType = parser.next();
|
||||||
} while (!done && eventType != XmlPullParser.END_DOCUMENT && thread == readerThread);
|
} while (!done && eventType != XmlPullParser.END_DOCUMENT && thread == readerThread);
|
||||||
|
|
|
@ -216,6 +216,28 @@ public abstract class SASLMechanism implements CallbackHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A SASL challenge stanza.
|
||||||
|
*/
|
||||||
|
public static class Challenge extends Packet {
|
||||||
|
final private String data;
|
||||||
|
|
||||||
|
public Challenge(String data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toXML() {
|
||||||
|
StringBuilder stanza = new StringBuilder();
|
||||||
|
stanza.append("<challenge xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">");
|
||||||
|
if (data != null &&
|
||||||
|
data.trim().length() > 0) {
|
||||||
|
stanza.append(data);
|
||||||
|
}
|
||||||
|
stanza.append("</challenge>");
|
||||||
|
return stanza.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A SASL response stanza.
|
* A SASL response stanza.
|
||||||
*/
|
*/
|
||||||
|
@ -248,4 +270,57 @@ public abstract class SASLMechanism implements CallbackHandler {
|
||||||
return stanza.toString();
|
return stanza.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A SASL success stanza.
|
||||||
|
*/
|
||||||
|
public static class Success extends Packet {
|
||||||
|
final private String data;
|
||||||
|
|
||||||
|
public Success(String data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toXML() {
|
||||||
|
StringBuilder stanza = new StringBuilder();
|
||||||
|
stanza.append("<success xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">");
|
||||||
|
if (data != null &&
|
||||||
|
data.trim().length() > 0) {
|
||||||
|
stanza.append(data);
|
||||||
|
}
|
||||||
|
stanza.append("</success>");
|
||||||
|
return stanza.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A SASL failure stanza.
|
||||||
|
*/
|
||||||
|
public static class Failure extends Packet {
|
||||||
|
final private String condition;
|
||||||
|
|
||||||
|
public Failure(String condition) {
|
||||||
|
this.condition = condition;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the SASL related error condition.
|
||||||
|
*
|
||||||
|
* @return the SASL related error condition.
|
||||||
|
*/
|
||||||
|
public String getCondition() {
|
||||||
|
return condition;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toXML() {
|
||||||
|
StringBuilder stanza = new StringBuilder();
|
||||||
|
stanza.append("<failure xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">");
|
||||||
|
if (condition != null &&
|
||||||
|
condition.trim().length() > 0) {
|
||||||
|
stanza.append("<").append(condition).append("/>");
|
||||||
|
}
|
||||||
|
stanza.append("</failure>");
|
||||||
|
return stanza.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.jivesoftware.smack.packet.*;
|
||||||
import org.jivesoftware.smack.provider.IQProvider;
|
import org.jivesoftware.smack.provider.IQProvider;
|
||||||
import org.jivesoftware.smack.provider.PacketExtensionProvider;
|
import org.jivesoftware.smack.provider.PacketExtensionProvider;
|
||||||
import org.jivesoftware.smack.provider.ProviderManager;
|
import org.jivesoftware.smack.provider.ProviderManager;
|
||||||
|
import org.jivesoftware.smack.sasl.SASLMechanism.Failure;
|
||||||
import org.xmlpull.v1.XmlPullParser;
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
|
@ -590,6 +591,33 @@ public class PacketParserUtils {
|
||||||
return properties;
|
return properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses SASL authentication error packets.
|
||||||
|
*
|
||||||
|
* @param parser the XML parser.
|
||||||
|
* @return a SASL Failure packet.
|
||||||
|
* @throws Exception if an exception occurs while parsing the packet.
|
||||||
|
*/
|
||||||
|
public static Failure parseSASLFailure(XmlPullParser parser) throws Exception {
|
||||||
|
String condition = null;
|
||||||
|
boolean done = false;
|
||||||
|
while (!done) {
|
||||||
|
int eventType = parser.next();
|
||||||
|
|
||||||
|
if (eventType == XmlPullParser.START_TAG) {
|
||||||
|
if (!parser.getName().equals("failure")) {
|
||||||
|
condition = parser.getName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (eventType == XmlPullParser.END_TAG) {
|
||||||
|
if (parser.getName().equals("failure")) {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new Failure(condition);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses stream error packets.
|
* Parses stream error packets.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue