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 16:10:51 UTC

[shardingsphere] branch master updated: Refactor EncryptInsertValuesTokenGenerator (#26377)

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 590f12a0fcb Refactor EncryptInsertValuesTokenGenerator (#26377)
590f12a0fcb is described below

commit 590f12a0fcbf2d822dc5bbdc5dc9f0fbf1d63b3f
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Fri Jun 16 00:10:44 2023 +0800

    Refactor EncryptInsertValuesTokenGenerator (#26377)
---
 .../insert/EncryptInsertValuesTokenGenerator.java  | 66 +++++++++-------------
 1 file changed, 27 insertions(+), 39 deletions(-)

diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
index 345df6c002c..2fdeb338b1f 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
@@ -17,13 +17,7 @@
 
 package org.apache.shardingsphere.encrypt.rewrite.token.generator.insert;
 
-import com.google.common.base.Preconditions;
 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.rewrite.aware.DatabaseNameAware;
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptInsertValuesToken;
@@ -55,7 +49,6 @@ import java.util.Optional;
 /**
  * Insert values token generator for encrypt.
  */
-@SuppressWarnings({"unchecked", "rawtypes"})
 @Setter
 public final class EncryptInsertValuesTokenGenerator implements OptionalSQLTokenGenerator<InsertStatementContext>, PreviousSQLTokensAware, EncryptRuleAware, DatabaseNameAware {
     
@@ -132,6 +125,7 @@ public final class EncryptInsertValuesTokenGenerator implements OptionalSQLToken
     
     private void encryptToken(final InsertValue insertValueToken, final String schemaName, final EncryptTable encryptTable,
                               final InsertStatementContext insertStatementContext, final InsertValueContext insertValueContext) {
+        String tableName = encryptTable.getTable();
         Optional<SQLToken> useDefaultInsertColumnsToken = findPreviousSQLToken(UseDefaultInsertColumnsToken.class);
         Iterator<String> descendingColumnNames = insertStatementContext.getDescendingColumnNames();
         while (descendingColumnNames.hasNext()) {
@@ -139,52 +133,46 @@ public final class EncryptInsertValuesTokenGenerator implements OptionalSQLToken
             if (!encryptTable.isEncryptColumn(columnName)) {
                 continue;
             }
-            int columnIndex = useDefaultInsertColumnsToken.map(optional -> ((UseDefaultInsertColumnsToken) optional).getColumns().indexOf(columnName))
-                    .orElseGet(() -> insertStatementContext.getColumnNames().indexOf(columnName));
+            int columnIndex = useDefaultInsertColumnsToken
+                    .map(optional -> ((UseDefaultInsertColumnsToken) optional).getColumns().indexOf(columnName)).orElseGet(() -> insertStatementContext.getColumnNames().indexOf(columnName));
             Object originalValue = insertValueContext.getLiteralValue(columnIndex).orElse(null);
-            EncryptContext encryptContext = EncryptContextBuilder.build(databaseName, schemaName, encryptTable.getTable(), columnName);
-            Optional<StandardEncryptAlgorithm> encryptor = encryptRule.findStandardEncryptor(encryptTable.getTable(), columnName);
-            Preconditions.checkState(encryptor.isPresent());
-            setCipherColumn(insertValueToken, encryptor.get(), columnIndex, encryptContext, insertValueContext.getValueExpressions().get(columnIndex), originalValue);
+            setCipherColumn(schemaName, tableName, columnName, insertValueToken, insertValueContext.getValueExpressions().get(columnIndex), columnIndex, originalValue);
             int indexDelta = 1;
-            if (encryptRule.findAssistedQueryEncryptor(encryptTable.getTable(), columnName).isPresent()) {
-                addAssistedQueryColumn(encryptTable, insertValueToken,
-                        encryptRule.findAssistedQueryEncryptor(encryptTable.getTable(), columnName).get(), columnIndex, encryptContext, insertValueContext, originalValue, indexDelta);
+            if (encryptTable.findAssistedQueryColumn(columnName).isPresent()) {
+                addAssistedQueryColumn(schemaName, tableName, columnName, insertValueContext, insertValueToken, columnIndex, indexDelta, originalValue);
                 indexDelta++;
             }
-            if (encryptRule.findLikeQueryEncryptor(encryptTable.getTable(), columnName).isPresent()) {
-                addLikeQueryColumn(encryptTable, insertValueToken,
-                        encryptRule.findLikeQueryEncryptor(encryptTable.getTable(), columnName).get(), columnIndex, encryptContext, insertValueContext, originalValue, indexDelta);
+            if (encryptTable.findLikeQueryColumn(columnName).isPresent()) {
+                addLikeQueryColumn(schemaName, tableName, columnName, insertValueContext, insertValueToken, columnIndex, indexDelta, originalValue);
             }
         }
     }
     
-    private void setCipherColumn(final InsertValue insertValueToken, final StandardEncryptAlgorithm encryptAlgorithm, final int columnIndex,
-                                 final EncryptContext encryptContext, final ExpressionSegment valueExpression, final Object originalValue) {
+    private void setCipherColumn(final String schemaName, final String tableName, final String columnName,
+                                 final InsertValue insertValueToken, final ExpressionSegment valueExpression, final int columnIndex, final Object originalValue) {
         if (valueExpression instanceof LiteralExpressionSegment) {
-            insertValueToken.getValues().set(columnIndex,
-                    new LiteralExpressionSegment(valueExpression.getStartIndex(), valueExpression.getStopIndex(), encryptAlgorithm.encrypt(originalValue, encryptContext)));
+            insertValueToken.getValues().set(columnIndex, new LiteralExpressionSegment(
+                    valueExpression.getStartIndex(), valueExpression.getStopIndex(), encryptRule.encrypt(databaseName, schemaName, tableName, columnName, originalValue)));
         }
     }
     
-    private void addAssistedQueryColumn(final EncryptTable encryptTable, final InsertValue insertValueToken, final AssistedEncryptAlgorithm assistQueryEncryptor, final int columnIndex,
-                                        final EncryptContext encryptContext, final InsertValueContext insertValueContext, final Object originalValue, final int indexDelta) {
-        if (encryptTable.findAssistedQueryColumn(encryptContext.getColumnName()).isPresent()) {
-            DerivedSimpleExpressionSegment derivedExpressionSegment = isAddLiteralExpressionSegment(insertValueContext, columnIndex)
-                    ? new DerivedLiteralExpressionSegment(assistQueryEncryptor.encrypt(originalValue, encryptContext))
-                    : new DerivedParameterMarkerExpressionSegment(getParameterIndexCount(insertValueToken));
-            insertValueToken.getValues().add(columnIndex + indexDelta, derivedExpressionSegment);
-        }
+    private void addAssistedQueryColumn(final String schemaName, final String tableName, final String columnName,
+                                        final InsertValueContext insertValueContext, final InsertValue insertValueToken, final int columnIndex, final int indexDelta, final Object originalValue) {
+        Object derivedValue = encryptRule.getEncryptAssistedQueryValue(databaseName, schemaName, tableName, columnName, originalValue);
+        addDerivedColumn(insertValueContext, insertValueToken, columnIndex, indexDelta, derivedValue);
     }
     
-    private void addLikeQueryColumn(final EncryptTable encryptTable, final InsertValue insertValueToken, final LikeEncryptAlgorithm likeQueryEncryptor, final int columnIndex,
-                                    final EncryptContext encryptContext, final InsertValueContext insertValueContext, final Object originalValue, final int indexDelta) {
-        if (encryptTable.findLikeQueryColumn(encryptContext.getColumnName()).isPresent()) {
-            DerivedSimpleExpressionSegment derivedExpressionSegment = isAddLiteralExpressionSegment(insertValueContext, columnIndex)
-                    ? new DerivedLiteralExpressionSegment(likeQueryEncryptor.encrypt(originalValue, encryptContext))
-                    : new DerivedParameterMarkerExpressionSegment(getParameterIndexCount(insertValueToken));
-            insertValueToken.getValues().add(columnIndex + indexDelta, derivedExpressionSegment);
-        }
+    private void addLikeQueryColumn(final String schemaName, final String tableName, final String columnName,
+                                    final InsertValueContext insertValueContext, final InsertValue insertValueToken, final int columnIndex, final int indexDelta, final Object originalValue) {
+        Object derivedValue = encryptRule.getEncryptLikeQueryValue(databaseName, schemaName, tableName, columnName, originalValue);
+        addDerivedColumn(insertValueContext, insertValueToken, columnIndex, indexDelta, derivedValue);
+    }
+    
+    private void addDerivedColumn(final InsertValueContext insertValueContext, final InsertValue insertValueToken, final int columnIndex, final int indexDelta, final Object derivedValue) {
+        DerivedSimpleExpressionSegment derivedExpressionSegment = isAddLiteralExpressionSegment(insertValueContext, columnIndex)
+                ? new DerivedLiteralExpressionSegment(derivedValue)
+                : new DerivedParameterMarkerExpressionSegment(getParameterIndexCount(insertValueToken));
+        insertValueToken.getValues().add(columnIndex + indexDelta, derivedExpressionSegment);
     }
     
     private boolean isAddLiteralExpressionSegment(final InsertValueContext insertValueContext, final int columnIndex) {