From 401c37bd2889cbb9c539da7b27d7e6a0b9fd769a Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Tue, 29 Jan 2013 22:49:20 +0000 Subject: [PATCH] SMACK-404 Changed StringUtils.decodeBase64(String) behavior so that the method does not try to detect and decompress a gzip-compressed input. Refactored every use of the Base64.(de|en)code* methods to use the StringUtils (de|en)codeBase64 methods instead. git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@13416 b35dd754-fafc-0310-a699-88a17e54d16e --- .../smack/proxy/HTTPProxySocketFactory.java | 6 +++--- source/org/jivesoftware/smack/sasl/SASLMechanism.java | 8 ++++---- source/org/jivesoftware/smack/util/StringUtils.java | 11 ++++++++++- .../smackx/bytestreams/ibb/packet/DataTest.java | 4 ++-- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/source/org/jivesoftware/smack/proxy/HTTPProxySocketFactory.java b/source/org/jivesoftware/smack/proxy/HTTPProxySocketFactory.java index 9531f0407..3299eb410 100644 --- a/source/org/jivesoftware/smack/proxy/HTTPProxySocketFactory.java +++ b/source/org/jivesoftware/smack/proxy/HTTPProxySocketFactory.java @@ -9,7 +9,8 @@ import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import javax.net.SocketFactory; -import org.jivesoftware.smack.util.Base64; +import org.jivesoftware.smack.util.StringUtils; + import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -73,8 +74,7 @@ class HTTPProxySocketFactory { String password = proxy.getProxyPassword(); proxyLine = "\r\nProxy-Authorization: Basic " - + new String (Base64.encodeBytes((username + ":" - + password).getBytes("UTF-8"))); + + new String(StringUtils.encodeBase64(username + ":" + password)); } socket.getOutputStream().write((hostport + " HTTP/1.1\r\nHost: " + hostport + proxyLine + "\r\n\r\n").getBytes("UTF-8")); diff --git a/source/org/jivesoftware/smack/sasl/SASLMechanism.java b/source/org/jivesoftware/smack/sasl/SASLMechanism.java index cebd1bd12..854617141 100644 --- a/source/org/jivesoftware/smack/sasl/SASLMechanism.java +++ b/source/org/jivesoftware/smack/sasl/SASLMechanism.java @@ -23,7 +23,7 @@ package org.jivesoftware.smack.sasl; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.SASLAuthentication; import org.jivesoftware.smack.packet.Packet; -import org.jivesoftware.smack.util.Base64; +import org.jivesoftware.smack.util.StringUtils; import java.io.IOException; import java.util.Map; @@ -115,7 +115,7 @@ public abstract class SASLMechanism implements CallbackHandler { try { if(sc.hasInitialResponse()) { byte[] response = sc.evaluateChallenge(new byte[0]); - authenticationText = Base64.encodeBytes(response,Base64.DONT_BREAK_LINES); + authenticationText = StringUtils.encodeBase64(response, false); } } catch (SaslException e) { throw new XMPPException("SASL authentication failed", e); @@ -136,7 +136,7 @@ public abstract class SASLMechanism implements CallbackHandler { public void challengeReceived(String challenge) throws IOException { byte response[]; if(challenge != null) { - response = sc.evaluateChallenge(Base64.decode(challenge)); + response = sc.evaluateChallenge(StringUtils.decodeBase64(challenge)); } else { response = sc.evaluateChallenge(new byte[0]); } @@ -146,7 +146,7 @@ public abstract class SASLMechanism implements CallbackHandler { responseStanza = new Response(); } else { - responseStanza = new Response(Base64.encodeBytes(response,Base64.DONT_BREAK_LINES)); + responseStanza = new Response(StringUtils.encodeBase64(response, false)); } // Send the authentication to the server diff --git a/source/org/jivesoftware/smack/util/StringUtils.java b/source/org/jivesoftware/smack/util/StringUtils.java index 2c0bc3eec..2783a6a5b 100644 --- a/source/org/jivesoftware/smack/util/StringUtils.java +++ b/source/org/jivesoftware/smack/util/StringUtils.java @@ -501,12 +501,21 @@ public class StringUtils { /** * Decodes a base64 String. + * Unlike Base64.decode() this method does not try to detect and decompress a gzip-compressed input. * * @param data a base64 encoded String to decode. * @return the decoded String. */ public static byte[] decodeBase64(String data) { - return Base64.decode(data); + byte[] bytes; + try { + bytes = data.getBytes("UTF-8"); + } catch (java.io.UnsupportedEncodingException uee) { + bytes = data.getBytes(); + } + + bytes = Base64.decode(bytes, 0, bytes.length, Base64.NO_OPTIONS); + return bytes; } /** diff --git a/test-unit/org/jivesoftware/smackx/bytestreams/ibb/packet/DataTest.java b/test-unit/org/jivesoftware/smackx/bytestreams/ibb/packet/DataTest.java index d1902baae..812e3a889 100644 --- a/test-unit/org/jivesoftware/smackx/bytestreams/ibb/packet/DataTest.java +++ b/test-unit/org/jivesoftware/smackx/bytestreams/ibb/packet/DataTest.java @@ -20,7 +20,7 @@ import static org.mockito.Mockito.*; import java.util.Properties; import org.jivesoftware.smack.packet.IQ; -import org.jivesoftware.smack.util.Base64; +import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smackx.bytestreams.ibb.packet.Data; import org.jivesoftware.smackx.bytestreams.ibb.packet.DataPacketExtension; import org.junit.Test; @@ -53,7 +53,7 @@ public class DataTest { @Test public void shouldReturnValidIQStanzaXML() throws Exception { - String encodedData = Base64.encodeBytes("Test".getBytes()); + String encodedData = StringUtils.encodeBase64("Test"); String control = XMLBuilder.create("iq") .a("from", "romeo@montague.lit/orchard")