QPID-8241 : Remove use of javax.xml.bind.DatatypeConverter
diff --git a/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBAMQP10V0UpgradeTest.java b/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBAMQP10V0UpgradeTest.java
index 2d8fd16..c8c5e9a 100644
--- a/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBAMQP10V0UpgradeTest.java
+++ b/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBAMQP10V0UpgradeTest.java
@@ -42,7 +42,6 @@
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.Session;
-import javax.xml.bind.DatatypeConverter;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -50,6 +49,7 @@
import org.apache.qpid.server.model.Protocol;
import org.apache.qpid.server.util.FileUtils;
+import org.apache.qpid.server.util.StringUtil;
import org.apache.qpid.server.virtualhostnode.berkeleydb.BDBVirtualHostNode;
import org.apache.qpid.systests.JmsTestBase;
import org.apache.qpid.tests.utils.ConfigItem;
@@ -117,7 +117,7 @@
{
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(content);
- return DatatypeConverter.printHexBinary(hash);
+ return StringUtil.toHex(hash);
}
@Override
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java b/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
index a335fd1..b0f50ab 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
@@ -36,6 +36,16 @@
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneOffset;
+import java.time.chrono.IsoChronology;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.time.format.DateTimeParseException;
+import java.time.temporal.ChronoField;
+import java.time.temporal.TemporalAccessor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -50,8 +60,6 @@
import java.util.UUID;
import java.util.regex.Pattern;
-import javax.xml.bind.DatatypeConverter;
-
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Defaults;
@@ -70,6 +78,22 @@
}
};
+ private static final DateTimeFormatter ISO_DATE_TIME_FORMAT = new DateTimeFormatterBuilder()
+ .parseCaseInsensitive()
+ .append(DateTimeFormatter.ISO_LOCAL_DATE)
+ .optionalStart()
+ .appendLiteral('T')
+ .append(DateTimeFormatter.ISO_LOCAL_TIME)
+ .optionalStart()
+ .appendOffsetId()
+ .optionalStart()
+ .appendLiteral('[')
+ .parseCaseSensitive()
+ .appendZoneRegionId()
+ .appendLiteral(']')
+ .toFormatter()
+ .withChronology(IsoChronology.INSTANCE);
+
static final AttributeValueConverter<Object> OBJECT_CONVERTER = new AttributeValueConverter<Object>()
{
@Override
@@ -538,9 +562,10 @@
{
try
{
- return DatatypeConverter.parseDateTime(interpolated).getTime();
+ return ISO_DATE_TIME_FORMAT.parse(interpolated)
+ .query(this::convertToDate);
}
- catch (IllegalArgumentException e1)
+ catch (DateTimeParseException e1)
{
throw new IllegalArgumentException("Cannot convert string '" + interpolated + "' to a Date."
+ " It is neither a ISO-8601 date or date time nor a string"
@@ -557,6 +582,18 @@
throw new IllegalArgumentException("Cannot convert type " + value.getClass() + " to a Date");
}
}
+
+ private Date convertToDate(TemporalAccessor t)
+ {
+ if(!t.isSupported(ChronoField.INSTANT_SECONDS))
+ {
+ t = LocalDateTime.of(LocalDate.from(t), LocalTime.MIN).atOffset(ZoneOffset.UTC);
+ }
+ return new Date((t.getLong(ChronoField.INSTANT_SECONDS) * 1000L)
+ + t.getLong(ChronoField.MILLI_OF_SECOND));
+
+
+ }
};
public static final AttributeValueConverter<Principal> PRINCIPAL_CONVERTER = new AttributeValueConverter<Principal>()
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/AutoGeneratedSelfSignedKeyStoreImpl.java b/broker-core/src/main/java/org/apache/qpid/server/security/AutoGeneratedSelfSignedKeyStoreImpl.java
index 244d802..f596a8d 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/AutoGeneratedSelfSignedKeyStoreImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/AutoGeneratedSelfSignedKeyStoreImpl.java
@@ -43,6 +43,7 @@
import java.security.cert.X509Certificate;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;
+import java.util.Base64;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
@@ -52,7 +53,6 @@
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
-import javax.xml.bind.DatatypeConverter;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
@@ -143,7 +143,7 @@
{
try
{
- return DatatypeConverter.printBase64Binary(_certificate.getEncoded());
+ return Base64.getEncoder().encodeToString(_certificate.getEncoded());
}
catch (CertificateEncodingException e)
{
@@ -154,7 +154,7 @@
@Override
public String getEncodedPrivateKey()
{
- return DatatypeConverter.printBase64Binary(_privateKey.getEncoded());
+ return Base64.getEncoder().encodeToString(_privateKey.getEncoded());
}
@Override
@@ -447,7 +447,7 @@
{
_disposition = "attachment; filename=\"" + name + ".pem\"";
StringBuilder certStringBuffer = new StringBuilder("-----BEGIN CERTIFICATE-----\n");
- String cert = DatatypeConverter.printBase64Binary(certificate.getEncoded());
+ String cert = Base64.getEncoder().encodeToString(certificate.getEncoded());
int offset = 0;
while(cert.length()-offset > 64)
{
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java b/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java
index 09029de..983a2a1 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java
@@ -32,6 +32,7 @@
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Arrays;
+import java.util.Base64;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
@@ -43,7 +44,6 @@
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
-import javax.xml.bind.DatatypeConverter;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
@@ -136,7 +136,7 @@
{
try
{
- return DatatypeConverter.printBase64Binary(_x509Certificate.getEncoded());
+ return Base64.getEncoder().encodeToString(_x509Certificate.getEncoded());
}
catch (CertificateEncodingException e)
{
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/auth/database/HashedUser.java b/broker-core/src/main/java/org/apache/qpid/server/security/auth/database/HashedUser.java
index 7db98db..b1ccf29 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/auth/database/HashedUser.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/auth/database/HashedUser.java
@@ -24,8 +24,7 @@
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
-
-import javax.xml.bind.DatatypeConverter;
+import java.util.Base64;
import org.apache.qpid.server.model.AuthenticationProvider;
import org.apache.qpid.server.util.ServerScopedRuntimeException;
@@ -179,7 +178,7 @@
{
byteArray[index++] = (byte) c;
}
- _encodedPassword = DatatypeConverter.printBase64Binary(byteArray).getBytes(StandardCharsets.UTF_8);
+ _encodedPassword = Base64.getEncoder().encodeToString(byteArray).getBytes(StandardCharsets.UTF_8);
}
@Override
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/AbstractScramAuthenticationManager.java b/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/AbstractScramAuthenticationManager.java
index 4c619ca..e8bb81e 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/AbstractScramAuthenticationManager.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/AbstractScramAuthenticationManager.java
@@ -26,6 +26,7 @@
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;
+import java.util.Base64;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -33,7 +34,6 @@
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.security.sasl.SaslException;
-import javax.xml.bind.DatatypeConverter;
import com.google.common.util.concurrent.ListenableFuture;
@@ -171,8 +171,8 @@
String password = passwordFields[PasswordField.SALT.ordinal()] + ","
+ "," // remove previously insecure salted password field
- + DatatypeConverter.printBase64Binary(storedKey) + ","
- + DatatypeConverter.printBase64Binary(serverKey) + ","
+ + Base64.getEncoder().encodeToString(storedKey) + ","
+ + Base64.getEncoder().encodeToString(serverKey) + ","
+ oldDefaultIterationCount;
upgradeUserPassword(user, password);
}
@@ -272,10 +272,10 @@
byte[] storedKey = MessageDigest.getInstance(getDigestName()).digest(clientKey);
byte[] serverKey = computeHmac(saltedPassword, "Server Key");
- return DatatypeConverter.printBase64Binary(salt) + ","
+ return Base64.getEncoder().encodeToString(salt) + ","
+ "," // leave insecure salted password field blank
- + DatatypeConverter.printBase64Binary(storedKey) + ","
- + DatatypeConverter.printBase64Binary(serverKey) + ","
+ + Base64.getEncoder().encodeToString(storedKey) + ","
+ + Base64.getEncoder().encodeToString(serverKey) + ","
+ iterationCount;
}
catch (NoSuchAlgorithmException e)
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationResultCacher.java b/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationResultCacher.java
index b034916..b18147d 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationResultCacher.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationResultCacher.java
@@ -32,7 +32,6 @@
import java.util.concurrent.TimeUnit;
import javax.security.auth.Subject;
-import javax.xml.bind.DatatypeConverter;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
@@ -42,6 +41,7 @@
import org.apache.qpid.server.security.auth.AuthenticationResult;
import org.apache.qpid.server.security.auth.SocketConnectionPrincipal;
+import org.apache.qpid.server.util.StringUtil;
public class AuthenticationResultCacher
{
@@ -147,7 +147,7 @@
credentialDigest = md.digest(credentialDigest);
}
- return DatatypeConverter.printHexBinary(credentialDigest);
+ return StringUtil.toHex(credentialDigest);
}
catch (NoSuchAlgorithmException e)
{
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/MD5AuthenticationProvider.java b/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/MD5AuthenticationProvider.java
index 189a78f..cf3e18f 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/MD5AuthenticationProvider.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/MD5AuthenticationProvider.java
@@ -24,12 +24,11 @@
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
+import java.util.Base64;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import javax.xml.bind.DatatypeConverter;
-
import org.apache.qpid.server.model.Broker;
import org.apache.qpid.server.model.ManagedObject;
import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
@@ -75,7 +74,7 @@
}
md.update(data);
- return DatatypeConverter.printBase64Binary(md.digest());
+ return Base64.getEncoder().encodeToString(md.digest());
}
@Override
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProviderImpl.java b/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProviderImpl.java
index 43ce269..6854bd5 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProviderImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2AuthenticationProviderImpl.java
@@ -32,6 +32,7 @@
import java.net.URLEncoder;
import java.security.GeneralSecurityException;
import java.security.Principal;
+import java.util.Base64;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -39,8 +40,6 @@
import java.util.Map;
import java.util.Set;
-import javax.xml.bind.DatatypeConverter;
-
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
@@ -276,7 +275,7 @@
String clientSecret = getClientSecret() == null ? "" : getClientSecret();
if (getTokenEndpointNeedsAuth())
{
- String encoded = DatatypeConverter.printBase64Binary((getClientId() + ":" + clientSecret).getBytes(UTF_8));
+ String encoded = Base64.getEncoder().encodeToString((getClientId() + ":" + clientSecret).getBytes(UTF_8));
connection.setRequestProperty("Authorization", "Basic " + encoded);
}
else
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/cloudfoundry/CloudFoundryOAuth2IdentityResolverService.java b/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/cloudfoundry/CloudFoundryOAuth2IdentityResolverService.java
index b9510b5..ae9e724 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/cloudfoundry/CloudFoundryOAuth2IdentityResolverService.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/oauth2/cloudfoundry/CloudFoundryOAuth2IdentityResolverService.java
@@ -30,11 +30,10 @@
import java.net.URL;
import java.security.GeneralSecurityException;
import java.security.Principal;
+import java.util.Base64;
import java.util.Collections;
import java.util.Map;
-import javax.xml.bind.DatatypeConverter;
-
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
@@ -108,7 +107,7 @@
connection.setRequestProperty("Accept-Charset", UTF_8.name());
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + UTF_8.name());
connection.setRequestProperty("Accept", "application/json");
- String encoded = DatatypeConverter.printBase64Binary((clientId + ":" + clientSecret).getBytes(UTF_8));
+ String encoded = Base64.getEncoder().encodeToString((clientId + ":" + clientSecret).getBytes(UTF_8));
connection.setRequestProperty("Authorization", "Basic " + encoded);
final Map<String,String> requestParameters = Collections.singletonMap("token", accessToken);
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/auth/sasl/scram/ScramSaslServer.java b/broker-core/src/main/java/org/apache/qpid/server/security/auth/sasl/scram/ScramSaslServer.java
index 9169ee8..8dddfbc 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/auth/sasl/scram/ScramSaslServer.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/auth/sasl/scram/ScramSaslServer.java
@@ -26,13 +26,13 @@
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
+import java.util.Base64;
import java.util.UUID;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.security.sasl.SaslException;
import javax.security.sasl.SaslServer;
-import javax.xml.bind.DatatypeConverter;
import org.apache.qpid.server.util.Strings;
@@ -128,7 +128,7 @@
_nonce = parts[3].substring(2) + UUID.randomUUID().toString();
_saltAndPassword = _authManager.getSaltAndPasswordKeys(_username);
- _serverFirstMessage = "r="+_nonce+",s="+ DatatypeConverter.printBase64Binary(_saltAndPassword.getSalt())+",i=" + _saltAndPassword.getIterationCount();
+ _serverFirstMessage = "r=" + _nonce + ",s=" + Base64.getEncoder().encodeToString(_saltAndPassword.getSalt()) + ",i=" + _saltAndPassword.getIterationCount();
return _serverFirstMessage.getBytes(ASCII);
}
@@ -202,7 +202,7 @@
}
byte[] serverKey = _saltAndPassword.getServerKey();
- String finalResponse = "v=" + DatatypeConverter.printBase64Binary(computeHmac(serverKey, authMessage));
+ String finalResponse = "v=" + Base64.getEncoder().encodeToString(computeHmac(serverKey, authMessage));
return finalResponse.getBytes(ASCII);
}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypter.java b/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypter.java
index 73a4f74..ed90d4f 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypter.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/encryption/AESKeyFileEncrypter.java
@@ -28,13 +28,13 @@
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
+import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
-import javax.xml.bind.DatatypeConverter;
import org.apache.qpid.server.util.Strings;
@@ -74,7 +74,7 @@
byte[] output = new byte[AES_INITIALIZATION_VECTOR_LENGTH + encryptedBytes.length];
System.arraycopy(ivbytes, 0, output, 0, AES_INITIALIZATION_VECTOR_LENGTH);
System.arraycopy(encryptedBytes, 0, output, AES_INITIALIZATION_VECTOR_LENGTH, encryptedBytes.length);
- return DatatypeConverter.printBase64Binary(output);
+ return Base64.getEncoder().encodeToString(output);
}
catch (IOException | InvalidAlgorithmParameterException | InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException e)
{
diff --git a/broker-core/src/main/java/org/apache/qpid/server/util/DataUrlUtils.java b/broker-core/src/main/java/org/apache/qpid/server/util/DataUrlUtils.java
index 08880c9..199e4da 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/util/DataUrlUtils.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/util/DataUrlUtils.java
@@ -19,14 +19,14 @@
package org.apache.qpid.server.util;
-import javax.xml.bind.DatatypeConverter;
+import java.util.Base64;
public class DataUrlUtils
{
public static String getDataUrlForBytes(final byte[] bytes)
{
StringBuilder inlineURL = new StringBuilder("data:;base64,");
- inlineURL.append(DatatypeConverter.printBase64Binary(bytes));
+ inlineURL.append(Base64.getEncoder().encodeToString(bytes));
return inlineURL.toString();
}
}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/util/StringUtil.java b/broker-core/src/main/java/org/apache/qpid/server/util/StringUtil.java
index b986370..8f785d1 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/util/StringUtil.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/util/StringUtil.java
@@ -25,15 +25,13 @@
import java.security.NoSuchAlgorithmException;
import java.util.Random;
-import javax.xml.bind.DatatypeConverter;
-
-
public class StringUtil
{
private static final String NUMBERS = "0123456789";
private static final String LETTERS = "abcdefghijklmnopqrstuvwxwy";
private static final String OTHERS = "_-";
private static final char[] CHARACTERS = (NUMBERS + LETTERS + LETTERS.toUpperCase() + OTHERS).toCharArray();
+ private static final char[] HEX = "0123456789ABCDEF".toCharArray();
private Random _random = new Random();
@@ -42,6 +40,16 @@
return String.valueOf(path).toLowerCase().startsWith("data:") ? "data:..." : path;
}
+ public static String toHex(byte[] bin)
+ {
+ StringBuilder result = new StringBuilder(2 * bin.length);
+ for (byte b : bin) {
+ result.append(HEX[(b >> 4) & 0xF]);
+ result.append(HEX[(b & 0xF)]);
+ }
+ return result.toString();
+ }
+
public String randomAlphaNumericString(int maxLength)
{
char[] result = new char[maxLength];
@@ -80,7 +88,7 @@
try
{
byte[] digest = MessageDigest.getInstance("MD5").digest(managerName.getBytes(StandardCharsets.UTF_8));
- builder.append(DatatypeConverter.printHexBinary(digest).toLowerCase());
+ builder.append(toHex(digest).toLowerCase());
}
catch (NoSuchAlgorithmException e)
{
diff --git a/broker-core/src/main/java/org/apache/qpid/server/util/Strings.java b/broker-core/src/main/java/org/apache/qpid/server/util/Strings.java
index 5a0953a..0e468fb 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/util/Strings.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/util/Strings.java
@@ -24,8 +24,8 @@
import java.io.Writer;
import java.nio.ByteBuffer;
import java.util.Arrays;
+import java.util.Base64;
import java.util.Collections;
-import java.util.Formatter;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
@@ -36,8 +36,6 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.xml.bind.DatatypeConverter;
-
/**
* Strings
@@ -139,7 +137,7 @@
throw new IllegalArgumentException("Cannot convert string '"+ base64String+ "'to a byte[] - it does not appear to be base64 data");
}
- return DatatypeConverter.parseBase64Binary(base64String);
+ return Base64.getDecoder().decode(base64String);
}
public static interface Resolver
diff --git a/broker-core/src/test/java/org/apache/qpid/server/model/AttributeValueConverterTest.java b/broker-core/src/test/java/org/apache/qpid/server/model/AttributeValueConverterTest.java
index 89057a1..341cc4b 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/model/AttributeValueConverterTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/model/AttributeValueConverterTest.java
@@ -131,7 +131,7 @@
new Date(1000),
converter.convert(iso8601DateTime, object));
- final String iso8601Date = "1970-01-02Z";
+ final String iso8601Date = "1970-01-02";
assertEquals("Cannot convert date expressed as ISO8601 date",
new Date(TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS)),
converter.convert(iso8601Date, object));
diff --git a/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java b/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
index 246329f..0ebfed9 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
@@ -301,7 +301,7 @@
public void testDateAttributeFromIso8601()
{
final String objectName = "myName";
- String date = "1970-01-01Z";
+ String date = "1970-01-01";
Map<String, Object> attributes = new HashMap<>();
attributes.put(TestSingleton.NAME, objectName);
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/NonJavaKeyStoreTest.java b/broker-core/src/test/java/org/apache/qpid/server/security/NonJavaKeyStoreTest.java
index e88bcc6..583ba8b 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/security/NonJavaKeyStoreTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/NonJavaKeyStoreTest.java
@@ -41,6 +41,7 @@
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -49,7 +50,6 @@
import java.util.concurrent.TimeUnit;
import javax.net.ssl.KeyManager;
-import javax.xml.bind.DatatypeConverter;
import org.junit.After;
import org.junit.Before;
@@ -130,7 +130,7 @@
if (pem)
{
kos.write("-----BEGIN PRIVATE KEY-----\n".getBytes());
- String base64encoded = DatatypeConverter.printBase64Binary(pvt.getEncoded());
+ String base64encoded = Base64.getEncoder().encodeToString(pvt.getEncoded());
while(base64encoded.length() > 76)
{
kos.write(base64encoded.substring(0,76).getBytes());
@@ -156,7 +156,7 @@
if (pem)
{
cos.write("-----BEGIN CERTIFICATE-----\n".getBytes());
- String base64encoded = DatatypeConverter.printBase64Binary(pub.getEncoded());
+ String base64encoded = Base64.getEncoder().encodeToString(pub.getEncoded());
while(base64encoded.length() > 76)
{
cos.write(base64encoded.substring(0,76).getBytes());
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/auth/database/Base64MD5PasswordFilePrincipalDatabaseTest.java b/broker-core/src/test/java/org/apache/qpid/server/security/auth/database/Base64MD5PasswordFilePrincipalDatabaseTest.java
index 6e9925c..d741cbc 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/security/auth/database/Base64MD5PasswordFilePrincipalDatabaseTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/auth/database/Base64MD5PasswordFilePrincipalDatabaseTest.java
@@ -34,12 +34,12 @@
import java.io.IOException;
import java.security.Principal;
import java.util.Arrays;
+import java.util.Base64;
import java.util.List;
import java.util.regex.Pattern;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.login.AccountNotFoundException;
-import javax.xml.bind.DatatypeConverter;
import org.junit.After;
import org.junit.Before;
@@ -59,7 +59,7 @@
static
{
- byte[] decoded = DatatypeConverter.parseBase64Binary(PASSWORD_B64MD5HASHED);
+ byte[] decoded = Base64.getDecoder().decode(PASSWORD_B64MD5HASHED);
PASSWORD_MD5_CHARS = new char[decoded.length];
for(int i = 0; i < decoded.length; i++)
{
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2MockEndpoint.java b/broker-core/src/test/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2MockEndpoint.java
index 61fdb56..6e80105 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2MockEndpoint.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/auth/manager/oauth2/OAuth2MockEndpoint.java
@@ -21,12 +21,12 @@
package org.apache.qpid.server.security.auth.manager.oauth2;
import java.io.IOException;
+import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import javax.xml.bind.DatatypeConverter;
class OAuth2MockEndpoint
{
@@ -44,7 +44,7 @@
response.setContentType("application/json");
if (_needsAuth)
{
- String expected = "Basic " + DatatypeConverter.printBase64Binary((OAuth2AuthenticationProviderImplTest.TEST_CLIENT_ID + ":" + OAuth2AuthenticationProviderImplTest.TEST_CLIENT_SECRET).getBytes(
+ String expected = "Basic " + Base64.getEncoder().encodeToString((OAuth2AuthenticationProviderImplTest.TEST_CLIENT_ID + ":" + OAuth2AuthenticationProviderImplTest.TEST_CLIENT_SECRET).getBytes(
OAuth2AuthenticationProviderImplTest.UTF8));
doAssertEquals("Authorization required",
expected,
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/auth/sasl/crammd5/CramMd5NegotiatorTest.java b/broker-core/src/test/java/org/apache/qpid/server/security/auth/sasl/crammd5/CramMd5NegotiatorTest.java
index 5bd686a..11e8e2b 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/security/auth/sasl/crammd5/CramMd5NegotiatorTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/auth/sasl/crammd5/CramMd5NegotiatorTest.java
@@ -31,8 +31,7 @@
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
-
-import javax.xml.bind.DatatypeConverter;
+import java.util.Base64;
import org.junit.After;
import org.junit.Before;
@@ -309,8 +308,8 @@
byte[] data = new String(VALID_USERPASSWORD).getBytes(StandardCharsets.UTF_8);
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(data);
- char[] password = DatatypeConverter.printBase64Binary(md.digest()).toCharArray();
+ char[] password = Base64.getEncoder().encodeToString(md.digest()).toCharArray();
when(_passwordSource.getPassword(eq(VALID_USERNAME))).thenReturn(password);
}
-}
\ No newline at end of file
+}
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/auth/sasl/scram/ScramNegotiatorTest.java b/broker-core/src/test/java/org/apache/qpid/server/security/auth/sasl/scram/ScramNegotiatorTest.java
index 48e6440..788c6e4 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/security/auth/sasl/scram/ScramNegotiatorTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/auth/sasl/scram/ScramNegotiatorTest.java
@@ -32,6 +32,7 @@
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.util.Arrays;
+import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -40,7 +41,6 @@
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.security.sasl.SaslException;
-import javax.xml.bind.DatatypeConverter;
import org.junit.After;
import org.junit.Before;
@@ -369,7 +369,7 @@
byte[] saltedPassword = generateSaltedPassword(passwordBytes, hmacName, _iterationCount, salt);
String clientFinalMessageWithoutProof =
- "c=" + DatatypeConverter.printBase64Binary(GS2_HEADER.getBytes(ASCII))
+ "c=" + Base64.getEncoder().encodeToString(GS2_HEADER.getBytes(ASCII))
+ ",r=" + nonce;
String authMessage = _clientFirstMessageBare + "," + serverFirstMessage + "," + clientFinalMessageWithoutProof;
@@ -384,7 +384,7 @@
byte[] serverKey = computeHmac(saltedPassword, "Server Key", hmacName);
_serverSignature = computeHmac(serverKey, authMessage, hmacName);
String finalMessageWithProof = clientFinalMessageWithoutProof
- + ",p=" + DatatypeConverter.printBase64Binary(clientProof);
+ + ",p=" + Base64.getEncoder().encodeToString(clientProof);
return finalMessageWithProof.getBytes();
}
@@ -460,4 +460,4 @@
Collections.<String, String>emptyMap());
return configuredObject;
}
-}
\ No newline at end of file
+}
diff --git a/broker-core/src/test/java/org/apache/qpid/server/transport/TCPandSSLTransportTest.java b/broker-core/src/test/java/org/apache/qpid/server/transport/TCPandSSLTransportTest.java
index 53d81f5..5c61df4 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/transport/TCPandSSLTransportTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/transport/TCPandSSLTransportTest.java
@@ -35,6 +35,7 @@
import java.net.SocketAddress;
import java.security.KeyStore;
import java.util.Arrays;
+import java.util.Base64;
import java.util.HashSet;
import java.util.List;
@@ -43,7 +44,6 @@
import javax.net.ssl.SSLHandshakeException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManagerFactory;
-import javax.xml.bind.DatatypeConverter;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -143,7 +143,7 @@
private void checkSSLExcluded(String clientProtocol, final Transport... transports) throws Exception
{
KeyStore keyStore = KeyStore.getInstance("JKS");
- keyStore.load(new ByteArrayInputStream(DatatypeConverter.parseBase64Binary(keystoreString)), "password".toCharArray());
+ keyStore.load(new ByteArrayInputStream(Base64.getDecoder().decode(keystoreString)), "password".toCharArray());
final SSLContext sslContext = SSLContext.getInstance("TLS");
diff --git a/broker-core/src/test/java/org/apache/qpid/server/transport/network/security/ssl/SSLUtilTest.java b/broker-core/src/test/java/org/apache/qpid/server/transport/network/security/ssl/SSLUtilTest.java
index 85833c0..7498b6a 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/transport/network/security/ssl/SSLUtilTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/transport/network/security/ssl/SSLUtilTest.java
@@ -36,6 +36,7 @@
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
+import java.util.Base64;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
@@ -45,7 +46,6 @@
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLEngineResult;
import javax.net.ssl.TrustManagerFactory;
-import javax.xml.bind.DatatypeConverter;
import org.junit.Test;
@@ -382,376 +382,376 @@
return clientEngine;
}
- private static byte[] TRUSTSTORE = DatatypeConverter.parseBase64Binary("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"
- );
+ private static byte[] TRUSTSTORE = Base64.getDecoder().decode("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"
+ );
// Subject: C=US, ST=private, L=province, O=city, CN=amqp.example.com
// X509v3 Subject Alternative Name:
// DNS:amqp.example.com
- private static byte[] KEYSTORE_1 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQOSYAAAJhjCCCYIwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_1 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQOSYAAAJhjCCCYIwDgYKKwYBBAEqAhEB"
+"AQUABIIJbpiFtanggVFjHUoiw5SBLNdnZpIbHao5oqJ6X7ra2IYE5pAYc8lA00P8GAt8ZfVFU/r1"
+"iSj26gWQzbnOqgICfLEe1UNPzMmutxCKHUkZIqlXgvc/Ga7eNhZFxLYoJcjSHcH3rXjfiLihR7fi"
+"ig7OavC88c3qnZld9SHcVSGquUQf65UlMDcLz5ro4JCWojxP0HqmaysTfVW0qGNSeGZcLM4F8siO"
@@ -828,7 +828,7 @@
// Subject: C=US, ST=private, L=province, O=city, CN=amqp.example.com
// X509v3 Subject Alternative Name:
// DNS:amqp1.example.com
- private static byte[] KEYSTORE_2 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQOxJAAAJhzCCCYMwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_2 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQOxJAAAJhzCCCYMwDgYKKwYBBAEqAhEB"
+"AQUABIIJb7B1Wn+7tr/UMY9U5S1jldHUBVs55D+bq9mEnI+15JSYH0HOgTeG2GHUMFg5s+P9sMX6"
+"OQL5awZrIrj/IBm3H1JGYvQ90tGNZpbIyPxx912QRfM9qwx4x9q8/EX4C4HqUYzHPrwhtdauGuM7"
+"0v2QMKG6ZKTb9f8VSXhhrntVA0V3hmHpFozpIm1vFjFHQvKwOk0H/ig0ZBCPEBGT447lSn8DyM42"
@@ -906,7 +906,7 @@
// Subject: C=US, ST=private, L=province, O=city, CN=amqp.example.com
// X509v3 Subject Alternative Name:
// DNS:amqp1.example.com, DNS:amqp2.example.com
- private static byte[] KEYSTORE_3 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQPpoAAAJiDCCCYQwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_3 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQPpoAAAJiDCCCYQwDgYKKwYBBAEqAhEB"
+"AQUABIIJcMesQe4dg1MYgHKVJCEUzCTpgJu3iTGwbnLOOhraGFn02YXh0Axbwws2hD0SH8XYF4h3"
+"pVI+YbXCWHiQzzn0/5mbSEAQcNBqPR+UTQULdDpI5jGWlf3oPRdqRLP/zAXzgb5N2bmbtdLQ02NK"
+"pvhRHNnLWmTBUokkBRUkh8kiUH3Xu8qIaJbK7ge0yglerFOK6kzic1PZwfvdzsoBxgb0CTHfzOK2"
@@ -985,7 +985,7 @@
// Subject: C=US, ST=private, L=province, O=city, CN=amqp.example.com
// X509v3 Subject Alternative Name:
// DNS:amqp1.example.com, DNS:*.example.com
- private static byte[] KEYSTORE_4 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQP7OAAAJiDCCCYQwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_4 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQP7OAAAJiDCCCYQwDgYKKwYBBAEqAhEB"
+"AQUABIIJcM11nToM9HiebwkA/+F9HTYV7bjlRO04+J09z8yiaerv82Iik4bIZjsl2V8IPIjUACxM"
+"7ToGh+WiELoTTDtcjTrfAxk8CM1buiugzN8do8/VwTHpIyDmKQoEY+54Ma2S1r52mqpl5B4sJT3U"
+"25g1ahx23Ytwti9TNKf5NGDLuKrVzbidoYNc2p8yFQe7gaktKVSmIyaZOjRrwm9quoopKNdB/73k"
@@ -1064,7 +1064,7 @@
// Subject: C=US, ST=private, L=province, O=city, CN=*.example.com
// X509v3 Subject Alternative Name:
// DNS:amqp1.example.net, DNS:*.org
- private static byte[] KEYSTORE_5 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQQX7AAAJhjCCCYIwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_5 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQQX7AAAJhjCCCYIwDgYKKwYBBAEqAhEB"
+"AQUABIIJbhJZvU/boEm92Z+W8kebBumXt/3K9qwGBIntSvmLduW4HIVcQ6+W3Q5Kbd7JiQbAut7b"
+"jicmydwnibrk7DimQAfCGsqud2ywj6eZwkXXa5ZNbuQKUQxP0me82awrQHYBkSaHJv2kwSdTQU7O"
+"la3CoRhtps1pInt00GjVbBEtBERcUrCVG7GtLbxKaOnDEaixK/ewS+7FnG83SfjEKCc5yso/aKaG"
@@ -1142,7 +1142,7 @@
// Subject: C=US, ST=private, L=province, O=city, CN=amqp.example.com
// X509v3 Subject Alternative Name:
// DNS:*
- private static byte[] KEYSTORE_6 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQQ/fAAAJhzCCCYMwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_6 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQQ/fAAAJhzCCCYMwDgYKKwYBBAEqAhEB"
+"AQUABIIJb3fs2zcPchqg7CgqHGxwNehB9UogWD1nbgdXd5RtWrIg8Gifp05miLKUjPxQp1/L0D36"
+"XVyqVO7hINZZE3wb9p7PR+bzo7DWMuPZ7+2YzcX2fSLRLcT2h88L3wHjblYH19Bk19/H44JI6j2H"
+"NwVXbAJRAR/6gQJWDewRmkDmSwbiLZ+0pYGz6P5lucXWFt8T2h+pAqz0Ui400RxrpM49AadvCK6v"
@@ -1219,7 +1219,7 @@
// Subject: C=US, ST=private, L=province, O=city, CN=*
// X509v3 Subject Alternative Name:
// DNS:amqp.example.org, DNS:amqp1.example.org, DNS:amqp2.example.org
- private static byte[] KEYSTORE_7 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQRyQAAAJhzCCCYMwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_7 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQRyQAAAJhzCCCYMwDgYKKwYBBAEqAhEB"
+"AQUABIIJb+vOaA9ERF3UR5QStjyDSVyHQneIIdOijZfbIxzvUHqZLXOZ6g03xiRs0mJ/RPgPPXo2"
+"EzR8U19YIljUdVw37yro4LpsH1buo+tzPC5p6PhLS28jaMCsLWKpnabAQfWptCgjSoOvKJ26XdxB"
+"NVJVPrBBscwP+ytgcwJ1wsAkkvOGazygincn7MJiBUNkd7HpJ2VjueeqgttwMKFKFifFdE390Has"
@@ -1296,7 +1296,7 @@
// Subject: C=US, ST=private, L=province, O=city, CN=*
// X509v3 Subject Alternative Name:
// DNS:amqp.example.org, DNS:example.org
- private static byte[] KEYSTORE_8 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQTD+AAAJhjCCCYIwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_8 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQTD+AAAJhjCCCYIwDgYKKwYBBAEqAhEB"
+"AQUABIIJbjpQpyUW3ZmF8P1gwRce6uQCTe3hN+4Mft8FrnZRnv4kx0YW1cMRfyig89HYONM8KsS0"
+"BMoqT3xa5iCQ/oHBymb82OC4YWSAomHFNT2JoDWelNQfnMqjGt3UETBP7g06+ulDjEA5+DAsdcxy"
+"Jtt3Tpfjpe0s0I5jY3blGPV8yQDCNkahhqET6Jvg3PJYsHBE3ssPkTNKI5rMjzbt36pai/HlmjdU"
@@ -1370,7 +1370,7 @@
);
// Subject: C=US, ST=private, L=province, O=city, CN=amqp.example.org
- private static byte[] KEYSTORE_9 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQTqYAAAJhjCCCYIwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_9 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQTqYAAAJhjCCCYIwDgYKKwYBBAEqAhEB"
+"AQUABIIJbnd59Bys8FgK8FREpm5Vsbq0uIbSE3nZFBNRVaYostRXeNA1fJok01wXBqrf05NfelKj"
+"+ttyFHwE8AKzLfF6vDusoEH4r3HUaQWoWMiOfCzljxjtrr/eQQFx92dX5+Z17BH4+92HZUzVPbSg"
+"31eoaZ24lTO7X8XXq0a43mnC/m3Vs9K590oCfXSDRsx8Ucr0VbUjR8jyLMxE6f4/cxBIhg2PTzCi"
@@ -1445,7 +1445,7 @@
);
// Subject: C=US, ST=private, L=province, O=city, CN=*.example.org
- private static byte[] KEYSTORE_10 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQT/DAAAJhzCCCYMwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_10 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQT/DAAAJhzCCCYMwDgYKKwYBBAEqAhEB"
+"AQUABIIJb5zVRh9eulhVb9JI6dbHdLyWN/AwqIfERSIFCr/n0jn7MvWHPiMYQtYtzv+z7bkNVTv+"
+"Uec6wagRxHGu4bjcVuIs6zX2lUrO0L5rN3Jwcbu6bpMIxw7sAPw4/k7Kgvf1ddSOIn4WGiHrJf8G"
+"WvMy3rs9dnxSe8Z+TvUBn3yfFemMRpwnfGn6TuJsdBfzU/bm9dX8RBjMmwQgyHqVgzuvJtAkaQb8"
@@ -1519,7 +1519,7 @@
);
// Subject: C=US, ST=private, L=province, O=city, CN=*.org
- private static byte[] KEYSTORE_11 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQUx1AAAJhjCCCYIwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_11 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQUx1AAAJhjCCCYIwDgYKKwYBBAEqAhEB"
+"AQUABIIJbuNPa7B2d1Mjkq6EBTzELi9V6XgirTYklPyKB3sQ5DUjlK+KoAsUI4oqAGOYPJDzHteq"
+"ocv5Dj2+741/Pi5Y6DDvls+6fHrmlJk3QOuVJT4yaI5vo9FJ3FUCUyDohvYrRfpA6gfTfO+QU6DI"
+"9G+D4+6gZtz2k4tdoFymtLQRzBS7+L3pFzl5uP7FA1UVWRZlHwsFyLmEmQhZlZcecYtCdTr018iV"
@@ -1593,7 +1593,7 @@
);
// Subject: C=US, ST=private, L=province, O=city, CN=*.*.org
- private static byte[] KEYSTORE_12 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQVfLAAAJhjCCCYIwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_12 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQVfLAAAJhjCCCYIwDgYKKwYBBAEqAhEB"
+"AQUABIIJbrIYGAiHi9UXY3+A7AqtiNSK6KUzH4bilTLdy875582mryHmiv7372P049JZ2NtA0FXk"
+"z/Idna6VGQmQfC7V/RWYpcCiiDcNFwpwCrnplPZw/6ItTDFaZQruZjIrgT3joyWGHvDvnzrTOGwt"
+"l/yAc3DPnOThuqRogsUHUHpCAxii7/a3fsy4bPvZowSn2s0xJKAt0wBtSEAywahpzbax2pHWFwff"
@@ -1667,7 +1667,7 @@
);
// Subject: C=US, ST=private, L=province, O=city, CN=*
- private static byte[] KEYSTORE_13 = DatatypeConverter.parseBase64Binary("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQWJoAAAJhzCCCYMwDgYKKwYBBAEqAhEB"
+ private static byte[] KEYSTORE_13 = Base64.getDecoder().decode("/u3+7QAAAAIAAAABAAAAAQAKc2VsZnNpZ25lZAAAAVbrQWJoAAAJhzCCCYMwDgYKKwYBBAEqAhEB"
+"AQUABIIJb2KqIXFhF34E/cZLKwQIiZncYFYOrfP3HUNTvAXWuX1F2prq4VIiq8zrsLpFB07UrfdL"
+"7+xfuC9WJJ09455608neFGtH7K6V5ntULLicLOEkz/jH0WgHBsZjUFXhAl+DivFI880OT7z2FC2E"
+"odYUp35Un/cSbfyxjYBQtu64X+u5g+05UW5GhxHCUrHik/5sJYimER/ZrM3SV1ctnllqtJeZx6sn"
diff --git a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/ServletConnectionPrincipal.java b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/ServletConnectionPrincipal.java
index 6d442a8..543e7df 100644
--- a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/ServletConnectionPrincipal.java
+++ b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/ServletConnectionPrincipal.java
@@ -26,10 +26,10 @@
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
-import javax.xml.bind.DatatypeConverter;
import org.apache.qpid.server.management.plugin.HttpManagementUtil;
import org.apache.qpid.server.model.Port;
@@ -66,7 +66,7 @@
throw new RuntimeException("Cannot create SHA-256 hash", e);
}
byte[] digest = md.digest();
- _sessionId = DatatypeConverter.printBase64Binary(digest).substring(0, HASH_TRUNCATION_LENGTH);
+ _sessionId = Base64.getEncoder().encodeToString(digest).substring(0, HASH_TRUNCATION_LENGTH);
}
else
{
diff --git a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectExpressionFactory.java b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectExpressionFactory.java
index 85e3a34..de8eb5a 100644
--- a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectExpressionFactory.java
+++ b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectExpressionFactory.java
@@ -20,6 +20,18 @@
*/
package org.apache.qpid.server.management.plugin.servlet.query;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.chrono.IsoChronology;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.time.format.DateTimeParseException;
+import java.time.temporal.ChronoField;
+import java.time.temporal.TemporalAccessor;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
@@ -31,7 +43,6 @@
import java.util.Set;
import java.util.TimeZone;
-import javax.xml.bind.DatatypeConverter;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
@@ -48,6 +59,22 @@
private static final TimeZone UTC = TimeZone.getTimeZone("UTC");
private static final DatatypeFactory DATATYPE_FACTORY;
+ private static final DateTimeFormatter ISO_DATE_TIME_FORMAT = new DateTimeFormatterBuilder()
+ .parseCaseInsensitive()
+ .append(DateTimeFormatter.ISO_LOCAL_DATE)
+ .optionalStart()
+ .appendLiteral('T')
+ .append(DateTimeFormatter.ISO_LOCAL_TIME)
+ .optionalStart()
+ .appendOffsetId()
+ .optionalStart()
+ .appendLiteral('[')
+ .parseCaseSensitive()
+ .appendZoneRegionId()
+ .appendLiteral(']')
+ .toFormatter()
+ .withChronology(IsoChronology.INSTANCE);
+
static
{
try
@@ -122,13 +149,28 @@
}
try
{
- final Calendar calendar = DatatypeConverter.parseDateTime((String) dateTime);
- return calendar.getTime();
+
+ return DateTimeFormatter.ISO_ZONED_DATE_TIME.parse((String)dateTime)
+ .query(this::convertToDate);
}
- catch (IllegalArgumentException e)
+ catch (DateTimeParseException e1)
{
- throw new IllegalArgumentException(TO_DATE + " requires an ISO-8601 format date or date/time.", e);
+ throw new IllegalArgumentException(TO_DATE
+ + " requires an ISO-8601 format date or date/time.",
+ e1);
}
+
+ }
+
+ private Date convertToDate(TemporalAccessor t)
+ {
+ if(!t.isSupported(ChronoField.INSTANT_SECONDS))
+ {
+ t = LocalDateTime.of(LocalDate.from(t), LocalTime.MIN).atOffset(ZoneOffset.UTC);
+ }
+ return new Date((t.getLong(ChronoField.INSTANT_SECONDS) * 1000L)
+ + t.getLong(ChronoField.MILLI_OF_SECOND));
+
}
};
}
@@ -199,7 +241,7 @@
cal.setTime((Date) obj);
if (format == null)
{
- return DatatypeConverter.printDateTime(cal);
+ return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(cal.toInstant().atZone(ZoneId.of(timezoneName == null ? "UTC" : (String)timezoneName)));
}
else
{
diff --git a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java
index 8d10ec4..102062d 100644
--- a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java
+++ b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java
@@ -24,6 +24,7 @@
import java.security.AccessController;
import java.security.Principal;
import java.security.SecureRandom;
+import java.util.Base64;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -34,7 +35,6 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
-import javax.xml.bind.DatatypeConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -254,7 +254,7 @@
HttpManagementUtil.saveAuthorisedSubject(request, subject);
if(challenge != null && challenge.length != 0)
{
- outputObject.put("additionalData", DatatypeConverter.printBase64Binary(challenge));
+ outputObject.put("additionalData", Base64.getEncoder().encodeToString(challenge));
}
responseStatus = HttpServletResponse.SC_OK;
}
@@ -279,7 +279,7 @@
session, request);
outputObject.put("id", id);
- outputObject.put("challenge", DatatypeConverter.printBase64Binary(challenge));
+ outputObject.put("challenge", Base64.getEncoder().encodeToString(challenge));
responseStatus = HttpServletResponse.SC_OK;
}
else
diff --git a/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/GunzipOutputStreamTest.java b/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/GunzipOutputStreamTest.java
index 3711d1c..6a6301e 100644
--- a/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/GunzipOutputStreamTest.java
+++ b/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/GunzipOutputStreamTest.java
@@ -25,8 +25,7 @@
import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer;
-
-import javax.xml.bind.DatatypeConverter;
+import java.util.Base64;
import org.junit.Test;
@@ -64,7 +63,7 @@
@Test
public void testDecompressingWithEmbeddedFileName() throws Exception
{
- byte[] data = DatatypeConverter.parseBase64Binary(GZIP_CONTENT_WITH_EMBEDDED_FILE_NAME);
+ byte[] data = Base64.getDecoder().decode(GZIP_CONTENT_WITH_EMBEDDED_FILE_NAME);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
GunzipOutputStream guos = new GunzipOutputStream(outputStream);
@@ -77,7 +76,7 @@
@Test
public void testDecompressingMultipleMembers() throws Exception
{
- byte[] data = DatatypeConverter.parseBase64Binary(GZIP_CONTENT_WITH_MULTIPLE_MEMBERS);
+ byte[] data = Base64.getDecoder().decode(GZIP_CONTENT_WITH_MULTIPLE_MEMBERS);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
GunzipOutputStream guos = new GunzipOutputStream(outputStream);
diff --git a/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java b/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java
index 670bad8..a0a56d0 100644
--- a/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java
+++ b/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java
@@ -25,8 +25,13 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
-import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
@@ -36,8 +41,6 @@
import java.util.UUID;
import java.util.concurrent.TimeUnit;
-import javax.xml.bind.DatatypeConverter;
-
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.junit.Test;
@@ -316,9 +319,9 @@
public void testQuery_DateEquality()
{
final long now = System.currentTimeMillis();
- final Calendar calendar = Calendar.getInstance();
- calendar.setTimeInMillis(now);
- String nowIso8601Str = DatatypeConverter.printDateTime(calendar);
+
+ final ZonedDateTime zonedDateTime = Instant.ofEpochMilli(now).atZone(ZoneId.systemDefault());
+ String nowIso8601Str = DateTimeFormatter.ISO_ZONED_DATE_TIME.format(zonedDateTime);
final UUID objectUuid = UUID.randomUUID();
diff --git a/systests/end-to-end-conversion-tests/src/main/java/org/apache/qpid/systests/end_to_end_conversion/client/MessageVerifier.java b/systests/end-to-end-conversion-tests/src/main/java/org/apache/qpid/systests/end_to_end_conversion/client/MessageVerifier.java
index 45f4abc..4f9183b 100644
--- a/systests/end-to-end-conversion-tests/src/main/java/org/apache/qpid/systests/end_to_end_conversion/client/MessageVerifier.java
+++ b/systests/end-to-end-conversion-tests/src/main/java/org/apache/qpid/systests/end_to_end_conversion/client/MessageVerifier.java
@@ -39,7 +39,8 @@
import javax.jms.ObjectMessage;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
-import javax.xml.bind.DatatypeConverter;
+
+import org.apache.qpid.server.util.StringUtil;
public class MessageVerifier
{
@@ -257,12 +258,12 @@
{
final byte[] expectedValueAsBytes = (byte[]) expectedValue;
final byte[] actualValueAsBytes = (byte[]) actualValue;
- String expectedValueAsString = DatatypeConverter.printHexBinary(expectedValueAsBytes);
+ String expectedValueAsString = StringUtil.toHex(expectedValueAsBytes);
if (expectedValueAsString.length() > 20)
{
expectedValueAsString = expectedValueAsString.substring(0, 20) + "...";
}
- String actualValueAsString = DatatypeConverter.printHexBinary(actualValueAsBytes);
+ String actualValueAsString = StringUtil.toHex(actualValueAsBytes);
if (actualValueAsString.length() > 20)
{
actualValueAsString = actualValueAsString.substring(0, 20) + "...";
diff --git a/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/SaslUtils.java b/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/SaslUtils.java
index 5833599..2659fd3 100644
--- a/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/SaslUtils.java
+++ b/systests/protocol-tests-core/src/main/java/org/apache/qpid/tests/protocol/SaslUtils.java
@@ -23,10 +23,20 @@
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
-import javax.xml.bind.DatatypeConverter;
public class SaslUtils
{
+ private static final char[] HEX = "0123456789abcdef".toCharArray();
+
+ private static String toHex(byte[] bin)
+ {
+ StringBuilder result = new StringBuilder(2 * bin.length);
+ for (byte b : bin) {
+ result.append(HEX[(b >> 4) & 0xF]);
+ result.append(HEX[(b & 0xF)]);
+ }
+ return result.toString();
+ }
public static byte[] generateCramMD5ClientResponse(String userName, String userPassword, byte[] challengeBytes)
throws Exception
{
@@ -34,8 +44,7 @@
Mac mac = Mac.getInstance(macAlgorithm);
mac.init(new SecretKeySpec(userPassword.getBytes(StandardCharsets.UTF_8), macAlgorithm));
final byte[] messageAuthenticationCode = mac.doFinal(challengeBytes);
- String responseAsString = userName + " " + DatatypeConverter.printHexBinary(messageAuthenticationCode)
- .toLowerCase();
+ String responseAsString = userName + " " + toHex(messageAuthenticationCode);
return responseAsString.getBytes();
}
}
diff --git a/systests/qpid-systests-http-management/src/main/java/org/apache/qpid/tests/http/HttpTestHelper.java b/systests/qpid-systests-http-management/src/main/java/org/apache/qpid/tests/http/HttpTestHelper.java
index 7421aa9..04bb288 100644
--- a/systests/qpid-systests-http-management/src/main/java/org/apache/qpid/tests/http/HttpTestHelper.java
+++ b/systests/qpid-systests-http-management/src/main/java/org/apache/qpid/tests/http/HttpTestHelper.java
@@ -34,6 +34,7 @@
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.X509Certificate;
+import java.util.Base64;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
@@ -46,7 +47,6 @@
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.servlet.http.HttpServletResponse;
-import javax.xml.bind.DatatypeConverter;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -170,7 +170,7 @@
if(_username != null)
{
- String encoded = DatatypeConverter.printBase64Binary((_username + ":" + _password).getBytes(UTF_8));
+ String encoded = Base64.getEncoder().encodeToString((_username + ":" + _password).getBytes(UTF_8));
httpCon.setRequestProperty("Authorization", "Basic " + encoded);
}
diff --git a/systests/qpid-systests-http-management/src/test/java/org/apache/qpid/tests/http/authentication/SaslTest.java b/systests/qpid-systests-http-management/src/test/java/org/apache/qpid/tests/http/authentication/SaslTest.java
index 9201793..7977cec 100644
--- a/systests/qpid-systests-http-management/src/test/java/org/apache/qpid/tests/http/authentication/SaslTest.java
+++ b/systests/qpid-systests-http-management/src/test/java/org/apache/qpid/tests/http/authentication/SaslTest.java
@@ -33,12 +33,11 @@
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
+import java.util.Base64;
import java.util.List;
import java.util.Map;
import java.util.UUID;
-import javax.xml.bind.DatatypeConverter;
-
import org.junit.Before;
import org.junit.Test;
@@ -116,7 +115,7 @@
public void plainSASLAuthenticationWithMalformedInitialResponse() throws Exception
{
byte[] responseBytes = "null".getBytes();
- String responseData = DatatypeConverter.printBase64Binary(responseBytes);
+ String responseData = Base64.getEncoder().encodeToString(responseBytes);
String parameters = String.format("mechanism=%s&response=%s", PlainNegotiator.MECHANISM, responseData);
HttpURLConnection connection = getHelper().openManagementConnection(SASL_SERVICE, "POST");
@@ -221,7 +220,7 @@
List<String> cookies = connection.getHeaderFields().get(SET_COOKIE_HEADER);
- String responseData = DatatypeConverter.printBase64Binary("null".getBytes());
+ String responseData = Base64.getEncoder().encodeToString("null".getBytes());
String requestParameters = String.format("id=%s&response=%s", response.get("id"), responseData);
postResponse(cookies, requestParameters, SC_UNAUTHORIZED);
@@ -246,10 +245,10 @@
List<String> cookies = connection.getHeaderFields().get(SET_COOKIE_HEADER);
- byte[] challengeBytes = DatatypeConverter.parseBase64Binary(challenge);
+ byte[] challengeBytes = Base64.getDecoder().decode(challenge);
byte[] responseBytes =
generateClientResponse(CramMd5Negotiator.MECHANISM, _userName, _userPassword, challengeBytes);
- String responseData = DatatypeConverter.printBase64Binary(responseBytes);
+ String responseData = Base64.getEncoder().encodeToString(responseBytes);
String requestParameters = (String.format("id=%s&response=%s", UUID.randomUUID().toString(), responseData));
postResponse(cookies, requestParameters, SC_EXPECTATION_FAILED);
@@ -267,7 +266,7 @@
final int expectedResponseCode) throws Exception
{
byte[] responseBytes = generatePlainClientResponse(userName, userPassword);
- String responseData = DatatypeConverter.printBase64Binary(responseBytes);
+ String responseData = Base64.getEncoder().encodeToString(responseBytes);
String parameters = String.format("mechanism=%s&response=%s", PlainNegotiator.MECHANISM, responseData);
HttpURLConnection connection = getHelper().openManagementConnection(SASL_SERVICE, "POST");
@@ -318,9 +317,9 @@
String challenge = (String) response.get("challenge");
assertNotNull("Challenge is not found", challenge);
- byte[] challengeBytes = DatatypeConverter.parseBase64Binary(challenge);
+ byte[] challengeBytes = Base64.getDecoder().decode(challenge);
byte[] responseBytes = generateClientResponse(mechanism, userName, userPassword, challengeBytes);
- String responseData = DatatypeConverter.printBase64Binary(responseBytes);
+ String responseData = Base64.getEncoder().encodeToString(responseBytes);
String requestParameters = (String.format("id=%s&response=%s", response.get("id"), responseData));
postResponse(requestChallengeConnection.getHeaderFields().get(SET_COOKIE_HEADER),
diff --git a/systests/qpid-systests-jms_1.1/src/test/java/org/apache/qpid/systests/jms_1_1/extensions/tls/TlsTest.java b/systests/qpid-systests-jms_1.1/src/test/java/org/apache/qpid/systests/jms_1_1/extensions/tls/TlsTest.java
index 7d7e1a1..7f61e4f 100644
--- a/systests/qpid-systests-jms_1.1/src/test/java/org/apache/qpid/systests/jms_1_1/extensions/tls/TlsTest.java
+++ b/systests/qpid-systests-jms_1.1/src/test/java/org/apache/qpid/systests/jms_1_1/extensions/tls/TlsTest.java
@@ -43,6 +43,7 @@
import java.nio.file.Files;
import java.security.Key;
import java.security.cert.Certificate;
+import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -51,7 +52,6 @@
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Session;
-import javax.xml.bind.DatatypeConverter;
import org.junit.AfterClass;
import org.junit.BeforeClass;
@@ -685,7 +685,7 @@
{
Key pvt = ks.getKey(TestSSLConstants.CERT_ALIAS_APP1, KEYSTORE_PASSWORD.toCharArray());
kos.write("-----BEGIN PRIVATE KEY-----\n".getBytes());
- String base64encoded = DatatypeConverter.printBase64Binary(pvt.getEncoded());
+ String base64encoded = Base64.getEncoder().encodeToString(pvt.getEncoded());
while (base64encoded.length() > 76)
{
kos.write(base64encoded.substring(0, 76).getBytes());
@@ -705,7 +705,7 @@
for (Certificate pub : chain)
{
cos.write("-----BEGIN CERTIFICATE-----\n".getBytes());
- String base64encoded = DatatypeConverter.printBase64Binary(pub.getEncoded());
+ String base64encoded = Base64.getEncoder().encodeToString(pub.getEncoded());
while (base64encoded.length() > 76)
{
cos.write(base64encoded.substring(0, 76).getBytes());
@@ -739,7 +739,7 @@
{
Certificate pub = ks.getCertificate(alias);
cos.write("-----BEGIN CERTIFICATE-----\n".getBytes());
- String base64encoded = DatatypeConverter.printBase64Binary(pub.getEncoded());
+ String base64encoded = Base64.getEncoder().encodeToString(pub.getEncoded());
while (base64encoded.length() > 76)
{
cos.write(base64encoded.substring(0, 76).getBytes());
diff --git a/tools/src/main/java/org/apache/qpid/tools/RestStressTestClient.java b/tools/src/main/java/org/apache/qpid/tools/RestStressTestClient.java
index 4beac5f..7242a65 100644
--- a/tools/src/main/java/org/apache/qpid/tools/RestStressTestClient.java
+++ b/tools/src/main/java/org/apache/qpid/tools/RestStressTestClient.java
@@ -34,6 +34,7 @@
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
+import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -49,7 +50,6 @@
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
-import javax.xml.bind.DatatypeConverter;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -282,7 +282,7 @@
if (saslMechanism == null)
{
- _authorizationHeader = "Basic " + DatatypeConverter.printBase64Binary((_username + ":" + _password).getBytes(UTF_8));
+ _authorizationHeader = "Basic " + Base64.getEncoder().encodeToString((_username + ":" + _password).getBytes(UTF_8));
}
else
{
@@ -530,7 +530,7 @@
final byte[] messageAuthenticationCode = mac.doFinal(challengeBytes);
String responseAsString = username + " " + toHex(messageAuthenticationCode);
byte[] responseBytes = responseAsString.getBytes(UTF_8);
- return DatatypeConverter.printBase64Binary(responseBytes);
+ return Base64.getEncoder().encodeToString(responseBytes);
}
catch (Exception e)
{
@@ -546,7 +546,7 @@
throw new IllegalArgumentException("Cannot convert string '"+ base64String+ "'to a byte[] - it does not appear to be base64 data");
}
- return DatatypeConverter.parseBase64Binary(base64String);
+ return Base64.getDecoder().decode(base64String);
}
private String toHex(byte[] data)