mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Matthew Swift
04.29.2012 a401798e5e8f3142b49858c958bfcb9d4a764ddb
Fix OPENDJ-369: Consider exposing base 64 encode/decode APIs

Required for OpenAM: expose Base64 encoding and decoding via ByteString.valueOfBase64() and ByteSequence.toBase64String().
1 files deleted
1 files renamed
8 files modified
360 ■■■■■ changed files
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/Base64.java 16 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/ByteSequence.java 8 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/ByteString.java 26 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java 17 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldif/AbstractLDIFReader.java 7 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldif/AbstractLDIFWriter.java 3 ●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/test/java/com/forgerock/opendj/util/Base64TestCase.java 196 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/ByteSequenceTestCase.java 7 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/ByteStringTestCase.java 76 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java 4 ●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/Base64.java
File was renamed from opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/util/Base64.java
@@ -24,7 +24,7 @@
 *      Copyright 2006-2009 Sun Microsystems, Inc.
 *      Portions copyright 2012 ForgeRock AS.
 */
package com.forgerock.opendj.util;
package org.forgerock.opendj.ldap;
import static com.forgerock.opendj.util.Validator.ensureNotNull;
import static org.forgerock.opendj.ldap.CoreMessages.ERR_BASE64_DECODE_INVALID_CHARACTER;
@@ -32,17 +32,19 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizedIllegalArgumentException;
import org.forgerock.opendj.ldap.ByteSequence;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ByteStringBuilder;
/**
 * This class provides methods for performing base64 encoding and decoding.
 * Base64 is a mechanism for encoding binary data in ASCII form by converting
 * sets of three bytes with eight significant bits each to sets of four bytes
 * with six significant bits each.
 * <p>
 * <b>NOTE:</b> the JDK class {@link javax.xml.bind.DatatypeConverter} provides
 * similar functionality, however the methods are better suited to the LDAP SDK.
 * For example, the JDK encoder does not handle array/offset/len parameters, and
 * the decoder ignores invalid Base64 data.
 */
