Fix EncryptRuleConfiguration defaultProperties. (#30990)
diff --git a/features/encrypt/api/src/main/java/org/apache/shardingsphere/encrypt/api/config/EncryptRuleConfiguration.java b/features/encrypt/api/src/main/java/org/apache/shardingsphere/encrypt/api/config/EncryptRuleConfiguration.java
index 0ead0f4..41ade93 100644
--- a/features/encrypt/api/src/main/java/org/apache/shardingsphere/encrypt/api/config/EncryptRuleConfiguration.java
+++ b/features/encrypt/api/src/main/java/org/apache/shardingsphere/encrypt/api/config/EncryptRuleConfiguration.java
@@ -27,7 +27,10 @@
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import java.util.Collection;
+import java.util.HashMap;
import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
/**
* Encrypt rule configuration.
@@ -41,11 +44,20 @@
public EncryptRuleConfiguration(final Collection<EncryptTableRuleConfiguration> tables, final Map<String, AlgorithmConfiguration> encryptors) {
this.tables = tables;
- this.encryptors = encryptors;
- for (AlgorithmConfiguration each : encryptors.values()) {
- TypedSPILoader.findUninitedService(EncryptAlgorithm.class, each.getType()).map(EncryptAlgorithm::getMetaData).map(EncryptAlgorithmMetaData::getDefaultProps)
- .ifPresent(each.getProps()::putAll);
+ this.encryptors = rebuildEncryptorsWithDefaultProperties(encryptors);
+ }
+
+ private Map<String, AlgorithmConfiguration> rebuildEncryptorsWithDefaultProperties(final Map<String, AlgorithmConfiguration> encryptors) {
+ Map<String, AlgorithmConfiguration> result = new HashMap<>();
+ for (Entry<String, AlgorithmConfiguration> entry : encryptors.entrySet()) {
+ Properties props = new Properties();
+ props.putAll(entry.getValue().getProps());
+ Properties defaultProps = TypedSPILoader.findUninitedService(EncryptAlgorithm.class, entry.getValue().getType()).map(EncryptAlgorithm::getMetaData)
+ .map(EncryptAlgorithmMetaData::getDefaultProps).orElseGet(Properties::new);
+ defaultProps.forEach(props::putIfAbsent);
+ result.put(entry.getKey(), new AlgorithmConfiguration(entry.getValue().getType(), props));
}
+ return result;
}
@Override
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
index d2cbaa7..e8520c4 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.encrypt.rule;
+import org.apache.commons.codec.digest.MessageDigestAlgorithms;
import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
import org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnItemRuleConfiguration;
import org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
@@ -40,11 +41,14 @@
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
class EncryptRuleTest {
+ private static final String DIGEST_ALGORITHM_NAME = "digest-algorithm-name";
+
@Test
void assertFindEncryptTable() {
assertTrue(new EncryptRule("foo_db", createEncryptRuleConfiguration()).findEncryptTable("t_encrypt").isPresent());
@@ -86,6 +90,18 @@
assertThat(pwdColumnConfig.getLikeQuery().get().getEncryptorName(), is("like_query_test_encryptor"));
}
+ @Test
+ void assertAESEncryptRuleDefaultProps() {
+ EncryptRuleConfiguration defaultPropsEncryptRuleConfig = new EncryptRuleConfiguration(Collections.emptyList(),
+ Collections.singletonMap("aes_encryptor", new AlgorithmConfiguration("AES", new Properties())));
+ assertEquals(MessageDigestAlgorithms.SHA_1, defaultPropsEncryptRuleConfig.getEncryptors().get("aes_encryptor").getProps().getProperty(DIGEST_ALGORITHM_NAME));
+ Properties props = new Properties();
+ props.put(DIGEST_ALGORITHM_NAME, MessageDigestAlgorithms.SHA_256);
+ EncryptRuleConfiguration sha256EncryptRuleConfig = new EncryptRuleConfiguration(Collections.emptyList(),
+ Collections.singletonMap("aes_encryptor", new AlgorithmConfiguration("AES", props)));
+ assertEquals(MessageDigestAlgorithms.SHA_256, sha256EncryptRuleConfig.getEncryptors().get("aes_encryptor").getProps().getProperty(DIGEST_ALGORITHM_NAME));
+ }
+
private Map<String, AlgorithmConfiguration> getEncryptors(final AlgorithmConfiguration standardEncryptConfig, final AlgorithmConfiguration queryAssistedEncryptConfig,
final AlgorithmConfiguration queryLikeEncryptConfig) {
Map<String, AlgorithmConfiguration> result = new HashMap<>(3, 1F);