Skip to content

Commit 79a9de2

Browse files
asalamon74janhoy
authored andcommitted
SOLR-15111 Use JDK8 Base64 instead of own implementation (apache#24)
Co-authored-by: Jan Høydahl <[email protected]>
1 parent 0de1457 commit 79a9de2

File tree

22 files changed

+73
-214
lines changed

22 files changed

+73
-214
lines changed

solr/CHANGES.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,8 @@ Other Changes
439439

440440
* SOLR-15324: Upgrade Jaeger dependency from 1.1.0 to 1.6.0 and thus also libthrift to 0.14.1 (janhoy)
441441

442+
* SOLR-15111: Use JDK8 Base64 instead of own implementation (Andras Salamon via janhoy)
443+
442444
* SOLR-15599: woodstox-core-asl:4.4.1 (org.codehaus) replaced with woodstox-core:6.2.4 (com.fasterxml) (Houston Putman)
443445

444446
================== 8.9.0 ==================

solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@
2222

2323
import java.io.IOException;
2424
import java.lang.invoke.MethodHandles;
25+
import java.nio.ByteBuffer;
26+
import java.nio.charset.StandardCharsets;
2527
import java.nio.file.NoSuchFileException;
2628
import java.util.ArrayList;
2729
import java.util.Arrays;
30+
import java.util.Base64;
2831
import java.util.Date;
2932
import java.util.HashMap;
3033
import java.util.LinkedList;
@@ -66,7 +69,6 @@
6669
import org.apache.solr.common.luke.FieldFlag;
6770
import org.apache.solr.common.params.CommonParams;
6871
import org.apache.solr.common.params.SolrParams;
69-
import org.apache.solr.common.util.Base64;
7072
import org.apache.solr.common.util.NamedList;
7173
import org.apache.solr.common.util.SimpleOrderedMap;
7274
import org.apache.solr.handler.RequestHandlerBase;
@@ -294,7 +296,7 @@ private static SimpleOrderedMap<Object> getDocumentFieldsInfo( Document doc, int
294296

295297
BytesRef bytes = field.binaryValue();
296298
if (bytes != null) {
297-
f.add( "binary", Base64.byteArrayToBase64(bytes.bytes, bytes.offset, bytes.length));
299+
f.add( "binary", new String(Base64.getEncoder().encode(ByteBuffer.wrap(bytes.bytes, bytes.offset, bytes.length)).array(), StandardCharsets.ISO_8859_1));
298300
}
299301
if (!ftype.isPointField()) {
300302
Term t = new Term(field.name(), ftype!=null ? ftype.storedToIndexed(field) : field.stringValue());

solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@
1818

1919
import java.io.IOException;
2020
import java.lang.reflect.Array;
21+
import java.nio.ByteBuffer;
22+
import java.nio.charset.StandardCharsets;
2123
import java.util.ArrayList;
2224
import java.util.Arrays;
25+
import java.util.Base64;
2326
import java.util.Collections;
2427
import java.util.HashMap;
2528
import java.util.Iterator;
@@ -40,7 +43,6 @@
4043
import org.apache.solr.common.params.CommonParams;
4144
import org.apache.solr.common.params.SolrParams;
4245
import org.apache.solr.common.params.TermVectorParams;
43-
import org.apache.solr.common.util.Base64;
4446
import org.apache.solr.common.util.NamedList;
4547
import org.apache.solr.schema.IndexSchema;
4648
import org.apache.solr.schema.SchemaField;
@@ -364,7 +366,7 @@ private void mapOneVector(NamedList<Object> docNL, FieldOptions fieldOptions, In
364366
thePayloads = new NamedList<>();
365367
termInfo.add("payloads", thePayloads);
366368
}
367-
thePayloads.add("payload", Base64.byteArrayToBase64(payload.bytes, payload.offset, payload.length));
369+
thePayloads.add("payload", new String(Base64.getEncoder().encode(ByteBuffer.wrap(payload.bytes, payload.offset, payload.length)).array(), StandardCharsets.ISO_8859_1));
368370
}
369371
}
370372
}

