You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2023/06/15 15:07:34 UTC
[shardingsphere] branch master updated: Refactor EncryptInsertValueParameterRewriter (#26375)
This is an automated email from the ASF dual-hosted git repository.
zhaojinchao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 89384f82b89 Refactor EncryptInsertValueParameterRewriter (#26375)
89384f82b89 is described below
commit 89384f82b895613485882ce53035750392bb5a5b
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Thu Jun 15 23:07:25 2023 +0800
Refactor EncryptInsertValueParameterRewriter (#26375)
* Add EncryptTable.isEncryptColumn()
* Refactor EncryptProjectionTokenGenerator
* Refactor PostgreSQLComParseExecutorTest
* Refactor RDLBackendHandlerFactoryTest
* Refactor PostgreSQLStatementVisitor
* Refactor OpenGaussStatementVisitor
* Refactor MySQLStatementVisitor
* Refactor EncryptInsertValueParameterRewriter
---
.../EncryptInsertValueParameterRewriter.java | 45 +++++++-------------
.../shardingsphere/encrypt/rule/EncryptRule.java | 49 ++++++++++++++++++++--
2 files changed, 61 insertions(+), 33 deletions(-)
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
index 395060ec471..a1dbad22f9c 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
@@ -18,13 +18,6 @@
package org.apache.shardingsphere.encrypt.rewrite.parameter.rewriter;
import lombok.Setter;
-import org.apache.shardingsphere.encrypt.api.context.EncryptContext;
-import org.apache.shardingsphere.encrypt.api.encrypt.assisted.AssistedEncryptAlgorithm;
-import org.apache.shardingsphere.encrypt.api.encrypt.like.LikeEncryptAlgorithm;
-import org.apache.shardingsphere.encrypt.api.encrypt.standard.StandardEncryptAlgorithm;
-import org.apache.shardingsphere.encrypt.context.EncryptContextBuilder;
-import org.apache.shardingsphere.encrypt.exception.metadata.EncryptAssistedQueryColumnNotFoundException;
-import org.apache.shardingsphere.encrypt.exception.metadata.EncryptLikeQueryColumnNotFoundException;
import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseNameAware;
import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
@@ -36,7 +29,6 @@ import org.apache.shardingsphere.infra.rewrite.parameter.builder.ParameterBuilde
import org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.GroupedParameterBuilder;
import org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.StandardParameterBuilder;
import org.apache.shardingsphere.infra.rewrite.parameter.rewriter.ParameterRewriter;
-import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
import org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.InsertStatementHandler;
@@ -76,18 +68,15 @@ public final class EncryptInsertValueParameterRewriter implements ParameterRewri
String schemaName = insertStatementContext.getTablesContext().getSchemaName().orElseGet(() -> DatabaseTypeEngine.getDefaultSchemaName(insertStatementContext.getDatabaseType(), databaseName));
while (descendingColumnNames.hasNext()) {
String columnName = descendingColumnNames.next();
- EncryptContext encryptContext = EncryptContextBuilder.build(databaseName, schemaName, tableName, columnName);
- encryptRule.findStandardEncryptor(tableName, columnName).ifPresent(
- optional -> encryptInsertValues(encryptTable.get(), (GroupedParameterBuilder) paramBuilder, insertStatementContext, optional,
- encryptRule.findAssistedQueryEncryptor(tableName, columnName).orElse(null),
- encryptRule.findLikeQueryEncryptor(tableName, columnName).orElse(null), encryptContext));
+ if (encryptRule.findEncryptTable(tableName).map(optional -> optional.isEncryptColumn(columnName)).orElse(false)) {
+ encryptInsertValues(encryptTable.get(), (GroupedParameterBuilder) paramBuilder, insertStatementContext, schemaName, tableName, columnName);
+ }
}
}
private void encryptInsertValues(final EncryptTable encryptTable, final GroupedParameterBuilder paramBuilder, final InsertStatementContext insertStatementContext,
- final StandardEncryptAlgorithm<?, ?> standardEncryptor, final AssistedEncryptAlgorithm<?, ?> assistQueryEncryptor,
- final LikeEncryptAlgorithm<?, ?> likeQueryEncryptor, final EncryptContext encryptContext) {
- int columnIndex = getColumnIndex(paramBuilder, insertStatementContext, encryptContext.getColumnName());
+ final String schemaName, final String tableName, final String columnName) {
+ int columnIndex = getColumnIndex(paramBuilder, insertStatementContext, columnName);
int count = 0;
for (List<Object> each : insertStatementContext.getGroupedParameters()) {
int paramIndex = insertStatementContext.getInsertValueContexts().get(count).getParameterIndex(columnIndex);
@@ -97,7 +86,7 @@ public final class EncryptInsertValueParameterRewriter implements ParameterRewri
if (expressionSegment instanceof ParameterMarkerExpressionSegment) {
Object literalValue = insertStatementContext.getInsertValueContexts().get(count).getLiteralValue(columnIndex)
.orElse(null);
- encryptInsertValue(encryptTable, standardEncryptor, assistQueryEncryptor, likeQueryEncryptor, paramIndex, literalValue, standardParamBuilder, encryptContext);
+ encryptInsertValue(encryptTable, paramIndex, literalValue, standardParamBuilder, schemaName, tableName, columnName);
}
}
count++;
@@ -115,21 +104,17 @@ public final class EncryptInsertValueParameterRewriter implements ParameterRewri
return columnNames.indexOf(encryptLogicColumnName);
}
- @SuppressWarnings({"rawtypes", "unchecked"})
- private void encryptInsertValue(final EncryptTable encryptTable,
- final StandardEncryptAlgorithm standardEncryptor, final AssistedEncryptAlgorithm assistQueryEncryptor, final LikeEncryptAlgorithm likeQueryEncryptor,
- final int paramIndex, final Object originalValue, final StandardParameterBuilder paramBuilder, final EncryptContext encryptContext) {
- paramBuilder.addReplacedParameters(paramIndex, standardEncryptor.encrypt(originalValue, encryptContext));
+ private void encryptInsertValue(final EncryptTable encryptTable, final int paramIndex, final Object originalValue,
+ final StandardParameterBuilder paramBuilder, final String schemaName, final String tableName, final String columnName) {
+ paramBuilder.addReplacedParameters(paramIndex, encryptRule.encrypt(databaseName, schemaName, tableName, columnName, originalValue));
Collection<Object> addedParams = new LinkedList<>();
- if (null != assistQueryEncryptor) {
- Optional<String> assistedColumnName = encryptTable.findAssistedQueryColumn(encryptContext.getColumnName());
- ShardingSpherePreconditions.checkState(assistedColumnName.isPresent(), EncryptAssistedQueryColumnNotFoundException::new);
- addedParams.add(assistQueryEncryptor.encrypt(originalValue, encryptContext));
+ Optional<String> assistedColumnName = encryptTable.findAssistedQueryColumn(columnName);
+ if (assistedColumnName.isPresent()) {
+ addedParams.add(encryptRule.getEncryptAssistedQueryValue(databaseName, schemaName, tableName, columnName, originalValue));
}
- if (null != likeQueryEncryptor) {
- Optional<String> likeColumnName = encryptTable.findLikeQueryColumn(encryptContext.getColumnName());
- ShardingSpherePreconditions.checkState(likeColumnName.isPresent(), EncryptLikeQueryColumnNotFoundException::new);
- addedParams.add(likeQueryEncryptor.encrypt(originalValue, encryptContext));
+ Optional<String> likeColumnName = encryptTable.findLikeQueryColumn(columnName);
+ if (likeColumnName.isPresent()) {
+ addedParams.add(encryptRule.getEncryptLikeQueryValue(databaseName, schemaName, tableName, columnName, originalValue));
}
if (!addedParams.isEmpty()) {
if (!paramBuilder.getAddedIndexAndParameters().containsKey(paramIndex)) {
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
index 1b9bd2a8fb6..58e20061113 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
@@ -217,6 +217,28 @@ public final class EncryptRule implements DatabaseRule, TableContainedRule {
return result;
}
+ /**
+ * Get encrypt assisted query value.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param tableName table name
+ * @param logicColumnName logic column name
+ * @param originalValue original value
+ * @return assisted query values
+ */
+ @SuppressWarnings("unchecked")
+ public Object getEncryptAssistedQueryValue(final String databaseName, final String schemaName, final String tableName, final String logicColumnName, final Object originalValue) {
+ if (null == originalValue) {
+ return null;
+ }
+ @SuppressWarnings("rawtypes")
+ Optional<AssistedEncryptAlgorithm> assistedQueryEncryptor = findAssistedQueryEncryptor(tableName, logicColumnName);
+ ShardingSpherePreconditions.checkState(assistedQueryEncryptor.isPresent(), () -> new MissingEncryptorException(tableName, logicColumnName, "ASSIST_QUERY"));
+ EncryptContext context = EncryptContextBuilder.build(databaseName, schemaName, tableName, logicColumnName);
+ return assistedQueryEncryptor.get().encrypt(originalValue, context);
+ }
+
/**
* Get encrypt assisted query values.
*
@@ -245,6 +267,28 @@ public final class EncryptRule implements DatabaseRule, TableContainedRule {
return result;
}
+ /**
+ * Get encrypt like query value.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param tableName table name
+ * @param logicColumnName logic column name
+ * @param originalValue original value
+ * @return like query values
+ */
+ @SuppressWarnings("unchecked")
+ public Object getEncryptLikeQueryValue(final String databaseName, final String schemaName, final String tableName, final String logicColumnName, final Object originalValue) {
+ if (null == originalValue) {
+ return null;
+ }
+ @SuppressWarnings("rawtypes")
+ Optional<LikeEncryptAlgorithm> likeQueryEncryptor = findLikeQueryEncryptor(tableName, logicColumnName);
+ ShardingSpherePreconditions.checkState(likeQueryEncryptor.isPresent(), () -> new MissingEncryptorException(tableName, logicColumnName, "LIKE_QUERY"));
+ EncryptContext context = EncryptContextBuilder.build(databaseName, schemaName, tableName, logicColumnName);
+ return likeQueryEncryptor.get().encrypt(originalValue, context);
+ }
+
/**
* Get encrypt like query values.
*
@@ -264,11 +308,10 @@ public final class EncryptRule implements DatabaseRule, TableContainedRule {
}
@SuppressWarnings("unchecked")
- private List<Object> getEncryptLikeQueryValues(@SuppressWarnings("rawtypes") final LikeEncryptAlgorithm likeQueryEncryptor, final List<Object> originalValues,
- final EncryptContext encryptContext) {
+ private List<Object> getEncryptLikeQueryValues(@SuppressWarnings("rawtypes") final LikeEncryptAlgorithm likeQueryEncryptor, final List<Object> originalValues, final EncryptContext context) {
List<Object> result = new LinkedList<>();
for (Object each : originalValues) {
- result.add(null == each ? null : likeQueryEncryptor.encrypt(each, encryptContext));
+ result.add(null == each ? null : likeQueryEncryptor.encrypt(each, context));
}
return result;
}