Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Leicht Vogt2013-11-25 09:26:46 +0000
committerStephan Leicht Vogt2013-11-25 10:06:55 +0000
commit0c745d8fd2a695b6170f477b40f3d4929ab02867 (patch)
tree332e8b1fe1ef2b0e8b0dfe79f66055b708d6665d
parent9bd8dee9403684ee35f0b41bb29b4208a02aa807 (diff)
downloadorg.eclipse.scout.rt-0c745d8fd2a695b6170f477b40f3d4929ab02867.tar.gz
org.eclipse.scout.rt-0c745d8fd2a695b6170f477b40f3d4929ab02867.tar.xz
org.eclipse.scout.rt-0c745d8fd2a695b6170f477b40f3d4929ab02867.zip
bug 422444: [Commons] Base64Utility decode uses havyweight String Regex function
https://bugs.eclipse.org/bugs/show_bug.cgi?id=422444 Havyweight replaceAll function replaced with lightweight if-call. Change-Id: If82c349db692af0ba991b67ef6e6c8b477086f65 Reviewed-on: https://git.eclipse.org/r/18804 Tested-by: Hudson CI Reviewed-by: Stephan Leicht Vogt <stephan.leicht@bsiag.com> IP-Clean: Stephan Leicht Vogt <stephan.leicht@bsiag.com>
-rw-r--r--org.eclipse.scout.commons.test/src/org/eclipse/scout/commons/Base64UtilityTest.java37
-rw-r--r--org.eclipse.scout.commons/src/org/eclipse/scout/commons/Base64Utility.java84
2 files changed, 99 insertions, 22 deletions
diff --git a/org.eclipse.scout.commons.test/src/org/eclipse/scout/commons/Base64UtilityTest.java b/org.eclipse.scout.commons.test/src/org/eclipse/scout/commons/Base64UtilityTest.java
new file mode 100644
index 0000000000..a0648c535a
--- /dev/null
+++ b/org.eclipse.scout.commons.test/src/org/eclipse/scout/commons/Base64UtilityTest.java
@@ -0,0 +1,37 @@
+package org.eclipse.scout.commons;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import org.junit.Test;
+
+public class Base64UtilityTest {
+ private static final String TEST_STRING_SHORT = "Lo";
+
+ private static final String TEST_STRING_LONG = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut nisi dignissim leo sagittis tincidunt. Curabitur porttitor, magna ut consequat vestibulum, diam nibh faucibus quam, ac ultrices odio ante hendrerit mauris. Praesent id massa malesuada, mollis tortor eu, sagittis nisi. Sed sagittis orci vel dui gravida, nec euismod neque aliquet. Phasellus mattis augue ut dolor eleifend, a lacinia ligula vestibulum. Pellentesque placerat velit accumsan lorem vestibulum dignissim. Etiam eu egestas ante, quis porta erat. Suspendisse tempus a turpis condimentum elementum. Vestibulum iaculis augue quis mi vulputate fermentum ac vel nisl. Phasellus ac pellentesque velit, id dapibus nibh. Integer vitae ipsum ante. Aenean ultricies, velit placerat facilisis malesuada, lorem tortor convallis mauris, at congue felis tellus at tellus." +
+ "Etiam interdum turpis non nibh laoreet tincidunt. Aliquam viverra massa ut tristique commodo. Donec quis fringilla nunc. Suspendisse mattis, ante at tempus fringilla, nulla lorem vestibulum est, in pharetra nisl sem vel metus. Donec id facilisis lacus, ac pellentesque lectus. Morbi rhoncus sem ac elit euismod, non cursus risus euismod. Nunc magna dolor, accumsan eget lectus sit amet, dignissim venenatis magna. Nulla facilisi. Cras tristique erat sit amet nunc feugiat, vel placerat tortor iaculis. Donec convallis, eros quis aliquet iaculis, felis ipsum dapibus velit, quis molestie quam mi vitae neque. In scelerisque, erat a iaculis adipiscing, mauris tellus facilisis libero, pharetra semper elit dolor quis velit. Proin odio sapien, rutrum vitae posuere vitae, vulputate porttitor tortor. Nullam molestie leo leo, non mattis sem sollicitudin eu." +
+ "Quisque imperdiet sapien at dolor lacinia, ullamcorper tincidunt velit tempor. Integer commodo scelerisque tellus, eu vehicula dui molestie id. Ut et eros ut arcu rutrum semper. Phasellus pretium est tellus, ut sodales felis vehicula eget. Donec magna nisl, viverra eu nibh ac, porta pellentesque eros. In molestie metus a massa tincidunt fringilla. Integer at sem vestibulum, eleifend nibh id, laoreet urna. Aenean malesuada congue mauris dapibus bibendum. Donec tellus felis, vehicula eu consectetur vel, fringilla id nunc. Maecenas ligula erat, tristique sed pellentesque a, fermentum et nisi. Proin ultricies molestie quam, in faucibus urna semper quis. Ut hendrerit leo nec est gravida venenatis. Proin lacus odio, imperdiet quis diam sit amet, tempus tincidunt eros. Nunc in dolor vel eros porta egestas. In dignissim mauris non orci mattis, nec feugiat odio suscipit." +
+ "Nunc feugiat est ante, id molestie enim interdum at. Integer vitae dignissim sapien. Nunc ultrices dui vitae ultricies ultrices. Donec cursus nulla nec laoreet vehicula. Donec lectus lorem, vehicula a eleifend lacinia, viverra vel dolor. Cras tincidunt ligula ligula, non lacinia odio varius vel. Pellentesque porta eros eget odio ornare, egestas vulputate metus vestibulum. Curabitur ac vehicula ipsum, vel interdum lectus. Curabitur porttitor nunc nunc, non lobortis purus ultricies at. Donec in nisl a lacus faucibus eleifend eget et ante. Sed sed euismod est. Vivamus semper massa facilisis erat lobortis, vel vulputate elit volutpat." +
+ "Sed placerat odio turpis, vitae tristique purus egestas vitae. Etiam eros erat, tristique nec volutpat eu, gravida sit amet lectus. Proin non fringilla elit, et elementum dui. Proin faucibus enim nec bibendum ultrices. Cras facilisis et nunc et hendrerit. Praesent ac dolor sed tellus consequat congue. Maecenas et elit ut lorem cursus ullamcorper.";
+
+ @Test
+ public void encodeDecodeTestShort() throws Exception {
+ String encode = Base64Utility.encode(TEST_STRING_SHORT.getBytes());
+ byte[] decode = Base64Utility.decode(encode);
+ assertArrayEquals(TEST_STRING_SHORT.getBytes(), decode);
+ }
+
+ @Test
+ public void encodeDecodeTestLong() throws Exception {
+ String encode = Base64Utility.encode(TEST_STRING_LONG.getBytes());
+ byte[] decode = Base64Utility.decode(encode);
+ assertArrayEquals(TEST_STRING_LONG.getBytes(), decode);
+ }
+
+ @Test
+ public void encodeDecodeTestLongAndStringChangedToBlocks() throws Exception {
+ String encode = Base64Utility.encode(TEST_STRING_LONG.getBytes());
+ encode = StringUtility.wrapText(encode, 80);
+ byte[] decode = Base64Utility.decode(encode);
+ assertArrayEquals(TEST_STRING_LONG.getBytes(), decode);
+ }
+}
diff --git a/org.eclipse.scout.commons/src/org/eclipse/scout/commons/Base64Utility.java b/org.eclipse.scout.commons/src/org/eclipse/scout/commons/Base64Utility.java
index fe155c2704..1b8b572dec 100644
--- a/org.eclipse.scout.commons/src/org/eclipse/scout/commons/Base64Utility.java
+++ b/org.eclipse.scout.commons/src/org/eclipse/scout/commons/Base64Utility.java
@@ -4,13 +4,21 @@
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
- *
+ *
* Contributors:
* BSI Business Systems Integration AG - initial API and implementation
******************************************************************************/
package org.eclipse.scout.commons;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.eclipse.scout.commons.logger.IScoutLogger;
+import org.eclipse.scout.commons.logger.ScoutLogManager;
+
public final class Base64Utility {
+ private static final IScoutLogger LOG = ScoutLogManager.getLogger(Base64Utility.class);
private Base64Utility() {
}
@@ -71,32 +79,64 @@ public final class Base64Utility {
* @return A <code>byte[]</code> containing the decoded data block.
*/
public static byte[] decode(String string) {
- string = string.replaceAll("[^A-Za-z0-9+/=]", "");
- int length = string.length();
+ int length = string == null ? 0 : string.length();
if (length == 0) {
return new byte[0];
}
- int pad = (string.charAt(length - 2) == '=') ? 2 :
- (string.charAt(length - 1) == '=') ? 1 : 0;
- int size = length * 3 / 4 - pad;
- byte[] buffer = new byte[size];
- int block;
- int i = 0;
- int index = 0;
- while (i < length) {
- block = (ALPHABET.indexOf(string.charAt(i++)) & 0xff) << 18 |
- (ALPHABET.indexOf(string.charAt(i++)) & 0xff) << 12 |
- (ALPHABET.indexOf(string.charAt(i++)) & 0xff) << 6 |
- (ALPHABET.indexOf(string.charAt(i++)) & 0xff);
- buffer[index++] = (byte) (block >>> 16);
- if (index < size) {
- buffer[index++] = (byte) ((block >>> 8) & 0xff);
- }
- if (index < size) {
- buffer[index++] = (byte) (block & 0xff);
+ P_Base64InputStream is = new P_Base64InputStream(string);
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+
+ int c1, c2, c3, c4;
+ try {
+ c1 = is.read();
+ c2 = is.read();
+ c3 = is.read();
+ c4 = is.read();
+ while (c1 >= 0 || c2 >= 0 || c3 >= 0 || c4 >= 0) {
+ int block;
+ block = (ALPHABET.indexOf((char) c1) & 0xff) << 18 |
+ (ALPHABET.indexOf((char) c2) & 0xff) << 12 |
+ (ALPHABET.indexOf((char) c3) & 0xff) << 6 |
+ (ALPHABET.indexOf((char) c4) & 0xff);
+ buffer.write((byte) (block >>> 16));
+ if (c3 != -1) {
+ buffer.write((byte) ((block >>> 8) & 0xff));
+ }
+ if (c4 != -1) {
+ buffer.write((byte) (block & 0xff));
+ }
+ c1 = is.read();
+ c2 = is.read();
+ c3 = is.read();
+ c4 = is.read();
}
}
- return buffer;
+ catch (IOException e) {
+ LOG.error("IOException in Base64Utility.decode()", e);
+ return new byte[0];
+ }
+ return buffer.toByteArray();
}
+ private static class P_Base64InputStream extends InputStream {
+ private final String m_buffer;
+ private final int m_count;
+ private int m_pos = 0;
+
+ public P_Base64InputStream(String base64String) {
+ m_buffer = base64String;
+ m_count = base64String.length();
+ }
+
+ @Override
+ public int read() throws IOException {
+ while (m_pos < m_count) {
+ char ch = m_buffer.charAt(m_pos++);
+ if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch == '+') || (ch == '/')) {
+ return (ch & 0xFF);
+ }
+ }
+ return -1;
+ }
+ }
}

Back to the top