mirror of
https://github.com/vanitasvitae/Smack.git
synced 2025-09-09 17:19:39 +02:00
Move SASL logic into AbstractXMPPConnection
Besides the way the transport handles the stream after SASL <success/>, the SASL logic is independend from the underlying transport (BOSH, TCP, …). Hence move it up into AbstractXMPPConnection. This also has the benefit that we can make some more methods private or package-private. Also introduce XmlStringBuilder.optTextChild(), which causes some associated changes.
This commit is contained in:
parent
c3247ef006
commit
eeb6c52f7e
23 changed files with 490 additions and 329 deletions
|
@ -29,6 +29,7 @@ import org.jivesoftware.smack.AbstractXMPPConnection;
|
|||
import org.jivesoftware.smack.SmackException;
|
||||
import org.jivesoftware.smack.SmackException.ConnectionException;
|
||||
import org.jivesoftware.smack.SmackException.NotConnectedException;
|
||||
import org.jivesoftware.smack.SmackException.SmackWrappedException;
|
||||
import org.jivesoftware.smack.XMPPConnection;
|
||||
import org.jivesoftware.smack.XMPPException;
|
||||
import org.jivesoftware.smack.XMPPException.StreamErrorException;
|
||||
|
@ -39,8 +40,6 @@ import org.jivesoftware.smack.packet.Nonza;
|
|||
import org.jivesoftware.smack.packet.Presence;
|
||||
import org.jivesoftware.smack.packet.Stanza;
|
||||
import org.jivesoftware.smack.packet.StanzaError;
|
||||
import org.jivesoftware.smack.sasl.packet.SaslStreamElements.SASLFailure;
|
||||
import org.jivesoftware.smack.sasl.packet.SaslStreamElements.Success;
|
||||
import org.jivesoftware.smack.util.CloseableUtil;
|
||||
import org.jivesoftware.smack.util.PacketParserUtils;
|
||||
import org.jivesoftware.smack.xml.XmlPullParser;
|
||||
|
@ -218,7 +217,7 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection {
|
|||
protected void loginInternal(String username, String password, Resourcepart resource) throws XMPPException,
|
||||
SmackException, IOException, InterruptedException {
|
||||
// Authenticate using SASL
|
||||
saslAuthentication.authenticate(username, password, config.getAuthzid(), null);
|
||||
authenticate(username, password, config.getAuthzid(), null);
|
||||
|
||||
bindResourceAndEstablishSession(resource);
|
||||
|
||||
|
@ -395,6 +394,26 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection {
|
|||
readerConsumer.start();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void afterSaslAuthenticationSuccess()
|
||||
throws NotConnectedException, InterruptedException, SmackWrappedException {
|
||||
// XMPP over BOSH is unusual when it comes to SASL authentication: Instead of sending a new stream open, it
|
||||
// requires a special XML element ot be send after successful SASL authentication.
|
||||
// See XEP-0206 § 5., especially the following is example 5 of XEP-0206.
|
||||
ComposableBody composeableBody = ComposableBody.builder().setNamespaceDefinition("xmpp",
|
||||
XMPPBOSHConnection.XMPP_BOSH_NS).setAttribute(
|
||||
BodyQName.createWithPrefix(XMPPBOSHConnection.XMPP_BOSH_NS, "restart",
|
||||
"xmpp"), "true").setAttribute(
|
||||
BodyQName.create(XMPPBOSHConnection.BOSH_URI, "to"), getXMPPServiceDomain().toString()).build();
|
||||
|
||||
try {
|
||||
send(composeableBody);
|
||||
} catch (BOSHException e) {
|
||||
// jbosh's exception API does not really match the one of Smack.
|
||||
throw new SmackException.SmackWrappedException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A listener class which listen for a successfully established connection
|
||||
* and connection errors and notifies the BOSHConnection.
|
||||
|
@ -490,30 +509,9 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection {
|
|||
case Presence.ELEMENT:
|
||||
parseAndProcessStanza(parser);
|
||||
break;
|
||||
case "challenge":
|
||||
// The server is challenging the SASL authentication
|
||||
// made by the client
|
||||
final String challengeData = parser.nextText();
|
||||
getSASLAuthentication().challengeReceived(challengeData);
|
||||
break;
|
||||
case "success":
|
||||
send(ComposableBody.builder().setNamespaceDefinition("xmpp",
|
||||
XMPPBOSHConnection.XMPP_BOSH_NS).setAttribute(
|
||||
BodyQName.createWithPrefix(XMPPBOSHConnection.XMPP_BOSH_NS, "restart",
|
||||
"xmpp"), "true").setAttribute(
|
||||
BodyQName.create(XMPPBOSHConnection.BOSH_URI, "to"), getXMPPServiceDomain().toString()).build());
|
||||
Success success = new Success(parser.nextText());
|
||||
getSASLAuthentication().authenticated(success);
|
||||
break;
|
||||
case "features":
|
||||
parseFeatures(parser);
|
||||
break;
|
||||
case "failure":
|
||||
if ("urn:ietf:params:xml:ns:xmpp-sasl".equals(parser.getNamespace(null))) {
|
||||
final SASLFailure failure = PacketParserUtils.parseSASLFailure(parser);
|
||||
getSASLAuthentication().authenticationFailed(failure);
|
||||
}
|
||||
break;
|
||||
case "error":
|
||||
// Some BOSH error isn't stream error.
|
||||
if ("urn:ietf:params:xml:ns:xmpp-streams".equals(parser.getNamespace(null))) {
|
||||
|
@ -522,6 +520,9 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection {
|
|||
StanzaError.Builder builder = PacketParserUtils.parseError(parser);
|
||||
throw new XMPPException.XMPPErrorException(null, builder.build());
|
||||
}
|
||||
default:
|
||||
parseAndProcessNonza(parser);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue