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 <[email protected]>
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