From bee03cd2f82ed04d73698bc1ee59940ad1c69ddf Mon Sep 17 00:00:00 2001 From: heavyrian2012 Date: Tue, 5 Aug 2025 15:32:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE=E6=95=8F?= =?UTF-8?q?=E6=84=9F=E8=AF=8D=E6=A3=80=E6=9F=A5=E7=94=A8=E6=88=B7=E6=98=B5?= =?UTF-8?q?=E7=A7=B0/=E7=BE=A4=E7=BB=84=E5=90=8D/=E7=BE=A4=E5=A4=87?= =?UTF-8?q?=E6=B3=A8=E7=AD=89=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- broker/config/wildfirechat.conf | 4 +++ .../java/io/moquette/BrokerConstants.java | 2 +- .../imhandler/CreateGroupHandler.java | 8 ++++++ .../imhandler/ModifyGroupAliasHandler.java | 11 ++++++++ .../ModifyGroupMemberAliasHandler.java | 9 +++++++ .../persistence/MemoryMessagesStore.java | 25 ++++++++++++++++++- .../java/io/moquette/spi/IMessagesStore.java | 1 + .../src/main/resources/wildfirechat.conf | 4 +++ 8 files changed, 62 insertions(+), 2 deletions(-) diff --git a/broker/config/wildfirechat.conf b/broker/config/wildfirechat.conf index dcb879f3..a6d11e67 100755 --- a/broker/config/wildfirechat.conf +++ b/broker/config/wildfirechat.conf @@ -448,6 +448,10 @@ push.harmony.server.address http://localhost:8085/harmony/push ## 如果开启 message.sensitive.forward.url 配置,命中敏感词的消息还会被回调到这个地址 sensitive.filter.type 2 +## 敏感词是否只处理消息。如果为true,只过滤消息;如果为false,会同时过滤用户昵称、群组名和群昵称。 +## 除了消息之外的信息只支持内部敏感词处理,不支持外置审核。 +sensitive.only_message false + ## 敏感词添加或者删除有2种方式,一种是通过Server API进行,这种方式会立即生效。另外一种方法是修改数据库,直接中数据库的t_sensitive_word表中处理 ## 修改数据库的方法不会立即生效,IM服务会2个小时重新加载一次敏感词。所以如果直接修改敏感词表,需要等2个小时,或者重启才能生效。 diff --git a/broker/src/main/java/io/moquette/BrokerConstants.java b/broker/src/main/java/io/moquette/BrokerConstants.java index d25cec55..853472c7 100755 --- a/broker/src/main/java/io/moquette/BrokerConstants.java +++ b/broker/src/main/java/io/moquette/BrokerConstants.java @@ -124,7 +124,7 @@ public final class BrokerConstants { public static final String SENSITIVE_Filter_Type = "sensitive.filter.type"; - + public static final String SENSITIVE_Only_Message = "sensitive.only_message"; public static final String SENSITIVE_Remote_Server_URL = "sensitive.remote_server_url"; public static final String SENSITIVE_Remote_Message_Type = "sensitive.remote_sensitive_message_type"; public static final String SENSITIVE_Remote_Fail_When_Matched = "sensitive.remote_fail_when_matched"; diff --git a/broker/src/main/java/io/moquette/imhandler/CreateGroupHandler.java b/broker/src/main/java/io/moquette/imhandler/CreateGroupHandler.java index 010399ca..0b90c87d 100644 --- a/broker/src/main/java/io/moquette/imhandler/CreateGroupHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/CreateGroupHandler.java @@ -19,6 +19,7 @@ import win.liyufan.im.IMTopic; import java.util.HashMap; import java.util.Map; +import java.util.Set; @Handler(value = IMTopic.CreateGroupTopic) public class CreateGroupHandler extends GroupHandler { @@ -68,6 +69,13 @@ public class CreateGroupHandler extends GroupHandler matched = m_messagesStore.handleSensitiveWord(request.getGroup().getGroupInfo().getName()); + if (matched != null && !matched.isEmpty()) { + return ErrorCode.ERROR_CODE_SENSITIVE_MATCHED; + } + } + WFCMessage.GroupInfo groupInfo = m_messagesStore.createGroup(fromUser, request.getGroup().getGroupInfo(), request.getGroup().getMembersList(), request.getMemberExtra(), isAdmin, failedMembers); if (groupInfo != null && groupInfo.getDeleted() == 0) { if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) { diff --git a/broker/src/main/java/io/moquette/imhandler/ModifyGroupAliasHandler.java b/broker/src/main/java/io/moquette/imhandler/ModifyGroupAliasHandler.java index 68b0dc08..b26b13b7 100644 --- a/broker/src/main/java/io/moquette/imhandler/ModifyGroupAliasHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/ModifyGroupAliasHandler.java @@ -11,11 +11,14 @@ package io.moquette.imhandler; import cn.wildfirechat.proto.ProtoConstants; import cn.wildfirechat.proto.WFCMessage; import cn.wildfirechat.pojos.GroupNotificationBinaryContent; +import com.hazelcast.util.StringUtil; import io.moquette.spi.impl.Qos1PublishHandler; import io.netty.buffer.ByteBuf; import cn.wildfirechat.common.ErrorCode; import win.liyufan.im.IMTopic; +import java.util.Set; + import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS; @Handler(IMTopic.ModifyGroupAliasTopic) @@ -26,10 +29,18 @@ public class ModifyGroupAliasHandler extends GroupHandler 0 && requestSourceType == ProtoConstants.RequestSourceType.Request_From_User && !m_messagesStore.isAllowClientCustomGroupNotification()) { return ErrorCode.ERROR_CODE_NOT_RIGHT; } + if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && requestSourceType == ProtoConstants.RequestSourceType.Request_From_Robot && !m_messagesStore.isAllowRobotCustomGroupNotification()) { return ErrorCode.ERROR_CODE_NOT_RIGHT; } + if (!m_messagesStore.isSensitiveOnlyMessage() && !isAdmin && !StringUtil.isNullOrEmpty(request.getAlias())) { + Set matched = m_messagesStore.handleSensitiveWord(request.getAlias()); + if (matched != null && !matched.isEmpty()) { + return ErrorCode.ERROR_CODE_SENSITIVE_MATCHED; + } + } + ErrorCode errorCode = m_messagesStore.modifyGroupMemberAlias(fromUser, request.getGroupId(), request.getAlias(), null, isAdmin); if (errorCode == ERROR_CODE_SUCCESS) { if (request.hasNotifyContent()&& request.getNotifyContent().getType() > 0) { diff --git a/broker/src/main/java/io/moquette/imhandler/ModifyGroupMemberAliasHandler.java b/broker/src/main/java/io/moquette/imhandler/ModifyGroupMemberAliasHandler.java index 3f630336..93a1c219 100644 --- a/broker/src/main/java/io/moquette/imhandler/ModifyGroupMemberAliasHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/ModifyGroupMemberAliasHandler.java @@ -12,10 +12,13 @@ import cn.wildfirechat.common.ErrorCode; import cn.wildfirechat.pojos.GroupNotificationBinaryContent; import cn.wildfirechat.proto.ProtoConstants; import cn.wildfirechat.proto.WFCMessage; +import com.hazelcast.util.StringUtil; import io.moquette.spi.impl.Qos1PublishHandler; import io.netty.buffer.ByteBuf; import win.liyufan.im.IMTopic; +import java.util.Set; + import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS; @Handler(IMTopic.ModifyGroupMemberAliasTopic) @@ -29,6 +32,12 @@ public class ModifyGroupMemberAliasHandler extends GroupHandler 0 && requestSourceType == ProtoConstants.RequestSourceType.Request_From_Robot && !m_messagesStore.isAllowRobotCustomGroupNotification()) { return ErrorCode.ERROR_CODE_NOT_RIGHT; } + if (!m_messagesStore.isSensitiveOnlyMessage() && !isAdmin && !StringUtil.isNullOrEmpty(request.getAlias())) { + Set matched = m_messagesStore.handleSensitiveWord(request.getAlias()); + if (matched != null && !matched.isEmpty()) { + return ErrorCode.ERROR_CODE_SENSITIVE_MATCHED; + } + } ErrorCode errorCode = m_messagesStore.modifyGroupMemberAlias(fromUser, request.getGroupId(), request.getAlias(), request.getMemberId(), isAdmin); if (errorCode == ERROR_CODE_SUCCESS) { diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index d0183c37..03e60102 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -171,7 +171,7 @@ public class MemoryMessagesStore implements IMessagesStore { private boolean mGroupAllowPartSuccess = false; private boolean mIDUseUUID = true; - + private boolean mSensitiveOnlyMessage = true; private Set mClientSignatureSet = new HashSet<>(); private boolean mRejectEmptySignature = true; @@ -671,6 +671,11 @@ public class MemoryMessagesStore implements IMessagesStore { mIDUseUUID = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.ID_USE_UUID, "false")); } catch (Exception e) { } + + try { + mSensitiveOnlyMessage = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.SENSITIVE_Only_Message, "true")); + } catch (Exception e) { + } } private void printMissConfigLog(String config, String defaultValue) { @@ -1974,6 +1979,13 @@ public class MemoryMessagesStore implements IMessagesStore { if (!isAllow) { return ErrorCode.ERROR_CODE_NOT_RIGHT; } + + if (!mSensitiveOnlyMessage && modifyType == Modify_Group_Name && !StringUtil.isNullOrEmpty(value)) { + Set matched = handleSensitiveWord(value); + if (matched != null && !matched.isEmpty()) { + return ErrorCode.ERROR_CODE_SENSITIVE_MATCHED; + } + } } if (oldInfo.getType() == ProtoConstants.GroupType.GroupType_Normal) { @@ -2810,6 +2822,12 @@ public class MemoryMessagesStore implements IMessagesStore { ) { switch (entry.getType()) { case Modify_DisplayName: + if(!mSensitiveOnlyMessage) { + Set matched = handleSensitiveWord(entry.getValue()); + if (matched != null && !matched.isEmpty()) { + return ErrorCode.ERROR_CODE_SENSITIVE_MATCHED; + } + } builder.setDisplayName(entry.getValue()); modified = true; break; @@ -4770,6 +4788,11 @@ public class MemoryMessagesStore implements IMessagesStore { return new ArrayList<>(databaseStore.getSensitiveWord()); } + @Override + public boolean isSensitiveOnlyMessage() { + return mSensitiveOnlyMessage; + } + @Override public WFCMessage.Message getMessage(long messageId) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index f3064d08..73807150 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -232,6 +232,7 @@ public interface IMessagesStore { boolean addSensitiveWords(List words); boolean removeSensitiveWords(List words); List getAllSensitiveWords(); + boolean isSensitiveOnlyMessage(); WFCMessage.Message getMessage(long messageId); diff --git a/distribution/src/main/resources/wildfirechat.conf b/distribution/src/main/resources/wildfirechat.conf index 5c81f95d..e5e7e919 100755 --- a/distribution/src/main/resources/wildfirechat.conf +++ b/distribution/src/main/resources/wildfirechat.conf @@ -455,6 +455,10 @@ push.harmony.server.address http://localhost:8085/harmony/push ## 如果开启 message.sensitive.forward.url 配置,命中敏感词的消息还会被回调到这个地址 sensitive.filter.type 2 +## 敏感词是否只处理消息。如果为true,只过滤消息;如果为false,会同时过滤用户昵称、群组名和群昵称。 +## 除了消息之外的信息只支持内部敏感词处理,不支持外置审核。 +sensitive.only_message false + ## 敏感词添加或者删除有2种方式,一种是通过Server API进行,这种方式会立即生效。另外一种方法是修改数据库,直接中数据库的t_sensitive_word表中处理 ## 修改数据库的方法不会立即生效,IM服务会2个小时重新加载一次敏感词。所以如果直接修改敏感词表,需要等2个小时,或者重启才能生效。