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个小时,或者重启才能生效。