diff --git a/smack-core/src/main/java/org/jivesoftware/smack/sasl/SASLAnonymous.java b/smack-core/src/main/java/org/jivesoftware/smack/sasl/SASLAnonymous.java index d22a9942c..2332ead59 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/sasl/SASLAnonymous.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/sasl/SASLAnonymous.java @@ -27,8 +27,10 @@ import javax.security.auth.callback.CallbackHandler; */ public class SASLAnonymous extends SASLMechanism { + public static final String NAME = "ANONYMOUS"; + public String getName() { - return "ANONYMOUS"; + return NAME; } @Override @@ -43,8 +45,8 @@ public class SASLAnonymous extends SASLMechanism { } @Override - protected String getAuthenticationText() throws SmackException { - // TODO Auto-generated method stub + protected byte[] getAuthenticationText() throws SmackException { + // ANONYMOUS has no initial response, return null return null; } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/sasl/SASLMechanism.java b/smack-core/src/main/java/org/jivesoftware/smack/sasl/SASLMechanism.java index 3ed4b3ed2..1c92b35bc 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/sasl/SASLMechanism.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/sasl/SASLMechanism.java @@ -169,12 +169,28 @@ public abstract class SASLMechanism implements Comparable { protected abstract void authenticateInternal(CallbackHandler cbh) throws SmackException; private final void authenticate() throws SmackException, NotConnectedException { - String authenticationText = getAuthenticationText(); + byte[] authenticationBytes = getAuthenticationText(); + String authenticationText; + if (authenticationBytes != null) { + authenticationText = StringUtils.encodeBase64(authenticationBytes); + } else { + // RFC6120 6.4.2 "If the initiating entity needs to send a zero-length initial response, + // it MUST transmit the response as a single equals sign character ("="), which + // indicates that the response is present but contains no data." + authenticationText = "="; + } // Send the authentication to the server connection.sendPacket(new AuthMechanism(getName(), authenticationText)); } - protected abstract String getAuthenticationText() throws SmackException; + /** + * Should return the initial response of the SASL mechanism. The returned byte array will be + * send base64 encoded to the server. SASL mechanism are free to return null here. + * + * @return the initial response or null + * @throws SmackException + */ + protected abstract byte[] getAuthenticationText() throws SmackException; /** * The server is challenging the SASL mechanism for the stanza he just sent. Send a diff --git a/smack-core/src/main/java/org/jivesoftware/smack/sasl/packet/SaslStanzas.java b/smack-core/src/main/java/org/jivesoftware/smack/sasl/packet/SaslStanzas.java index 689fa4741..30098f4ba 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/sasl/packet/SaslStanzas.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/sasl/packet/SaslStanzas.java @@ -37,8 +37,11 @@ public class SaslStanzas { if (mechanism == null) { throw new NullPointerException("SASL mechanism shouldn't be null."); } + if (StringUtils.isNullOrEmpty(authenticationText)) { + throw new IllegalArgumentException("SASL authenticationText must not be null or empty (RFC6120 6.4.2)"); + } this.mechanism = mechanism; - this.authenticationText = StringUtils.returnIfNotEmptyTrimmed(authenticationText); + this.authenticationText = authenticationText; } @Override diff --git a/smack-sasl-javax/src/main/java/org/jivesoftware/smack/sasl/javax/SASLJavaXMechanism.java b/smack-sasl-javax/src/main/java/org/jivesoftware/smack/sasl/javax/SASLJavaXMechanism.java index c19289bdd..21aed4a2c 100644 --- a/smack-sasl-javax/src/main/java/org/jivesoftware/smack/sasl/javax/SASLJavaXMechanism.java +++ b/smack-sasl-javax/src/main/java/org/jivesoftware/smack/sasl/javax/SASLJavaXMechanism.java @@ -33,7 +33,6 @@ import javax.security.sasl.SaslException; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.sasl.SASLMechanism; -import org.jivesoftware.smack.util.StringUtils; public abstract class SASLJavaXMechanism extends SASLMechanism { @@ -107,19 +106,17 @@ public abstract class SASLJavaXMechanism extends SASLMechanism { } } - protected String getAuthenticationText() throws SmackException { - String authenticationText = null; + @Override + protected byte[] getAuthenticationText() throws SmackException { if (sc.hasInitialResponse()) { - byte[] response; try { - response = sc.evaluateChallenge(new byte[0]); + return sc.evaluateChallenge(new byte[0]); } catch (SaslException e) { throw new SmackException(e); } - authenticationText = StringUtils.encodeBase64(response, false); } - return authenticationText; + return null; } @Override diff --git a/smack-sasl-provided/src/main/java/org/jivesoftware/smack/sasl/provided/SASLDigestMD5Mechanism.java b/smack-sasl-provided/src/main/java/org/jivesoftware/smack/sasl/provided/SASLDigestMD5Mechanism.java index 72bc8dc7a..b0490caea 100644 --- a/smack-sasl-provided/src/main/java/org/jivesoftware/smack/sasl/provided/SASLDigestMD5Mechanism.java +++ b/smack-sasl-provided/src/main/java/org/jivesoftware/smack/sasl/provided/SASLDigestMD5Mechanism.java @@ -62,7 +62,7 @@ public class SASLDigestMD5Mechanism extends SASLMechanism { } @Override - protected String getAuthenticationText() throws SmackException { + protected byte[] getAuthenticationText() throws SmackException { // DIGEST-MD5 has no initial response, return null return null; }