Author: markt Date: Wed Mar 20 10:43:46 2013 New Revision: 1458748 URL: http://svn.apache.org/r1458748 Log: Replace Tomcat's own base64 encoder with the one from the JRE. Deprecate Tomcat's encoder which will be removed in Tomcat 8.
Modified: tomcat/tc7.0.x/trunk/ (props changed) tomcat/tc7.0.x/trunk/java/org/apache/catalina/ant/AbstractCatalinaTask.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/realm/JNDIRealm.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/Base64.java tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TestNonLoginAndBasicAuthenticator.java tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TestSSOnonLoginAndBasicAuthenticator.java Propchange: tomcat/tc7.0.x/trunk/ ------------------------------------------------------------------------------ Merged /tomcat/trunk:r1458738-1458739 Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ant/AbstractCatalinaTask.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ant/AbstractCatalinaTask.java?rev=1458748&r1=1458747&r2=1458748&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ant/AbstractCatalinaTask.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ant/AbstractCatalinaTask.java Wed Mar 20 10:43:46 2013 @@ -26,9 +26,10 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; -import java.nio.charset.Charset; -import org.apache.catalina.util.Base64; +import javax.xml.bind.DatatypeConverter; + +import org.apache.tomcat.util.buf.B2CConverter; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; @@ -201,8 +202,8 @@ public abstract class AbstractCatalinaTa // Set up an authorization header with our credentials String input = username + ":" + password; - String output = - Base64.encode(input.getBytes(Charset.defaultCharset())); + String output = DatatypeConverter.printBase64Binary( + input.getBytes(B2CConverter.ISO_8859_1)); hconn.setRequestProperty("Authorization", "Basic " + output); Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java?rev=1458748&r1=1458747&r2=1458748&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java Wed Mar 20 10:43:46 2013 @@ -27,6 +27,7 @@ import javax.security.auth.Subject; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import javax.servlet.http.HttpServletResponse; +import javax.xml.bind.DatatypeConverter; import org.apache.catalina.LifecycleException; import org.apache.catalina.connector.Request; @@ -283,7 +284,7 @@ public class SpnegoAuthenticator extends // Send response token on success and failure response.setHeader("WWW-Authenticate", "Negotiate " - + Base64.encode(outToken)); + + DatatypeConverter.printBase64Binary(outToken)); if (principal != null) { register(request, response, principal, Constants.SPNEGO_METHOD, Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/realm/JNDIRealm.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/realm/JNDIRealm.java?rev=1458748&r1=1458747&r2=1458748&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/realm/JNDIRealm.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/realm/JNDIRealm.java Wed Mar 20 10:43:46 2013 @@ -52,6 +52,7 @@ import javax.naming.directory.DirContext import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; +import javax.xml.bind.DatatypeConverter; import org.apache.catalina.LifecycleException; import org.apache.catalina.util.Base64; @@ -1575,7 +1576,8 @@ public class JNDIRealm extends RealmBase password = password.substring(5); md.reset(); md.update(credentials.getBytes(Charset.defaultCharset())); - String digestedPassword = Base64.encode(md.digest()); + String digestedPassword = + DatatypeConverter.printBase64Binary(md.digest()); validated = password.equals(digestedPassword); } } else if (password.startsWith("{SSHA}")) { Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/Base64.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/Base64.java?rev=1458748&r1=1458747&r2=1458748&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/Base64.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/Base64.java Wed Mar 20 10:43:46 2013 @@ -17,7 +17,8 @@ package org.apache.catalina.util; -import org.apache.tomcat.util.buf.B2CConverter; +import javax.xml.bind.DatatypeConverter; + import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.buf.CharChunk; @@ -33,16 +34,12 @@ import org.apache.tomcat.util.buf.CharCh */ public final class Base64 { - private static final int BASELENGTH = 255; - private static final int LOOKUPLENGTH = 64; - private static final int TWENTYFOURBITGROUP = 24; - private static final int EIGHTBIT = 8; - private static final int SIXTEENBIT = 16; - private static final int FOURBYTE = 4; - private static final int SIGN = -128; - private static final byte PAD = (byte) '='; - private static byte [] base64Alphabet = new byte[BASELENGTH]; - private static byte [] lookUpBase64Alphabet = new byte[LOOKUPLENGTH]; + private static final int BASELENGTH = 255; + private static final int LOOKUPLENGTH = 64; + private static final int FOURBYTE = 4; + private static final byte PAD = (byte) '='; + private static final byte [] base64Alphabet = new byte[BASELENGTH]; + private static final byte [] lookUpBase64Alphabet = new byte[LOOKUPLENGTH]; static { @@ -84,93 +81,13 @@ public final class Base64 * * @param binaryData Array containing binary data to encode. * @return Base64-encoded data. + * + * @deprecated Use {@link DatatypeConverter#printBase64Binary(byte[])}. + * This method will be removed in Tomcat 8.0.x. */ + @Deprecated public static String encode(byte[] binaryData) { - int lengthDataBits = binaryData.length*EIGHTBIT; - int fewerThan24bits = lengthDataBits%TWENTYFOURBITGROUP; - int numberTriplets = lengthDataBits/TWENTYFOURBITGROUP; - byte encodedData[] = null; - - - if (fewerThan24bits != 0) - { - //data not divisible by 24 bit - encodedData = new byte[ (numberTriplets + 1 ) * 4 ]; - } - else - { - // 16 or 8 bit - encodedData = new byte[ numberTriplets * 4 ]; - } - - byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; - - int encodedIndex = 0; - int dataIndex = 0; - int i = 0; - //log.debug("number of triplets = " + numberTriplets); - for ( i = 0; i<numberTriplets; i++ ) - { - dataIndex = i*3; - b1 = binaryData[dataIndex]; - b2 = binaryData[dataIndex + 1]; - b3 = binaryData[dataIndex + 2]; - - //log.debug("b1= " + b1 +", b2= " + b2 + ", b3= " + b3); - - l = (byte)(b2 & 0x0f); - k = (byte)(b1 & 0x03); - - encodedIndex = i * 4; - byte val1 = ((b1 & SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0); - byte val2 = ((b2 & SIGN)==0)?(byte)(b2>>4):(byte)((b2)>>4^0xf0); - byte val3 = ((b3 & SIGN)==0)?(byte)(b3>>6):(byte)((b3)>>6^0xfc); - - encodedData[encodedIndex] = lookUpBase64Alphabet[ val1 ]; - //log.debug( "val2 = " + val2 ); - //log.debug( "k4 = " + (k<<4) ); - //log.debug( "vak = " + (val2 | (k<<4)) ); - encodedData[encodedIndex+1] = - lookUpBase64Alphabet[ val2 | ( k<<4 )]; - encodedData[encodedIndex+2] = - lookUpBase64Alphabet[ (l <<2 ) | val3 ]; - encodedData[encodedIndex+3] = lookUpBase64Alphabet[ b3 & 0x3f ]; - } - - // form integral number of 6-bit groups - dataIndex = i*3; - encodedIndex = i*4; - if (fewerThan24bits == EIGHTBIT ) - { - b1 = binaryData[dataIndex]; - k = (byte) ( b1 &0x03 ); - //log.debug("b1=" + b1); - //log.debug("b1<<2 = " + (b1>>2) ); - byte val1 = ((b1 & SIGN)==0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0); - encodedData[encodedIndex] = lookUpBase64Alphabet[ val1 ]; - encodedData[encodedIndex + 1] = lookUpBase64Alphabet[ k<<4 ]; - encodedData[encodedIndex + 2] = PAD; - encodedData[encodedIndex + 3] = PAD; - } - else if (fewerThan24bits == SIXTEENBIT) - { - - b1 = binaryData[dataIndex]; - b2 = binaryData[dataIndex +1 ]; - l = (byte) (b2 & 0x0f); - k = (byte) (b1 & 0x03); - - byte val1 = ((b1 & SIGN) == 0)?(byte)(b1>>2):(byte)((b1)>>2^0xc0); - byte val2 = ((b2 & SIGN) == 0)?(byte)(b2>>4):(byte)((b2)>>4^0xf0); - - encodedData[encodedIndex] = lookUpBase64Alphabet[ val1 ]; - encodedData[encodedIndex + 1] = - lookUpBase64Alphabet[ val2 | ( k<<4 )]; - encodedData[encodedIndex + 2] = lookUpBase64Alphabet[ l<<2 ]; - encodedData[encodedIndex + 3] = PAD; - } - - return new String(encodedData, B2CConverter.ISO_8859_1); + return DatatypeConverter.printBase64Binary(binaryData); } /** Modified: tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TestNonLoginAndBasicAuthenticator.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TestNonLoginAndBasicAuthenticator.java?rev=1458748&r1=1458747&r2=1458748&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TestNonLoginAndBasicAuthenticator.java (original) +++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TestNonLoginAndBasicAuthenticator.java Wed Mar 20 10:43:46 2013 @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletResponse; +import javax.xml.bind.DatatypeConverter; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -36,7 +37,6 @@ import org.apache.catalina.session.Manag import org.apache.catalina.startup.TesterServlet; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.TomcatBaseTest; -import org.apache.catalina.util.Base64; import org.apache.tomcat.util.buf.ByteChunk; /** @@ -612,7 +612,8 @@ public class TestNonLoginAndBasicAuthent password = aPassword; String userCredentials = username + ":" + password; byte[] credentialsBytes = ByteChunk.convertToBytes(userCredentials); - String base64auth = Base64.encode(credentialsBytes); + String base64auth = + DatatypeConverter.printBase64Binary(credentialsBytes); credentials= method + " " + base64auth; } Modified: tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TestSSOnonLoginAndBasicAuthenticator.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TestSSOnonLoginAndBasicAuthenticator.java?rev=1458748&r1=1458747&r2=1458748&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TestSSOnonLoginAndBasicAuthenticator.java (original) +++ tomcat/tc7.0.x/trunk/test/org/apache/catalina/authenticator/TestSSOnonLoginAndBasicAuthenticator.java Wed Mar 20 10:43:46 2013 @@ -21,6 +21,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.xml.bind.DatatypeConverter; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -34,7 +36,6 @@ import org.apache.catalina.deploy.Securi import org.apache.catalina.startup.TesterServlet; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.TomcatBaseTest; -import org.apache.catalina.util.Base64; import org.apache.tomcat.util.buf.ByteChunk; /** @@ -239,7 +240,8 @@ public class TestSSOnonLoginAndBasicAuth // the second access attempt should be sucessful String credentials = user + ":" + pwd; byte[] credentialsBytes = ByteChunk.convertToBytes(credentials); - String base64auth = Base64.encode(credentialsBytes); + String base64auth = + DatatypeConverter.printBase64Binary(credentialsBytes); String authLine = "Basic " + base64auth; List<String> auth = new ArrayList<String>(); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org