Author: reschke
Date: Fri Feb 16 12:52:28 2018
New Revision: 1824459
URL: http://svn.apache.org/viewvc?rev=1824459&view=rev
Log:
OAK-7270: RDBDocumentStore: guard against invalid strings in IDs
Modified:
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
Modified:
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java?rev=1824459&r1=1824458&r2=1824459&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
(original)
+++
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
Fri Feb 16 12:52:28 2018
@@ -56,6 +56,7 @@ import org.apache.jackrabbit.oak.plugins
import
org.apache.jackrabbit.oak.plugins.document.rdb.RDBDocumentStore.RDBTableMetaData;
import
org.apache.jackrabbit.oak.plugins.document.rdb.RDBDocumentStoreDB.FETCHFIRSTSYNTAX;
import
org.apache.jackrabbit.oak.plugins.document.rdb.RDBJDBCTools.PreparedStatementComponent;
+import org.apache.jackrabbit.oak.plugins.document.util.UTF8Encoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -1008,15 +1009,18 @@ public class RDBDocumentStoreJDBC {
}
private static void setIdInStatement(RDBTableMetaData tmd,
PreparedStatement stmt, int idx, String id) throws SQLException {
- if (tmd.isIdBinary()) {
- try {
- stmt.setBytes(idx, id.getBytes("UTF-8"));
- } catch (UnsupportedEncodingException ex) {
- LOG.error("UTF-8 not supported??", ex);
- throw new DocumentStoreException(ex);
+ try {
+ if (tmd.isIdBinary()) {
+ stmt.setBytes(idx, UTF8Encoder.encodeAsByteArray(id));
+ } else {
+ if (!UTF8Encoder.canEncode(id)) {
+ throw new IOException("can not encode as UTF-8");
+ }
+ stmt.setString(idx, id);
}
- } else {
- stmt.setString(idx, id);
+ } catch (IOException ex) {
+ LOG.warn("Invalid ID: " + id, ex);
+ throw new DocumentStoreException("Invalid ID: " + id, ex);
}
}
Modified:
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java?rev=1824459&r1=1824458&r2=1824459&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java
(original)
+++
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java
Fri Feb 16 12:52:28 2018
@@ -19,7 +19,7 @@ package org.apache.jackrabbit.oak.plugin
import static com.google.common.collect.Iterables.cycle;
import static com.google.common.collect.Iterables.limit;
-import java.io.UnsupportedEncodingException;
+import java.io.IOException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
@@ -39,6 +39,7 @@ import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import org.apache.jackrabbit.oak.plugins.document.DocumentStoreException;
+import org.apache.jackrabbit.oak.plugins.document.util.UTF8Encoder;
import org.slf4j.LoggerFactory;
import com.google.common.base.Joiner;
@@ -406,15 +407,18 @@ public class RDBJDBCTools {
@Override
public int setParameters(PreparedStatement stmt, int startIndex)
throws SQLException {
for (String value : values) {
- if (binary) {
- try {
- stmt.setBytes(startIndex++,
value.getBytes("UTF-8"));
- } catch (UnsupportedEncodingException ex) {
- LOG.error("UTF-8 not supported??", ex);
- throw new DocumentStoreException(ex);
+ try {
+ if (binary) {
+ stmt.setBytes(startIndex++,
UTF8Encoder.encodeAsByteArray(value));
+ } else {
+ if (!UTF8Encoder.canEncode(value)) {
+ throw new IOException("can not encode as
UTF-8");
+ }
+ stmt.setString(startIndex++, value);
}
- } else {
- stmt.setString(startIndex++, value);
+ } catch (IOException ex) {
+ LOG.warn("Invalid ID: " + value, ex);
+ throw new DocumentStoreException("Invalid ID: " +
value, ex);
}
}
return startIndex;
Modified:
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java?rev=1824459&r1=1824458&r2=1824459&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
(original)
+++
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
Fri Feb 16 12:52:28 2018
@@ -36,7 +36,6 @@ import java.util.Set;
import java.util.UUID;
import org.apache.jackrabbit.oak.plugins.document.util.Utils;
-import org.junit.Ignore;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -679,7 +678,6 @@ public class BasicDocumentStoreTest exte
}
@Test
- @Ignore("OAK-7261")
public void testInterestingInvalidIds() {
// see OAK-7261
assumeTrue("fails on MongoDocumentStore, see OAK-7271", !(dsf
instanceof DocumentStoreFixture.MongoFixture));