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;
     }