public final class Base64 {
final class Base64 {
    /**
     * The set of characters that may be used in base64-encoded values.
     */
@@ -61,7 +63,7 @@
     * @throws NullPointerException
     *             If {@code base64} was {@code null}.
     */
    public static ByteString decode(final String base64) {
    static ByteString decode(final String base64) {
        ensureNotNull(base64);
        // The encoded value must have length that is a multiple of four
@@ -315,7 +317,7 @@
     * @throws NullPointerException
     *             If {@code bytes} was {@code null}.
     */
    public static String encode(final ByteSequence bytes) {
    static String encode(final ByteSequence bytes) {
        ensureNotNull(bytes);
        final StringBuilder buffer = new StringBuilder(4 * bytes.length() / 3);
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/ByteSequence.java
@@ -260,6 +260,14 @@
    ByteSequence subSequence(int start, int end);
    /**
     * Returns the Base64 encoded string representation of this byte string.
     *
     * @return The Base64 encoded string representation of this byte string.
     * @see ByteString#valueOfBase64(String)
     */
    String toBase64String();
    /**
     * Returns a byte array containing the bytes in this sequence in the same
     * order as this sequence. The length of the byte array will be the length
     * of this sequence.
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/ByteString.java
@@ -34,6 +34,8 @@
import java.util.Arrays;
import java.util.logging.Level;
import org.forgerock.i18n.LocalizedIllegalArgumentException;
import com.forgerock.opendj.util.StaticUtils;
/**
@@ -140,6 +142,23 @@
    }
    /**
     * Returns a byte string containing the Base64 decoded bytes of the provided
     * string.
     *
     * @param s
     *            The string to use.
     * @return The byte string containing the Base64 decoded bytes of the
     *         provided string.
     * @throws LocalizedIllegalArgumentException
     *             If the provided string does not contain valid Base64 encoded
     *             content.
     * @see #toBase64String()
     */
    public static ByteString valueOfBase64(final String s) {
        return Base64.decode(s);
    }
    /**
     * Returns a byte string containing the contents of the provided byte array.
     * <p>
     * This method differs from {@link #wrap(byte[])} in that it defensively
@@ -531,6 +550,13 @@
    /**
     * {@inheritDoc}
     */
    public String toBase64String() {
        return Base64.encode(this);
    }
    /**
     * {@inheritDoc}
     */
    public byte[] toByteArray() {
        return copyTo(new byte[length]);
    }
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java
@@ -200,6 +200,15 @@
            return new SubSequence(subOffset + start, end - start);
        }
        /**
         * {@inheritDoc}
         */
        @Override
        public String toBase64String() {
            return Base64.encode(this);
        }
        /**
         * {@inheritDoc}
         */
@@ -899,6 +908,14 @@
    /**
     * {@inheritDoc}
     */
    @Override
    public String toBase64String() {
        return Base64.encode(this);
    }
    /**
     * {@inheritDoc}
     */
    public byte[] toByteArray() {
        return copyTo(new byte[length]);
    }
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldif/AbstractLDIFReader.java
@@ -55,7 +55,6 @@
import org.forgerock.opendj.ldap.schema.Syntax;
import org.forgerock.opendj.ldap.schema.UnknownSchemaElementException;
import com.forgerock.opendj.util.Base64;
import com.forgerock.opendj.util.Validator;
/**
@@ -258,7 +257,7 @@
                }
                try {
                    value = Base64.decode(ldifLine.substring(pos));
                    value = ByteString.valueOfBase64(ldifLine.substring(pos));
                } catch (final LocalizedIllegalArgumentException e) {
                    // The value did not have a valid base64-encoding.
                    final LocalizableMessage message =
@@ -608,7 +607,7 @@
            final String base64DN = ldifLine.substring(pos);
            try {
                dnString = Base64.decode(base64DN).toString();
                dnString = ByteString.valueOfBase64(base64DN).toString();
            } catch (final LocalizedIllegalArgumentException e) {
                // The value did not have a valid base64-encoding.
                final LocalizableMessage message =
@@ -663,7 +662,7 @@
            }
            try {
                pair.value = Base64.decode(ldifLine.substring(pos)).toString();
                pair.value = ByteString.valueOfBase64(ldifLine.substring(pos)).toString();
            } catch (final LocalizedIllegalArgumentException e) {
                pair.key = null;
                return ldifLine;
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldif/AbstractLDIFWriter.java
@@ -39,7 +39,6 @@
import org.forgerock.opendj.ldap.controls.Control;
import org.forgerock.opendj.ldap.schema.Schema;
import com.forgerock.opendj.util.Base64;
import com.forgerock.opendj.util.Validator;
/**
@@ -335,7 +334,7 @@
            builder.setLength(0);
            builder.append(key);
            builder.append(":: ");
            builder.append(Base64.encode(value));
            builder.append(value.toBase64String());
        } else {
            builder.append(key);
            builder.append(": ");
opendj3/opendj-ldap-sdk/src/test/java/com/forgerock/opendj/util/Base64TestCase.java
File was deleted
opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/ByteSequenceTestCase.java
@@ -30,6 +30,8 @@
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import javax.xml.bind.DatatypeConverter;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -167,4 +169,9 @@
        Assert.assertTrue(bs.toString().equals(str));
    }
    @Test(dataProvider = "byteSequenceProvider")
    public void testToBase64String(final ByteSequence bs, final byte[] ba) throws Exception {
        final String base64 = bs.toBase64String();
        Assert.assertEquals(base64, DatatypeConverter.printBase64Binary(ba));
    }
}
opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/ByteStringTestCase.java
@@ -22,13 +22,16 @@
 *
 *
 *      Copyright 2010 Sun Microsystems, Inc.
 *      Portions copyright 2011 ForgeRock AS
 *      Portions copyright 2011-2012 ForgeRock AS
 */
package org.forgerock.opendj.ldap;
import java.util.Arrays;
import javax.xml.bind.DatatypeConverter;
import org.forgerock.i18n.LocalizedIllegalArgumentException;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@@ -51,6 +54,9 @@
        return new Object[][] {
            { ByteString.empty(), new byte[0] },
            { ByteString.valueOfBase64("AAA="), new byte[] { 0x00, 0x00 }},
            { ByteString.valueOfBase64("AAAA"), new byte[] { 0x00, 0x00, 0x00 }},
            { ByteString.valueOfBase64("AAAAAA=="), new byte[] { 0x00, 0x00, 0x00, 0x00 }},
            { ByteString.valueOf(1),
                new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01 } },
            { ByteString.valueOf(Integer.MAX_VALUE),
@@ -165,4 +171,72 @@
    public void testUndersizedToLong() {
        ByteString.wrap(new byte[] { (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03 }).toLong();
    }
    /**
     * Base 64 invalid test data provider.
     *
     * @return Returns an array of invalid encoded base64 data.
     */
    @DataProvider(name = "invalidBase64Data")
    public Object[][] createInvalidBase64Data() {
        // FIXME: fix cases ==== and ==x=
        return new Object[][] { { "=" }, { "==" }, { "===" }, { "A" }, { "AA" }, { "AAA" },
            { "AA`=" }, { "AA~=" }, { "AA!=" }, { "AA@=" }, { "AA#=" }, { "AA$=" }, { "AA%=" },
            { "AA^=" }, { "AA*=" }, { "AA(=" }, { "AA)=" }, { "AA_=" }, { "AA-=" }, { "AA{=" },
            { "AA}=" }, { "AA|=" }, { "AA[=" }, { "AA]=" }, { "AA\\=" }, { "AA;=" }, { "AA'=" },
            { "AA\"=" }, { "AA:=" }, { "AA,=" }, { "AA.=" }, { "AA<=" }, { "AA>=" }, { "AA?=" },
            { "AA;=" } };
    }
    /**
     * Base 64 valid test data provider.
     *
     * @return Returns an array of decoded and valid encoded base64 data.
     */
    @DataProvider(name = "validBase64Data")
    public Object[][] createValidBase64Data() {
        return new Object[][] {
            { "", "" },
            { "00", "AA==" },
            { "01", "AQ==" },
            { "02", "Ag==" },
            { "03", "Aw==" },
            { "04", "BA==" },
            { "05", "BQ==" },
            { "06", "Bg==" },
            { "07", "Bw==" },
            { "0000", "AAA=" },
            { "000000", "AAAA" },
            { "00000000", "AAAAAA==" },
            {
                "000102030405060708090a0b0c0d0e0f" + "101112131415161718191a1b1c1d1e1f"
                        + "202122232425262728292a2b2c2d2e2f" + "303132333435363738393a3b3c3d3e3f"
                        + "404142434445464748494a4b4c4d4e4f" + "505152535455565758595a5b5c5d5e5f"
                        + "606162636465666768696a6b6c6d6e6f" + "707172737475767778797a7b7c7d7e7f"
                        + "808182838485868788898a8b8c8d8e8f" + "909192939495969798999a9b9c9d9e9f"
                        + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
                        + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
                        + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
                "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4v"
                        + "MDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5f"
                        + "YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6P"
                        + "kJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/"
                        + "wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v"
                        + "8PHy8/T19vf4+fr7/P3+/w==" }, };
    }
    @Test(dataProvider = "invalidBase64Data",
            expectedExceptions = { LocalizedIllegalArgumentException.class })
    public void testValueOfBase64ThrowsLIAE(final String invalidBase64) throws Exception {
        Assert.fail("Expected exception but got result: "
                + Arrays.toString(new ByteString[] { ByteString.valueOfBase64(invalidBase64) }));
    }
    @Test(dataProvider = "validBase64Data")
    public void testValueOfBase64(final String hexData, final String encodedData) throws Exception {
        final byte[] data = DatatypeConverter.parseHexBinary(hexData);
        final byte[] decodedData = ByteString.valueOfBase64(encodedData).toByteArray();
        Assert.assertEquals(decodedData, data);
    }
}
opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java
@@ -54,8 +54,6 @@
import org.forgerock.opendj.ldap.requests.Requests;
import org.forgerock.opendj.ldap.responses.Result;
import com.forgerock.opendj.util.Base64;
/**
 * A tool that can be used to issue Compare requests to the Directory Server.
 */
@@ -299,7 +297,7 @@
            if (nextChar == ':') {
                final String base64 = remainder.substring(1, remainder.length());
                try {
                    attributeVal = Base64.decode(base64);
                    attributeVal = ByteString.valueOfBase64(base64);
                } catch (final LocalizedIllegalArgumentException e) {
                    println(INFO_COMPARE_CANNOT_BASE64_DECODE_ASSERTION_VALUE.get());
                    return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();