mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-27 00:32:07 +01:00
SMACK-264 Fix NPE in SASLMechanism
git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@11256 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
parent
197aa187d9
commit
8dcc226bb5
2 changed files with 76 additions and 24 deletions
|
@ -23,6 +23,7 @@ package org.jivesoftware.smack;
|
||||||
import org.jivesoftware.smack.filter.PacketIDFilter;
|
import org.jivesoftware.smack.filter.PacketIDFilter;
|
||||||
import org.jivesoftware.smack.packet.Bind;
|
import org.jivesoftware.smack.packet.Bind;
|
||||||
import org.jivesoftware.smack.packet.IQ;
|
import org.jivesoftware.smack.packet.IQ;
|
||||||
|
import org.jivesoftware.smack.packet.Packet;
|
||||||
import org.jivesoftware.smack.packet.Session;
|
import org.jivesoftware.smack.packet.Session;
|
||||||
import org.jivesoftware.smack.sasl.*;
|
import org.jivesoftware.smack.sasl.*;
|
||||||
|
|
||||||
|
@ -528,9 +529,8 @@ public class SASLAuthentication implements UserAuthentication {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void send(String stanza) throws IOException {
|
public void send(Packet stanza) {
|
||||||
connection.writer.write(stanza);
|
connection.sendPacket(stanza);
|
||||||
connection.writer.flush();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -22,6 +22,7 @@ package org.jivesoftware.smack.sasl;
|
||||||
|
|
||||||
import org.jivesoftware.smack.XMPPException;
|
import org.jivesoftware.smack.XMPPException;
|
||||||
import org.jivesoftware.smack.SASLAuthentication;
|
import org.jivesoftware.smack.SASLAuthentication;
|
||||||
|
import org.jivesoftware.smack.packet.Packet;
|
||||||
import org.jivesoftware.smack.util.Base64;
|
import org.jivesoftware.smack.util.Base64;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -110,24 +111,18 @@ public abstract class SASLMechanism implements CallbackHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void authenticate() throws IOException, XMPPException {
|
protected void authenticate() throws IOException, XMPPException {
|
||||||
StringBuilder stanza = new StringBuilder();
|
String authenticationText = null;
|
||||||
stanza.append("<auth mechanism=\"").append(getName());
|
|
||||||
stanza.append("\" xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">");
|
|
||||||
try {
|
try {
|
||||||
if(sc.hasInitialResponse()) {
|
if(sc.hasInitialResponse()) {
|
||||||
byte[] response = sc.evaluateChallenge(new byte[0]);
|
byte[] response = sc.evaluateChallenge(new byte[0]);
|
||||||
String authenticationText = Base64.encodeBytes(response,Base64.DONT_BREAK_LINES);
|
authenticationText = Base64.encodeBytes(response,Base64.DONT_BREAK_LINES);
|
||||||
if(authenticationText != null && !authenticationText.equals("")) {
|
|
||||||
stanza.append(authenticationText);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (SaslException e) {
|
} catch (SaslException e) {
|
||||||
throw new XMPPException("SASL authentication failed", e);
|
throw new XMPPException("SASL authentication failed", e);
|
||||||
}
|
}
|
||||||
stanza.append("</auth>");
|
|
||||||
|
|
||||||
// Send the authentication to the server
|
// Send the authentication to the server
|
||||||
getSASLAuthentication().send(stanza.toString());
|
getSASLAuthentication().send(new AuthMechanism(getName(), authenticationText));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -139,27 +134,23 @@ public abstract class SASLMechanism implements CallbackHandler {
|
||||||
* @throws IOException if an exception sending the response occurs.
|
* @throws IOException if an exception sending the response occurs.
|
||||||
*/
|
*/
|
||||||
public void challengeReceived(String challenge) throws IOException {
|
public void challengeReceived(String challenge) throws IOException {
|
||||||
// Build the challenge response stanza encoding the response text
|
|
||||||
StringBuilder stanza = new StringBuilder();
|
|
||||||
|
|
||||||
byte response[];
|
byte response[];
|
||||||
if(challenge != null) {
|
if(challenge != null) {
|
||||||
response = sc.evaluateChallenge(Base64.decode(challenge));
|
response = sc.evaluateChallenge(Base64.decode(challenge));
|
||||||
} else {
|
} else {
|
||||||
response = sc.evaluateChallenge(null);
|
response = sc.evaluateChallenge(new byte[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
String authenticationText = Base64.encodeBytes(response,Base64.DONT_BREAK_LINES);
|
Packet responseStanza;
|
||||||
if(authenticationText.equals("")) {
|
if (response == null) {
|
||||||
authenticationText = "=";
|
responseStanza = new Response();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
responseStanza = new Response(Base64.encodeBytes(response,Base64.DONT_BREAK_LINES));
|
||||||
}
|
}
|
||||||
|
|
||||||
stanza.append("<response xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">");
|
|
||||||
stanza.append(authenticationText);
|
|
||||||
stanza.append("</response>");
|
|
||||||
|
|
||||||
// Send the authentication to the server
|
// Send the authentication to the server
|
||||||
getSASLAuthentication().send(stanza.toString());
|
getSASLAuthentication().send(responseStanza);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -196,4 +187,65 @@ public abstract class SASLMechanism implements CallbackHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initiating SASL authentication by select a mechanism.
|
||||||
|
*/
|
||||||
|
public class AuthMechanism extends Packet {
|
||||||
|
final private String name;
|
||||||
|
final private String authenticationText;
|
||||||
|
|
||||||
|
public AuthMechanism(String name, String authenticationText) {
|
||||||
|
if (name == null) {
|
||||||
|
throw new NullPointerException("SASL mechanism name shouldn't be null.");
|
||||||
|
}
|
||||||
|
this.name = name;
|
||||||
|
this.authenticationText = authenticationText;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toXML() {
|
||||||
|
StringBuilder stanza = new StringBuilder();
|
||||||
|
stanza.append("<auth mechanism=\"").append(name);
|
||||||
|
stanza.append("\" xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">");
|
||||||
|
if (authenticationText != null &&
|
||||||
|
authenticationText.trim().length() > 0) {
|
||||||
|
stanza.append(authenticationText);
|
||||||
|
}
|
||||||
|
stanza.append("</auth>");
|
||||||
|
return stanza.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A SASL response stanza.
|
||||||
|
*/
|
||||||
|
public class Response extends Packet {
|
||||||
|
final private String authenticationText;
|
||||||
|
|
||||||
|
public Response() {
|
||||||
|
authenticationText = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Response(String authenticationText) {
|
||||||
|
if (authenticationText == null || authenticationText.trim().length() == 0) {
|
||||||
|
this.authenticationText = null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.authenticationText = authenticationText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toXML() {
|
||||||
|
StringBuilder stanza = new StringBuilder();
|
||||||
|
stanza.append("<response xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">");
|
||||||
|
if (authenticationText == null) {
|
||||||
|
stanza.append(authenticationText);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
stanza.append("=");
|
||||||
|
}
|
||||||
|
stanza.append("</response>");
|
||||||
|
return stanza.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue