This is an automated email from the ASF dual-hosted git repository.

dinglei pushed a commit to branch 4.9.x
in repository https://gitbox.apache.org/repos/asf/rocketmq.git


The following commit(s) were added to refs/heads/4.9.x by this push:
     new 20b838838d Add validation in broker/namesrv configure updating command 
(#7649)
20b838838d is described below

commit 20b838838d064a0726b2f6f650fed7f21be0825f
Author: rongtong <jinrongto...@163.com>
AuthorDate: Fri Dec 15 10:08:48 2023 +0800

    Add validation in broker/namesrv configure updating command (#7649)
---
 .../broker/processor/AdminBrokerProcessor.java     | 27 +++++++++++++++++++
 .../org/apache/rocketmq/common/BrokerConfig.java   | 16 ++++++++++++
 .../rocketmq/common/namesrv/NamesrvConfig.java     | 15 +++++++++++
 .../namesrv/processor/DefaultRequestProcessor.java | 30 ++++++++++++++++++++--
 .../processor/DefaultRequestProcessorTest.java     | 15 +++++++++--
 5 files changed, 99 insertions(+), 4 deletions(-)

diff --git 
a/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java
 
b/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java
index 95594ac4e1..c9d2cacf60 100644
--- 
a/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java
+++ 
b/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java
@@ -19,6 +19,7 @@ package org.apache.rocketmq.broker.processor;
 import com.alibaba.fastjson.JSON;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandlerContext;
+import java.util.Arrays;
 import org.apache.rocketmq.acl.AccessValidator;
 import org.apache.rocketmq.acl.plain.PlainAccessValidator;
 import org.apache.rocketmq.broker.BrokerController;
@@ -143,8 +144,19 @@ public class AdminBrokerProcessor extends 
AsyncNettyRequestProcessor {
     private static final InternalLogger log = 
InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final BrokerController brokerController;
 
+    protected Set<String> configBlackList = new HashSet<>();
+
     public AdminBrokerProcessor(final BrokerController brokerController) {
         this.brokerController = brokerController;
+        initConfigBlackList();
+    }
+
+    private void initConfigBlackList() {
+        configBlackList.add("brokerConfigPath");
+        configBlackList.add("rocketmqHome");
+        configBlackList.add("configBlackList");
+        String[] configArray = 
brokerController.getBrokerConfig().getConfigBlackList().split(";");
+        configBlackList.addAll(Arrays.asList(configArray));
     }
 
     @Override
@@ -522,6 +534,11 @@ public class AdminBrokerProcessor extends 
AsyncNettyRequestProcessor {
                 String bodyStr = new String(body, MixAll.DEFAULT_CHARSET);
                 Properties properties = MixAll.string2Properties(bodyStr);
                 if (properties != null) {
+                    if (validateBlackListConfigExist(properties)) {
+                        response.setCode(ResponseCode.NO_PERMISSION);
+                        response.setRemark("Can not update config in black 
list.");
+                    }
+
                     log.info("updateBrokerConfig, new config: [{}] client: {} 
", properties, ctx.channel().remoteAddress());
                     
this.brokerController.getConfiguration().update(properties);
                     if (properties.containsKey("brokerPermission")) {
@@ -547,6 +564,16 @@ public class AdminBrokerProcessor extends 
AsyncNettyRequestProcessor {
         return response;
     }
 
+
+    private boolean validateBlackListConfigExist(Properties properties) {
+        for (String blackConfig:configBlackList) {
+            if (properties.containsKey(blackConfig)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private RemotingCommand getBrokerConfig(ChannelHandlerContext ctx, 
RemotingCommand request) {
 
         final RemotingCommand response = 
RemotingCommand.createResponseCommand(GetBrokerConfigResponseHeader.class);
diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java 
b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java
index 401b457881..6c995fe05a 100644
--- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java
+++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java
@@ -196,6 +196,14 @@ public class BrokerConfig {
      */
     private boolean isolateLogEnable = false;
 
+
+    /**
+     * Config in this black list will be not allowed to update by command.
+     * Try to update this config black list by restart process.
+     * Try to update configures in black list by restart process.
+     */
+    private String configBlackList = "configBlackList;brokerConfigPath";
+
     public static String localHostName() {
         try {
             return InetAddress.getLocalHost().getHostName();
@@ -845,4 +853,12 @@ public class BrokerConfig {
     public void setIsolateLogEnable(boolean isolateLogEnable) {
         this.isolateLogEnable = isolateLogEnable;
     }
+
+    public String getConfigBlackList() {
+        return configBlackList;
+    }
+
+    public void setConfigBlackList(String configBlackList) {
+        this.configBlackList = configBlackList;
+    }
 }
diff --git 
a/common/src/main/java/org/apache/rocketmq/common/namesrv/NamesrvConfig.java 
b/common/src/main/java/org/apache/rocketmq/common/namesrv/NamesrvConfig.java
index f687d2c243..955fe4ba4d 100644
--- a/common/src/main/java/org/apache/rocketmq/common/namesrv/NamesrvConfig.java
+++ b/common/src/main/java/org/apache/rocketmq/common/namesrv/NamesrvConfig.java
@@ -36,6 +36,13 @@ public class NamesrvConfig {
     private boolean clusterTest = false;
     private boolean orderMessageEnable = false;
 
+    /**
+     * Config in this black list will be not allowed to update by command.
+     * Try to update this config black list by restart process.
+     * Try to update configures in black list by restart process.
+     */
+    private String configBlackList = 
"configBlackList;configStorePath;kvConfigPath";
+
     public boolean isOrderMessageEnable() {
         return orderMessageEnable;
     }
@@ -83,4 +90,12 @@ public class NamesrvConfig {
     public void setConfigStorePath(final String configStorePath) {
         this.configStorePath = configStorePath;
     }
+
+    public String getConfigBlackList() {
+        return configBlackList;
+    }
+
+    public void setConfigBlackList(String configBlackList) {
+        this.configBlackList = configBlackList;
+    }
 }
diff --git 
a/namesrv/src/main/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java
 
b/namesrv/src/main/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java
index e679dcafbc..1cf2fa8e2f 100644
--- 
a/namesrv/src/main/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java
+++ 
b/namesrv/src/main/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java
@@ -19,6 +19,9 @@ package org.apache.rocketmq.namesrv.processor;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import io.netty.channel.ChannelHandlerContext;
 import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+import java.util.Set;
+import java.util.HashSet;
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.rocketmq.common.DataVersion;
@@ -69,8 +72,20 @@ public class DefaultRequestProcessor extends 
AsyncNettyRequestProcessor implemen
 
     protected final NamesrvController namesrvController;
 
+    protected Set<String> configBlackList = new HashSet<>();
+
     public DefaultRequestProcessor(NamesrvController namesrvController) {
         this.namesrvController = namesrvController;
+        initConfigBlackList();
+    }
+
+    private void initConfigBlackList() {
+        configBlackList.add("configBlackList");
+        configBlackList.add("configStorePath");
+        configBlackList.add("kvConfigPath");
+        configBlackList.add("rocketmqHome");
+        String[] configArray = 
namesrvController.getNamesrvConfig().getConfigBlackList().split(";");
+        configBlackList.addAll(Arrays.asList(configArray));
     }
 
     @Override
@@ -581,9 +596,9 @@ public class DefaultRequestProcessor extends 
AsyncNettyRequestProcessor implemen
                 return response;
             }
 
-            if (properties.containsKey("kvConfigPath") || 
properties.containsKey("configStorePath")) {
+            if (validateBlackListConfigExist(properties)) {
                 response.setCode(ResponseCode.NO_PERMISSION);
-                response.setRemark("Can not update config path");
+                response.setRemark("Can not update config in black list.");
                 return response;
             }
 
@@ -595,6 +610,17 @@ public class DefaultRequestProcessor extends 
AsyncNettyRequestProcessor implemen
         return response;
     }
 
+    private boolean validateBlackListConfigExist(Properties properties) {
+        for (String blackConfig : configBlackList) {
+            if (properties.containsKey(blackConfig)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+
     private RemotingCommand getConfig(ChannelHandlerContext ctx, 
RemotingCommand request) {
         final RemotingCommand response = 
RemotingCommand.createResponseCommand(null);
 
diff --git 
a/namesrv/src/test/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessorTest.java
 
b/namesrv/src/test/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessorTest.java
index f22031ea6e..beb9ec4992 100644
--- 
a/namesrv/src/test/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessorTest.java
+++ 
b/namesrv/src/test/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessorTest.java
@@ -185,7 +185,7 @@ public class DefaultRequestProcessorTest {
 
         assertThat(response).isNotNull();
         assertThat(response.getCode()).isEqualTo(ResponseCode.NO_PERMISSION);
-        assertThat(response.getRemark()).contains("Can not update config 
path");
+        assertThat(response.getRemark()).contains("Can not update config in 
black list.");
 
         //update disallowed values
         properties.clear();
@@ -196,7 +196,18 @@ public class DefaultRequestProcessorTest {
 
         assertThat(response).isNotNull();
         assertThat(response.getCode()).isEqualTo(ResponseCode.NO_PERMISSION);
-        assertThat(response.getRemark()).contains("Can not update config 
path");
+        assertThat(response.getRemark()).contains("Can not update config in 
black list");
+
+        //update disallowed values
+        properties.clear();
+        properties.setProperty("configBlackList", "test;path");
+        
updateConfigRequest.setBody(MixAll.properties2String(properties).getBytes(StandardCharsets.UTF_8));
+
+        response = defaultRequestProcessor.processRequest(null, 
updateConfigRequest);
+
+        assertThat(response).isNotNull();
+        assertThat(response.getCode()).isEqualTo(ResponseCode.NO_PERMISSION);
+        assertThat(response.getRemark()).contains("Can not update config in 
black list");
     }
 
     @Test

Reply via email to