solr/core/src/java/org/apache/solr/schema/BinaryField.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@
1919
import java.io.IOException;
2020
import java.lang.invoke.MethodHandles;
2121
import java.nio.ByteBuffer;
22+
import java.nio.charset.StandardCharsets;
23+
import java.util.Base64;
2224

2325
import org.apache.lucene.index.IndexableField;
2426
import org.apache.lucene.search.SortField;
2527
import org.apache.lucene.util.BytesRef;
2628
import org.apache.solr.common.SolrException;
27-
import org.apache.solr.common.util.Base64;
2829
import org.apache.solr.response.TextResponseWriter;
2930
import org.apache.solr.uninverting.UninvertingReader.Type;
3031
import org.slf4j.Logger;
@@ -44,7 +45,7 @@ public void checkSchemaField(SchemaField field) {
4445
}
4546

4647
private String toBase64String(ByteBuffer buf) {
47-
return Base64.byteArrayToBase64(buf.array(), buf.arrayOffset() + buf.position(), buf.limit()-buf.position());
48+
return new String(Base64.getEncoder().encode(ByteBuffer.wrap(buf.array(), buf.arrayOffset() + buf.position(), buf.limit()-buf.position()).array()), StandardCharsets.ISO_8859_1);
4849
}
4950

5051
@Override
@@ -98,7 +99,7 @@ public IndexableField createField(SchemaField field, Object val) {
9899
} else {
99100
String strVal = val.toString();
100101
//the string has to be a base64 encoded string
101-
buf = Base64.base64ToByteArray(strVal);
102+
buf = Base64.getDecoder().decode(strVal);
102103
offset = 0;
103104
len = buf.length;
104105
}
@@ -112,7 +113,7 @@ public Object toNativeType(Object val) {
112113
return ByteBuffer.wrap((byte[]) val);
113114
} else if (val instanceof CharSequence) {
114115
final CharSequence valAsCharSequence = (CharSequence) val;
115-
return ByteBuffer.wrap(Base64.base64ToByteArray(valAsCharSequence.toString()));
116+
return ByteBuffer.wrap(Base64.getDecoder().decode(valAsCharSequence.toString()));
116117
}
117118
return super.toNativeType(val);
118119
}

solr/core/src/java/org/apache/solr/schema/FieldType.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818

1919
import java.io.IOException;
2020
import java.lang.invoke.MethodHandles;
21+
import java.nio.ByteBuffer;
22+
import java.nio.charset.StandardCharsets;
2123
import java.util.ArrayList;
24+
import java.util.Base64;
2225
import java.util.Collection;
2326
import java.util.Collections;
2427
import java.util.HashMap;
@@ -67,7 +70,6 @@
6770
import org.apache.solr.common.IteratorWriter;
6871
import org.apache.solr.common.SolrException;
6972
import org.apache.solr.common.SolrException.ErrorCode;
70-
import org.apache.solr.common.util.Base64;
7173
import org.apache.solr.common.util.SimpleOrderedMap;
7274
import org.apache.solr.common.util.StrUtils;
7375
import org.apache.solr.query.SolrRangeQuery;
@@ -1327,7 +1329,7 @@ protected static Object marshalBase64SortValue(Object value) {
13271329
return null;
13281330
}
13291331
final BytesRef val = (BytesRef)value;
1330-
return Base64.byteArrayToBase64(val.bytes, val.offset, val.length);
1332+
return new String(Base64.getEncoder().encode(ByteBuffer.wrap(val.bytes, val.offset, val.length)).array(), StandardCharsets.ISO_8859_1);
13311333
}
13321334

