From d7b7abc7ebd2efd04b9fcf835f97dbb45683e296 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Mon, 5 Aug 2019 22:20:36 +0200 Subject: [PATCH] Delete XML whitespace before feeding the Base64 decoder --- .../java/org/jivesoftware/smack/util/StringUtils.java | 10 ++++++++-- .../jivesoftware/smack/util/stringencoder/Base64.java | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/StringUtils.java b/smack-core/src/main/java/org/jivesoftware/smack/util/StringUtils.java index 26b7d4bee..261f8570d 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/StringUtils.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/StringUtils.java @@ -543,9 +543,15 @@ public class StringUtils { return cs.toString(); } - private static final Pattern XMLWHITESPACE = Pattern.compile("[\t\n\r ]"); + /** + * Defined by XML 1.0 § 2.3 as: + * S ::= (#x20 | #x9 | #xD | #xA)+ + * + * @see XML 1.0 § 2.3 + */ + private static final Pattern XML_WHITESPACE = Pattern.compile("[\t\n\r ]"); public static String deleteXmlWhitespace(String string) { - return XMLWHITESPACE.matcher(string).replaceAll(""); + return XML_WHITESPACE.matcher(string).replaceAll(""); } } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/stringencoder/Base64.java b/smack-core/src/main/java/org/jivesoftware/smack/util/stringencoder/Base64.java index eb71b5f7f..050321bcb 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/stringencoder/Base64.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/stringencoder/Base64.java @@ -19,6 +19,7 @@ package org.jivesoftware.smack.util.stringencoder; import java.nio.charset.StandardCharsets; import org.jivesoftware.smack.util.Objects; +import org.jivesoftware.smack.util.StringUtils; public class Base64 { @@ -57,6 +58,9 @@ public class Base64 { // TODO: We really should not mask the IllegalArgumentException. But some unit test depend on this behavior, like // ibb.packet.DataPacketExtension.shouldReturnNullIfDataIsInvalid(). public static final byte[] decode(String string) { + // xs:base64Binary may include XML whitespace which we need to delete before feeding the string into the Base64 + // decoder. See also XML Schema Part 2: Datatypes Second Edition § 3.2.16. + string = StringUtils.deleteXmlWhitespace(string); try { return base64encoder.decode(string); } catch (IllegalArgumentException e) {