diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/channel/GetUserAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/channel/GetUserAction.java index cc508067..72a23976 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/channel/GetUserAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/channel/GetUserAction.java @@ -14,16 +14,12 @@ import cn.wildfirechat.pojos.InputGetUserInfo; import cn.wildfirechat.pojos.InputOutputUserInfo; import cn.wildfirechat.proto.ProtoConstants; import cn.wildfirechat.proto.WFCMessage; -import com.google.gson.Gson; import com.xiaoleilu.loServer.RestResult; -import com.xiaoleilu.loServer.action.admin.AdminAction; -import com.xiaoleilu.loServer.action.robot.RobotAction; import com.xiaoleilu.loServer.annotation.HttpMethod; import com.xiaoleilu.loServer.annotation.Route; import com.xiaoleilu.loServer.handler.Request; import com.xiaoleilu.loServer.handler.Response; import io.netty.handler.codec.http.FullHttpRequest; -import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.util.internal.StringUtil; @Route(APIPath.Channel_User_Info) diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/channel/SendMessageAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/channel/SendMessageAction.java index 10251519..cd65ce1a 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/channel/SendMessageAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/channel/SendMessageAction.java @@ -12,7 +12,6 @@ package com.xiaoleilu.loServer.action.channel; import cn.wildfirechat.common.APIPath; import cn.wildfirechat.pojos.SendChannelMessageData; import cn.wildfirechat.proto.ProtoConstants; -import com.google.gson.Gson; import com.xiaoleilu.loServer.RestResult; import com.xiaoleilu.loServer.annotation.HttpMethod; import com.xiaoleilu.loServer.annotation.Route; @@ -24,7 +23,6 @@ import cn.wildfirechat.pojos.SendMessageResult; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.handler.codec.http.FullHttpRequest; -import io.netty.handler.codec.http.HttpResponseStatus; import cn.wildfirechat.common.ErrorCode; import win.liyufan.im.IMTopic; diff --git a/broker/src/main/java/io/moquette/imhandler/LoadRemoteMessagesHandler.java b/broker/src/main/java/io/moquette/imhandler/LoadRemoteMessagesHandler.java index dd2dc4b3..97dcced5 100644 --- a/broker/src/main/java/io/moquette/imhandler/LoadRemoteMessagesHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/LoadRemoteMessagesHandler.java @@ -33,7 +33,7 @@ public class LoadRemoteMessagesHandler extends IMHandler { } } else if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Channel) { if(!m_messagesStore.getGroupMuteExceptionTypes().contains(message.getContent().getType())) { - if (!m_messagesStore.checkUserInChannel(fromUser, message.getConversation().getTarget())) { + if (!m_messagesStore.canSendMessageInChannel(fromUser, message.getConversation().getTarget())) { return ErrorCode.ERROR_CODE_NOT_IN_CHANNEL; } } diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 65d3eb6c..e72a920a 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -48,7 +48,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Consumer; import static cn.wildfirechat.common.IMExceptionEvent.EventType.EVENT_CALLBACK_Exception; -import static cn.wildfirechat.proto.ProtoConstants.ChannelState.Channel_State_Mask_Deleted; +import static cn.wildfirechat.proto.ProtoConstants.ChannelState.*; import static cn.wildfirechat.proto.ProtoConstants.ChannelUpdateEventType.*; import static cn.wildfirechat.proto.ProtoConstants.ChatroomMemberUpdateEventType.Chatroom_Member_Event_Join; import static cn.wildfirechat.proto.ProtoConstants.ChatroomMemberUpdateEventType.Chatroom_Member_Event_Leave; @@ -3751,6 +3751,34 @@ public class MemoryMessagesStore implements IMessagesStore { return mIMap.get(channelId); } + @Override + public boolean canSendMessageInChannel(String user, String channelId) { + IMap mIMap = m_Server.getHazelcastInstance().getMap(CHANNELS); + WFCMessage.ChannelInfo info = mIMap.get(channelId); + if(info == null || info.getStatus() == Channel_State_Mask_Deleted) { + return false; + } + if(user.equals(info.getOwner())) { + return true; + } + + if((info.getStatus() & Channel_State_Mask_Global) > 0 || (info.getStatus() & Channel_State_Mask_Message_Unsubscribed) > 0) { + return true; + } + + Collection channelMembers = getChannelListener(channelId); + if (channelMembers == null) { + return false; + } + + Collection chatroomMembers = getChannelListener(channelId); + if (chatroomMembers == null || !chatroomMembers.contains(user)) { + return false; + } + + return true; + } + @Override public boolean checkUserInChannel(String user, String channelId) { Collection channelMembers = getChannelListener(channelId); diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 1bb82c75..a9486fd4 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -211,6 +211,7 @@ public interface IMessagesStore { List searchChannel(String keyword, boolean buzzy, int page); ErrorCode listenChannel(String operator, String channelId, boolean listen); WFCMessage.ChannelInfo getChannelInfo(String channelId); + boolean canSendMessageInChannel(String user, String channelId); boolean checkUserInChannel(String user, String channelId); Collection getChannelSubscriber(String channelId);