diff --git a/broker/config/wildfirechat.conf b/broker/config/wildfirechat.conf index 2cd73984..5cef84a8 100755 --- a/broker/config/wildfirechat.conf +++ b/broker/config/wildfirechat.conf @@ -108,6 +108,9 @@ chatroom.participant_idle_time 900000 ## 用户向聊天室发送消息,自动加入聊天室 chatroom.rejoin_when_active true +## 是否允许客户端发送操作群的自定义群通知消息 +group.allow_client_custom_operation_notification false + #********************************************************************* # hazelcase configuration #********************************************************************* diff --git a/broker/src/main/java/io/moquette/BrokerConstants.java b/broker/src/main/java/io/moquette/BrokerConstants.java index e0432848..994af5b0 100755 --- a/broker/src/main/java/io/moquette/BrokerConstants.java +++ b/broker/src/main/java/io/moquette/BrokerConstants.java @@ -151,6 +151,8 @@ public final class BrokerConstants { public static final String CHATROOM_Participant_Idle_Time = "chatroom.participant_idle_time"; public static final String CHATROOM_Rejoin_When_Active = "chatroom.rejoin_when_active"; + public static final String GROUP_Allow_Client_Custom_Operation_Notification = "group.allow_client_custom_operation_notification"; + public static final String MESSAGES_DISABLE_REMOTE_SEARCH = "message.disable_remote_search"; public static final String MESSAGES_RECALL_TIME_LIMIT = "message.recall_time_limit"; diff --git a/broker/src/main/java/io/moquette/imhandler/CreateGroupHandler.java b/broker/src/main/java/io/moquette/imhandler/CreateGroupHandler.java index 3d5f9ee4..370f9c15 100644 --- a/broker/src/main/java/io/moquette/imhandler/CreateGroupHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/CreateGroupHandler.java @@ -27,9 +27,15 @@ public class CreateGroupHandler extends GroupHandler 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + WFCMessage.GroupInfo groupInfo = m_messagesStore.createGroup(fromUser, request.getGroup().getGroupInfo(), request.getGroup().getMembersList(), isAdmin); + if (groupInfo != null) { - if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) { + if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) { sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent()); } else { WFCMessage.MessageContent content = new GroupNotificationBinaryContent(groupInfo.getTargetId(), fromUser, groupInfo.getName(), "").getCreateGroupNotifyContent(); diff --git a/broker/src/main/java/io/moquette/imhandler/DismissGroupHandler.java b/broker/src/main/java/io/moquette/imhandler/DismissGroupHandler.java index 4560676a..e69aa662 100644 --- a/broker/src/main/java/io/moquette/imhandler/DismissGroupHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/DismissGroupHandler.java @@ -29,8 +29,12 @@ public class DismissGroupHandler extends GroupHandler 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + //send notify message first, then dismiss group - if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) { + if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) { sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent()); } else { WFCMessage.MessageContent content = new GroupNotificationBinaryContent(groupInfo.getTargetId(), fromUser, null, "").getDismissGroupNotifyContent(); diff --git a/broker/src/main/java/io/moquette/imhandler/KickoffGroupMember.java b/broker/src/main/java/io/moquette/imhandler/KickoffGroupMember.java index 9582ece9..9ad63d34 100644 --- a/broker/src/main/java/io/moquette/imhandler/KickoffGroupMember.java +++ b/broker/src/main/java/io/moquette/imhandler/KickoffGroupMember.java @@ -47,8 +47,12 @@ public class KickoffGroupMember extends GroupHandler 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + //send notify message first, then kickoff the member - if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) { + if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) { sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent()); } else { WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, request.getRemovedMemberList()).getKickokfMemberGroupNotifyContent(); diff --git a/broker/src/main/java/io/moquette/imhandler/ModifyGroupAliasHandler.java b/broker/src/main/java/io/moquette/imhandler/ModifyGroupAliasHandler.java index e4b85376..9809e4c6 100644 --- a/broker/src/main/java/io/moquette/imhandler/ModifyGroupAliasHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/ModifyGroupAliasHandler.java @@ -21,9 +21,13 @@ import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS; public class ModifyGroupAliasHandler extends GroupHandler { @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyGroupMemberAlias request, Qos1PublishHandler.IMCallback callback) { + if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + ErrorCode errorCode = m_messagesStore.modifyGroupAlias(fromUser, request.getGroupId(), request.getAlias(), null, isAdmin); if (errorCode == ERROR_CODE_SUCCESS && request.hasNotifyContent()) { - if (request.hasNotifyContent()&& request.getNotifyContent().getType() > 0) { + if (request.hasNotifyContent()&& request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) { sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent()); } else { WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getAlias(), "").getModifyGroupMemberAliasNotifyContent(); diff --git a/broker/src/main/java/io/moquette/imhandler/ModifyGroupInfoHandler.java b/broker/src/main/java/io/moquette/imhandler/ModifyGroupInfoHandler.java index 1deb1e79..681ded5a 100644 --- a/broker/src/main/java/io/moquette/imhandler/ModifyGroupInfoHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/ModifyGroupInfoHandler.java @@ -22,9 +22,13 @@ import static win.liyufan.im.IMTopic.ModifyGroupInfoTopic; public class ModifyGroupInfoHandler extends GroupHandler { @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyGroupInfoRequest request, Qos1PublishHandler.IMCallback callback) { + if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + ErrorCode errorCode= m_messagesStore.modifyGroupInfo(fromUser, request.getGroupId(), request.getType(), request.getValue(), isAdmin); if (errorCode == ERROR_CODE_SUCCESS) { - if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) { + if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) { sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent()); } else { WFCMessage.MessageContent content = null; diff --git a/broker/src/main/java/io/moquette/imhandler/ModifyGroupMemberAliasHandler.java b/broker/src/main/java/io/moquette/imhandler/ModifyGroupMemberAliasHandler.java index 50e02174..21773f5d 100644 --- a/broker/src/main/java/io/moquette/imhandler/ModifyGroupMemberAliasHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/ModifyGroupMemberAliasHandler.java @@ -21,9 +21,13 @@ import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS; public class ModifyGroupMemberAliasHandler extends GroupHandler { @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyGroupMemberAlias request, Qos1PublishHandler.IMCallback callback) { + if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + ErrorCode errorCode = m_messagesStore.modifyGroupAlias(fromUser, request.getGroupId(), request.getAlias(), request.getMemberId(), isAdmin); if (errorCode == ERROR_CODE_SUCCESS && request.hasNotifyContent()) { - if (request.hasNotifyContent()&& request.getNotifyContent().getType() > 0) { + if (request.hasNotifyContent()&& request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) { sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent()); } else { WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getAlias(), request.getMemberId()).getModifyGroupMemberAliasNotifyContent(); diff --git a/broker/src/main/java/io/moquette/imhandler/QuitGroupHandler.java b/broker/src/main/java/io/moquette/imhandler/QuitGroupHandler.java index 38a3b9c8..c6c44eb8 100644 --- a/broker/src/main/java/io/moquette/imhandler/QuitGroupHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/QuitGroupHandler.java @@ -20,9 +20,13 @@ import static win.liyufan.im.IMTopic.QuitGroupTopic; public class QuitGroupHandler extends GroupHandler { @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.QuitGroupRequest request, Qos1PublishHandler.IMCallback callback) { + if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + ErrorCode errorCode = m_messagesStore.quitGroup(fromUser, request.getGroupId()); if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) { - if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) { + if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) { sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent()); } else { WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, "").getQuitGroupNotifyContent(); diff --git a/broker/src/main/java/io/moquette/imhandler/SetGroupManagerHandler.java b/broker/src/main/java/io/moquette/imhandler/SetGroupManagerHandler.java index 2899d433..532cd509 100644 --- a/broker/src/main/java/io/moquette/imhandler/SetGroupManagerHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/SetGroupManagerHandler.java @@ -21,9 +21,13 @@ import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS; public class SetGroupManagerHandler extends GroupHandler { @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.SetGroupManagerRequest request, Qos1PublishHandler.IMCallback callback) { + if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + ErrorCode errorCode = m_messagesStore.setGroupManager(fromUser, request.getGroupId(), request.getType(), request.getUserIdList(), isAdmin); if (errorCode == ERROR_CODE_SUCCESS) { - if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) { + if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) { sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent()); } else { WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getType() + "", request.getUserIdList()).getSetGroupManagerNotifyContent(); diff --git a/broker/src/main/java/io/moquette/imhandler/TransferGroupHandler.java b/broker/src/main/java/io/moquette/imhandler/TransferGroupHandler.java index 9d298d96..8afcb948 100644 --- a/broker/src/main/java/io/moquette/imhandler/TransferGroupHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/TransferGroupHandler.java @@ -21,9 +21,13 @@ import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS; public class TransferGroupHandler extends GroupHandler { @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.TransferGroupRequest request, Qos1PublishHandler.IMCallback callback) { + if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + ErrorCode errorCode = m_messagesStore.transferGroup(fromUser, request.getGroupId(), request.getNewOwner(), isAdmin); if (errorCode == ERROR_CODE_SUCCESS) { - if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) { + if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) { sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent()); } else { WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, request.getNewOwner()).getTransferGroupNotifyContent(); diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 69f47188..1ec89d55 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -150,6 +150,7 @@ public class MemoryMessagesStore implements IMessagesStore { private String mChannelInfoUpdateCallback; private String mChatroomInfoUpdateCallback; private String mChatroomMemberUpdateCallback; + private boolean mGroupAllowClientCustomOperationNotification; MemoryMessagesStore(Server server, DatabaseStore databaseStore) { m_Server = server; @@ -298,6 +299,12 @@ public class MemoryMessagesStore implements IMessagesStore { } catch (Exception e) { } + + try { + mGroupAllowClientCustomOperationNotification = Boolean.parseBoolean(server.getConfig().getProperty(GROUP_Allow_Client_Custom_Operation_Notification)); + } catch (Exception e) { + + } } private void printMissConfigLog(String config, String defaultValue) { @@ -3257,6 +3264,11 @@ public class MemoryMessagesStore implements IMessagesStore { return null; } + @Override + public boolean isAllowClientCustomGroupNotification() { + return mGroupAllowClientCustomOperationNotification; + } + @Override public long getMessageHead(String user) { TreeMap maps = userMessages.get(user); diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index fdd228fa..f7bb234d 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -209,6 +209,9 @@ public interface IMessagesStore { List getAllSensitiveWords(); WFCMessage.Message getMessage(long messageId); + + boolean isAllowClientCustomGroupNotification(); + long getMessageHead(String user); long getFriendHead(String user); long getFriendRqHead(String user); diff --git a/distribution/src/main/resources/wildfirechat.conf b/distribution/src/main/resources/wildfirechat.conf index bc78fd2a..d1042a62 100755 --- a/distribution/src/main/resources/wildfirechat.conf +++ b/distribution/src/main/resources/wildfirechat.conf @@ -99,6 +99,9 @@ chatroom.participant_idle_time 900000 ## 用户向聊天室发送消息,自动加入聊天室 chatroom.rejoin_when_active true +## 是否允许客户端发送操作群的自定义群通知消息 +group.allow_client_custom_operation_notification false + #********************************************************************* # hazelcase configuration #*********************************************************************