13331335
/**
@@ -1338,7 +1340,7 @@ protected static Object unmarshalBase64SortValue(Object value) {
13381340
return null;
13391341
}
13401342
final String val = (String)value;
1341-
final byte[] bytes = Base64.base64ToByteArray(val);
1343+
final byte[] bytes = Base64.getDecoder().decode(val);
13421344
return new BytesRef(bytes);
13431345
}
13441346

solr/core/src/java/org/apache/solr/schema/JsonPreAnalyzedParser.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
import java.io.IOException;
2020
import java.io.Reader;
2121
import java.lang.invoke.MethodHandles;
22+
import java.nio.ByteBuffer;
23+
import java.nio.charset.StandardCharsets;
24+
import java.util.Base64;
2225
import java.util.Iterator;
2326
import java.util.LinkedHashMap;
2427
import java.util.LinkedList;
@@ -40,7 +43,6 @@
4043
import org.apache.lucene.util.AttributeSource;
4144
import org.apache.lucene.util.AttributeSource.State;
4245
import org.apache.lucene.util.BytesRef;
43-
import org.apache.solr.common.util.Base64;
4446
import org.apache.solr.schema.PreAnalyzedField.ParseResult;
4547
import org.apache.solr.schema.PreAnalyzedField.PreAnalyzedParser;
4648
import org.noggit.JSONUtil;
@@ -100,7 +102,7 @@ public ParseResult parse(Reader reader, AttributeSource parent)
100102
res.str = (String)map.get(STRING_KEY);
101103
String bin = (String)map.get(BINARY_KEY);
102104
if (bin != null) {
103-
byte[] data = Base64.base64ToByteArray(bin);
105+
byte[] data = Base64.getDecoder().decode(bin);
104106
res.bin = data;
105107
}
106108
List<Object> tokens = (List<Object>)map.get(TOKENS_KEY);
@@ -166,7 +168,7 @@ public ParseResult parse(Reader reader, AttributeSource parent)
166168
} else if (key.equals(PAYLOAD_KEY)) {
167169
String str = String.valueOf(e.getValue());
168170
if (str.length() > 0) {
169-
byte[] data = Base64.base64ToByteArray(str);
171+
byte[] data = Base64.getDecoder().decode(str);
170172
PayloadAttribute p = parent.addAttribute(PayloadAttribute.class);
171173
if (data != null && data.length > 0) {
172174
p.setPayload(new BytesRef(data));
@@ -216,7 +218,7 @@ public String toFormattedString(Field f) throws IOException {
216218
}
217219
BytesRef binaryValue = f.binaryValue();
218220
if (binaryValue != null) {
219-
map.put(BINARY_KEY, Base64.byteArrayToBase64(binaryValue.bytes, binaryValue.offset, binaryValue.length));
221+
map.put(BINARY_KEY, new String(Base64.getEncoder().encode(ByteBuffer.wrap(binaryValue.bytes, binaryValue.offset, binaryValue.length)).array(), StandardCharsets.ISO_8859_1));
220222
}
221223
}
222224
TokenStream ts = f.tokenStreamValue();
@@ -248,7 +250,7 @@ public String toFormattedString(Field f) throws IOException {
248250
} else if (cl.isAssignableFrom(PayloadAttribute.class)) {
249251
BytesRef p = ((PayloadAttribute)att).getPayload();
250252
if (p != null && p.length > 0) {
251-
tok.put(PAYLOAD_KEY, Base64.byteArrayToBase64(p.bytes, p.offset, p.length));
253+
tok.put(PAYLOAD_KEY, new String(Base64.getEncoder().encode(ByteBuffer.wrap(p.bytes, p.offset, p.length)).array(), StandardCharsets.ISO_8859_1));
252254
}
253255
} else if (cl.isAssignableFrom(PositionIncrementAttribute.class)) {
254256
tok.put(POSINCR_KEY, ((PositionIncrementAttribute)att).getPositionIncrement());

solr/core/src/java/org/apache/solr/search/CursorMark.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@
2626

2727
import static org.apache.solr.common.params.CursorMarkParams.*;
2828

29-
import org.apache.solr.common.util.Base64;
3029
import org.apache.solr.common.util.JavaBinCodec;
3130
import org.apache.solr.schema.IndexSchema;
3231
import org.apache.solr.schema.FieldType;
3332
import org.apache.solr.schema.SchemaField;
3433

34+
import java.util.Base64;
3535
import java.util.List;
3636
import java.util.ArrayList;
3737
import java.io.ByteArrayOutputStream;
@@ -188,7 +188,7 @@ public void parseSerializedTotem(final String serialized) {
188188

189189
List<Object> pieces = null;
190190
try {
191-
final byte[] rawData = Base64.base64ToByteArray(serialized);
191+
final byte[] rawData = Base64.getDecoder().decode(serialized);
192192
try (JavaBinCodec jbc = new JavaBinCodec(); ByteArrayInputStream in = new ByteArrayInputStream(rawData)){
193193
pieces = (List<Object>) jbc.unmarshal(in);
194194
boolean b = false;
@@ -265,7 +265,7 @@ public String getSerializedTotem() {
265265
try (JavaBinCodec jbc = new JavaBinCodec(); ByteArrayOutputStream out = new ByteArrayOutputStream(256)) {
266266
jbc.marshal(marshalledValues, out);
267267
byte[] rawData = out.toByteArray();
268-
return Base64.byteArrayToBase64(rawData, 0, rawData.length);
268+
return Base64.getEncoder().encodeToString(rawData);
269269
} catch (Exception ex) {
270270
throw new SolrException(ErrorCode.SERVER_ERROR,
271271
"Unable to format search after totem", ex);

solr/core/src/java/org/apache/solr/security/JWTAuthPlugin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.apache.solr.common.SolrException;
2727
import org.apache.solr.common.SpecProvider;
2828
import org.apache.solr.common.StringUtils;
29-
import org.apache.solr.common.util.Base64;
3029
import org.apache.solr.common.util.CommandOperation;
3130
import org.apache.solr.common.util.Utils;
3231
import org.apache.solr.common.util.ValidatingJsonMap;
@@ -61,6 +60,7 @@
6160
import java.time.Instant;
6261
import java.util.ArrayList;
6362
import java.util.Arrays;
63+
import java.util.Base64;
6464
import java.util.Collection;
6565
import java.util.Collections;
6666
import java.util.HashMap;
@@ -625,7 +625,7 @@ protected String generateAuthDataHeader() {
625625
data.put("scope", adminUiScope);
626626
data.put("redirect_uris", redirectUris);
627627
String headerJson = Utils.toJSONString(data);
628-
return Base64.byteArrayToBase64(headerJson.getBytes(StandardCharsets.UTF_8));
628+
return Base64.getEncoder().encodeToString(headerJson.getBytes(StandardCharsets.UTF_8));
629629
}
630630

631631
/**

solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.nio.ByteBuffer;
2525
import java.security.Principal;
2626
import java.security.PublicKey;
27+
import java.util.Base64;
2728
import java.util.List;
2829
import java.util.Map;
2930
import java.util.Optional;
@@ -43,7 +44,6 @@
4344
import org.apache.solr.client.solrj.impl.HttpClientUtil;
4445
import org.apache.solr.client.solrj.impl.HttpListenerFactory;
4546
import org.apache.solr.client.solrj.impl.SolrHttpClientBuilder;
46-
import org.apache.solr.common.util.Base64;
4747
import org.apache.solr.common.util.ExecutorUtil;
4848
import org.apache.solr.common.util.StrUtils;
4949
import org.apache.solr.common.util.SuppressForbidden;
@@ -180,7 +180,7 @@ private PKIHeaderData decipherHeader(String nodeName, String cipherBase64) {
180180
private static PKIHeaderData parseCipher(String cipher, PublicKey key) {
181181
byte[] bytes;
182182
try {
183-
bytes = CryptoKeys.decryptRSA(Base64.base64ToByteArray(cipher), key);
183+
bytes = CryptoKeys.decryptRSA(Base64.getDecoder().decode(cipher), key);
184184
} catch (Exception e) {
185185
log.error("Decryption failed , key must be wrong", e);
186186
return null;
@@ -322,7 +322,7 @@ private Optional<String> generateToken() {
322322

323323
byte[] payload = s.getBytes(UTF_8);
324324
byte[] payloadCipher = publicKeyHandler.keyPair.encrypt(ByteBuffer.wrap(payload));
325-
String base64Cipher = Base64.byteArrayToBase64(payloadCipher);
325+
String base64Cipher = Base64.getEncoder().encodeToString(payloadCipher);
326326
log.trace("generateToken: usr={} token={}", usr, base64Cipher);
327327
return Optional.of(base64Cipher);
328328
}

solr/core/src/java/org/apache/solr/util/CryptoKeys.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import com.google.common.collect.ImmutableMap;
2020
import org.apache.solr.common.SolrException;
21-
import org.apache.solr.common.util.Base64;
2221
import org.slf4j.Logger;
2322
import org.slf4j.LoggerFactory;
2423

@@ -46,6 +45,7 @@
4645
import java.security.spec.InvalidKeySpecException;
4746
import java.security.spec.PKCS8EncodedKeySpec;
4847
import java.security.spec.X509EncodedKeySpec;
48+
import java.util.Base64;
4949
import java.util.Collection;
5050
import java.util.HashMap;
5151
import java.util.List;
@@ -77,7 +77,7 @@ public String verify(String sig, ByteBuffer data) {
7777
for (Map.Entry<String, PublicKey> entry : keys.entrySet()) {
7878
boolean verified;
7979
try {
80-
verified = CryptoKeys.verify(entry.getValue(), Base64.base64ToByteArray(sig), data);
80+
verified = CryptoKeys.verify(entry.getValue(), Base64.getDecoder().decode(sig), data);
8181
log.debug("verified {} ", verified);
8282
if (verified) return entry.getKey();
8383
} catch (Exception e) {
@@ -95,7 +95,7 @@ public String verify(String sig, InputStream is) {
9595
for (Map.Entry<String, PublicKey> entry : keys.entrySet()) {
9696
boolean verified;
9797
try {
98-
verified = CryptoKeys.verify(entry.getValue(), Base64.base64ToByteArray(sig), is);
98+
verified = CryptoKeys.verify(entry.getValue(), Base64.getDecoder().decode(sig), is);
9999
log.debug("verified {} ", verified);
100100
if (verified) return entry.getKey();
101101
} catch (Exception e) {
@@ -172,7 +172,7 @@ public static boolean verify(PublicKey publicKey, byte[] sig, InputStream is)
172172
public static PublicKey deserializeX509PublicKey(String pubKey) {
173173
try {
174174
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
175-
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(Base64.base64ToByteArray(pubKey));
175+
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(pubKey));
176176
return keyFactory.generatePublic(publicKeySpec);
177177
} catch (Exception e) {
178178
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,e);
@@ -247,7 +247,7 @@ public RSAKeyPair() {
247247
java.security.KeyPair keyPair = keyGen.genKeyPair();
248248
privateKey = keyPair.getPrivate();
249249
publicKey = keyPair.getPublic();
250-
pubKeyStr = Base64.byteArrayToBase64(publicKey.getEncoded());
250+
pubKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());
251251
}
252252

253253
/**
@@ -263,7 +263,7 @@ public RSAKeyPair(URL privateKeyResourceName, URL publicKeyResourceName) throws
263263
String privateString = new String(inPrivate.readAllBytes(), StandardCharsets.UTF_8)
264264
.replaceAll("-----(BEGIN|END) PRIVATE KEY-----", "");
265265

266-
PKCS8EncodedKeySpec privateSpec = new PKCS8EncodedKeySpec(java.util.Base64.getMimeDecoder().decode(privateString));
266+
PKCS8EncodedKeySpec privateSpec = new PKCS8EncodedKeySpec(Base64.getMimeDecoder().decode(privateString));
267267
KeyFactory rsaFactory = KeyFactory.getInstance("RSA");
268268
privateKey = rsaFactory.generatePrivate(privateSpec);
269269
} catch (NoSuchAlgorithmException e) {
@@ -272,7 +272,7 @@ public RSAKeyPair(URL privateKeyResourceName, URL publicKeyResourceName) throws
272272

273273
try (InputStream inPublic = publicKeyResourceName.openStream()) {
274274
publicKey = getX509PublicKey(inPublic.readAllBytes());
275-
pubKeyStr = Base64.byteArrayToBase64(publicKey.getEncoded());
275+
pubKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());
276276
}
277277
}
278278

0 commit comments

Comments
 (0)