diff --git a/broker/src/main/java/io/moquette/imhandler/KickoffGroupMember.java b/broker/src/main/java/io/moquette/imhandler/KickoffGroupMember.java index 6e726181..77a2b940 100644 --- a/broker/src/main/java/io/moquette/imhandler/KickoffGroupMember.java +++ b/broker/src/main/java/io/moquette/imhandler/KickoffGroupMember.java @@ -24,20 +24,32 @@ public class KickoffGroupMember extends GroupHandler 0) { - sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent()); - } else { - WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, request.getRemovedMemberList()).getKickokfMemberGroupNotifyContent(); - sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content); - } - errorCode = m_messagesStore.kickoffGroupMembers(fromUser, isAdmin, request.getGroupId(), request.getRemovedMemberList()); } else { - errorCode = ErrorCode.ERROR_CODE_NOT_RIGHT; + boolean isAllow = isAdmin; + if (!isAllow) { + if (groupInfo.getOwner() != null && groupInfo.getOwner().equals(fromUser)) { + isAllow = true; + } + } + + if (!isAllow) { + WFCMessage.GroupMember gm = m_messagesStore.getGroupMember(request.getGroupId(), fromUser); + if (gm != null && gm.getType() == ProtoConstants.GroupMemberType.GroupMemberType_Manager) { + isAllow = true; + } + } + if (!isAllow && (groupInfo.getType() == ProtoConstants.GroupType.GroupType_Normal || groupInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted)) { + errorCode = ErrorCode.ERROR_CODE_NOT_RIGHT; + } else { + //send notify message first, then kickoff the member + if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) { + sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent()); + } else { + WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, request.getRemovedMemberList()).getKickokfMemberGroupNotifyContent(); + sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content); + } + errorCode = m_messagesStore.kickoffGroupMembers(fromUser, isAdmin, request.getGroupId(), request.getRemovedMemberList()); + } } return errorCode; } diff --git a/broker/src/main/java/io/moquette/imhandler/ModifyGroupInfoHandler.java b/broker/src/main/java/io/moquette/imhandler/ModifyGroupInfoHandler.java index 06411e97..111100db 100644 --- a/broker/src/main/java/io/moquette/imhandler/ModifyGroupInfoHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/ModifyGroupInfoHandler.java @@ -22,7 +22,7 @@ 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) { - ErrorCode errorCode= m_messagesStore.modifyGroupInfo(fromUser, request.getGroupId(), request.getType(), request.getValue()); + 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) { sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent()); diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index aea4bb15..5c113a42 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -628,23 +628,30 @@ public class MemoryMessagesStore implements IMessagesStore { if (groupInfo == null) { return ErrorCode.ERROR_CODE_NOT_EXIST; } - if (groupInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted && (groupInfo.getOwner() == null || !groupInfo.getOwner().equals(operator))) { - return ErrorCode.ERROR_CODE_NOT_RIGHT; - } + MultiMap groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS); if (!isAdmin) { boolean isMember = false; + boolean isManager = false; for (WFCMessage.GroupMember member : memberList) { - if (member.getType() == GroupMemberType_Removed) { - return ErrorCode.ERROR_CODE_NOT_IN_GROUP; - } else if(member.getType() == GroupMemberType_Silent) { - return ErrorCode.ERROR_CODE_NOT_RIGHT; + if (member.getMemberId().equals(operator)) { + if (member.getType() == GroupMemberType_Removed) { + return ErrorCode.ERROR_CODE_NOT_IN_GROUP; + } else if (member.getType() == GroupMemberType_Silent) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + isManager = (member.getType() == GroupMemberType_Manager || member.getType() == GroupMemberType_Owner); + isMember = true; + break; } - isMember = true; - break; } + + if (groupInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted && ((groupInfo.getOwner() == null || !groupInfo.getOwner().equals(operator)) && !isManager)) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + if (!isMember) { return ErrorCode.ERROR_CODE_NOT_IN_GROUP; } @@ -804,7 +811,7 @@ public class MemoryMessagesStore implements IMessagesStore { } @Override - public ErrorCode modifyGroupInfo(String operator, String groupId, int modifyType, String value) { + public ErrorCode modifyGroupInfo(String operator, String groupId, int modifyType, String value, boolean isAdmin) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); IMap mIMap = hzInstance.getMap(GROUPS_MAP); @@ -815,22 +822,36 @@ public class MemoryMessagesStore implements IMessagesStore { return ErrorCode.ERROR_CODE_NOT_EXIST; } - if ((oldInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted) - && (oldInfo.getOwner() == null || !oldInfo.getOwner().equals(operator))) { - return ErrorCode.ERROR_CODE_NOT_RIGHT; - } - - if (oldInfo.getType() == ProtoConstants.GroupType.GroupType_Normal) { - if (oldInfo.getOwner() == null) { - return ErrorCode.ERROR_CODE_NOT_RIGHT; - } - if (!oldInfo.getOwner().equals(operator)) { - if (modifyType == Modify_Group_Extra) { + if (!isAdmin) { + if (oldInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted) { + boolean isAllow = false; + if ((oldInfo.getOwner() != null && oldInfo.getOwner().equals(operator))) { + isAllow = true; + } else { + WFCMessage.GroupMember gm = getGroupMember(groupId, operator); + if (gm != null && gm.getType() == GroupMemberType_Manager) { + isAllow = true; + } + } + if (!isAllow) { return ErrorCode.ERROR_CODE_NOT_RIGHT; } } + + if (oldInfo.getType() == ProtoConstants.GroupType.GroupType_Normal) { + if (oldInfo.getOwner() == null) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + if (!oldInfo.getOwner().equals(operator)) { + if (modifyType == Modify_Group_Extra) { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + } + } } + + WFCMessage.GroupInfo.Builder newInfoBuilder = oldInfo.toBuilder(); if (modifyType == Modify_Group_Name) @@ -946,6 +967,24 @@ public class MemoryMessagesStore implements IMessagesStore { return ErrorCode.ERROR_CODE_SUCCESS; } + @Override + public WFCMessage.GroupMember getGroupMember(String groupId, String memberId) { + HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); + + MultiMap groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS); + + Collection members = groupMembers.get(groupId); + if (members != null) { + for (WFCMessage.GroupMember gm : members) { + if (gm.getMemberId().equals(memberId)) { + return gm; + } + } + } + + return null; + } + @Override public ErrorCode transferGroup(String operator, String groupId, String newOwner, boolean isAdmin) { diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 1f597747..064098e6 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -107,11 +107,12 @@ public interface IMessagesStore { ErrorCode kickoffGroupMembers(String operator, boolean isAdmin, String groupId, List memberList); ErrorCode quitGroup(String operator, String groupId); ErrorCode dismissGroup(String operator, String groupId, boolean isAdmin); - ErrorCode modifyGroupInfo(String operator, String groupId, int modifyType, String value); + ErrorCode modifyGroupInfo(String operator, String groupId, int modifyType, String value, boolean isAdmin); ErrorCode modifyGroupAlias(String operator, String groupId, String alias); List getGroupInfos(List requests); WFCMessage.GroupInfo getGroupInfo(String groupId); ErrorCode getGroupMembers(String groupId, long maxDt, List members); + WFCMessage.GroupMember getGroupMember(String groupId, String memberId); ErrorCode transferGroup(String operator, String groupId, String newOwner, boolean isAdmin); ErrorCode setGroupManager(String operator, String groupId, int type, List userList, boolean isAdmin); boolean isMemberInGroup(String member, String groupId);