diff --git a/broker/config/wildfirechat.conf b/broker/config/wildfirechat.conf index fa08ebb1..79d173ed 100755 --- a/broker/config/wildfirechat.conf +++ b/broker/config/wildfirechat.conf @@ -61,9 +61,15 @@ message.remote_history_message 0 ##服务器为每个用户缓存的消息数量。这个值改得太大,拉取消息时间变长,另外会占用大量内存。 message.max_queue 1024 -##是否允许陌生人聊天 +##是否禁止陌生人聊天 message.disable_stranger_chat false +##好友请求重复发送的间隔,单位是毫秒,默认是7天,0为不限制 +friend.repeat_request_duration 604800000 + +##好友请求被拒绝后再次发送的间隔,单位是毫秒,默认是30天,0为不限制 +friend.reject_request_duration 2592000000 + #********************************************************************* # hazelcase configuration #********************************************************************* diff --git a/broker/src/main/java/io/moquette/BrokerConstants.java b/broker/src/main/java/io/moquette/BrokerConstants.java index b8845451..a0d8e224 100755 --- a/broker/src/main/java/io/moquette/BrokerConstants.java +++ b/broker/src/main/java/io/moquette/BrokerConstants.java @@ -119,9 +119,9 @@ public final class BrokerConstants { public static final String MESSAGE_Disable_Stranger_Chat = "message.disable_stranger_chat"; - - - + public static final String MESSAGE_Blacklist_Strategy = "blacklist.strategy"; + public static final String FRIEND_Repeat_Request_Duration = "friend.repeat_request_duration"; + public static final String FRIEND_Reject_Request_Duration = "friend.reject_request_duration"; private BrokerConstants() { } diff --git a/broker/src/main/java/io/moquette/imhandler/GroupHandler.java b/broker/src/main/java/io/moquette/imhandler/GroupHandler.java index e1e62b47..7d57e64c 100644 --- a/broker/src/main/java/io/moquette/imhandler/GroupHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/GroupHandler.java @@ -32,7 +32,7 @@ abstract public class GroupHandler extends IMHandler { builder.setFromUser(fromUser); long messageId = MessageShardingUtil.generateId(); builder.setMessageId(messageId); - saveAndPublish(fromUser, null, builder.build()); + saveAndPublish(fromUser, null, builder.build(), false); } } diff --git a/broker/src/main/java/io/moquette/imhandler/HandleFriendRequestHandler.java b/broker/src/main/java/io/moquette/imhandler/HandleFriendRequestHandler.java index 119218f2..6db3b922 100644 --- a/broker/src/main/java/io/moquette/imhandler/HandleFriendRequestHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/HandleFriendRequestHandler.java @@ -32,7 +32,7 @@ public class HandleFriendRequestHandler extends IMHandler { Set notifyReceivers = new LinkedHashSet<>(); WFCMessage.Message.Builder messageBuilder = message.toBuilder(); - int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers); + int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers, false); mServer.getImBusinessScheduler().execute(() -> this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType)); return notifyReceivers.size(); } - protected long saveAndPublish(String username, String clientID, WFCMessage.Message message) { + protected long saveAndPublish(String username, String clientID, WFCMessage.Message message, boolean ignoreMsg) { Set notifyReceivers = new LinkedHashSet<>(); message = m_messagesStore.storeMessage(username, clientID, message); WFCMessage.Message.Builder messageBuilder = message.toBuilder(); - int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers); + int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers, ignoreMsg); mServer.getImBusinessScheduler().execute(() -> this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType)); return notifyReceivers.size(); } diff --git a/broker/src/main/java/io/moquette/imhandler/RecallMessageHandler.java b/broker/src/main/java/io/moquette/imhandler/RecallMessageHandler.java index 7745045b..7a4b6498 100644 --- a/broker/src/main/java/io/moquette/imhandler/RecallMessageHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/RecallMessageHandler.java @@ -37,7 +37,7 @@ public class RecallMessageHandler extends IMHandler { //等待客户端实现根据撤回消息更新内容,之后可以删掉这段代码 - m_messagesStore.getNotifyReceivers(fromUser, message.toBuilder(), notifyReceivers); + m_messagesStore.getNotifyReceivers(fromUser, message.toBuilder(), notifyReceivers, false); this.publisher.publishRecall2Receivers(int64Buf.getId(), fromUser, notifyReceivers, clientID); return errorCode; diff --git a/broker/src/main/java/io/moquette/imhandler/SendMessageHandler.java b/broker/src/main/java/io/moquette/imhandler/SendMessageHandler.java index 4919cfba..15426c6b 100644 --- a/broker/src/main/java/io/moquette/imhandler/SendMessageHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/SendMessageHandler.java @@ -26,6 +26,7 @@ import static cn.wildfirechat.proto.ProtoConstants.ContentType.Text; public class SendMessageHandler extends IMHandler { private int mSensitiveType = 0; //命中敏感词时,0 失败,1 吞掉, 2 敏感词替换成*。 private String mForwardUrl = null; + private int mBlacklistStrategy = 0; //黑名单中时,0失败,1吞掉。 public SendMessageHandler() { super(); @@ -40,12 +41,18 @@ public class SendMessageHandler extends IMHandler { e.printStackTrace(); } + try { + mBlacklistStrategy = Integer.parseInt(Server.getConfig().getProperty(BrokerConstants.MESSAGE_Blacklist_Strategy)); + } catch (NumberFormatException e) { + e.printStackTrace(); + } } @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.Message message, Qos1PublishHandler.IMCallback callback) { ErrorCode errorCode = ErrorCode.ERROR_CODE_SUCCESS; if (message != null) { + boolean ignoreMsg = false; if (!isAdmin) { //admin do not check the right // 不能在端上直接发送撤回和群通知 if (message.getContent().getType() == 80 || (message.getContent().getType() >= 100 && message.getContent().getType() < 200)) { @@ -59,7 +66,11 @@ public class SendMessageHandler extends IMHandler { if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Private) { errorCode = m_messagesStore.isAllowUserMessage(message.getConversation().getTarget(), fromUser); if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) { - return errorCode; + if (errorCode == ErrorCode.ERROR_CODE_IN_BLACK_LIST && mBlacklistStrategy != ProtoConstants.BlacklistStrategy.Message_Reject) { + ignoreMsg = true; + } else { + return errorCode; + } } userStatus = m_messagesStore.getUserStatus(message.getConversation().getTarget()); @@ -92,7 +103,7 @@ public class SendMessageHandler extends IMHandler { publisher.forwardMessage(message, mForwardUrl); } - boolean ignoreMsg = false; + if (!isAdmin && message.getContent().getType() == Text) { Set matched = m_messagesStore.handleSensitiveWord(message.getContent().getSearchableContent()); if (matched != null && !matched.isEmpty()) { @@ -115,9 +126,7 @@ public class SendMessageHandler extends IMHandler { } if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) { - if (!ignoreMsg) { - saveAndPublish(fromUser, clientID, message); - } + saveAndPublish(fromUser, clientID, message, ignoreMsg); ackPayload = ackPayload.capacity(20); ackPayload.writeLong(messageId); ackPayload.writeLong(timestamp); diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 8e1b13ba..18ebc83e 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -119,6 +119,8 @@ public class MemoryMessagesStore implements IMessagesStore { private ConcurrentHashMap userPushHiddenDetail = new ConcurrentHashMap<>(); private ConcurrentHashMap userConvSlientMap = new ConcurrentHashMap<>(); + private long mFriendRequestDuration = 7 * 24 * 60 * 60 * 1000; + private long mFriendRejectDuration = 30 * 24 * 60 * 60 * 1000; private boolean mDisableStrangerChat = false; MemoryMessagesStore(Server server, DatabaseStore databaseStore) { @@ -133,6 +135,18 @@ public class MemoryMessagesStore implements IMessagesStore { } catch (Exception e) { e.printStackTrace(); } + + try { + mFriendRequestDuration = Long.parseLong(Server.getConfig().getProperty(FRIEND_Repeat_Request_Duration)); + } catch (Exception e) { + e.printStackTrace(); + } + + try { + mFriendRejectDuration = Long.parseLong(Server.getConfig().getProperty(FRIEND_Reject_Request_Duration)); + } catch (Exception e) { + e.printStackTrace(); + } } @Override @@ -188,12 +202,24 @@ public class MemoryMessagesStore implements IMessagesStore { @Override - public int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder messageBuilder, Set notifyReceivers) { + public int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder messageBuilder, Set notifyReceivers, boolean ignoreMsg) { WFCMessage.Message message = messageBuilder.build(); HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); int type = message.getConversation().getType(); + int pullType = ProtoConstants.PullType.Pull_Normal; + + if (ignoreMsg) { + if (type == ProtoConstants.ConversationType.ConversationType_ChatRoom) { + pullType = ProtoConstants.PullType.Pull_ChatRoom; + } + + if (message.getContent().getPersistFlag() != Transparent) { + notifyReceivers.add(fromUser); + } + return pullType; + } + - int pullType = 0; if (type == ProtoConstants.ConversationType.ConversationType_Private) { notifyReceivers.add(fromUser); notifyReceivers.add(message.getConversation().getTarget()); @@ -1840,9 +1866,9 @@ public class MemoryMessagesStore implements IMessagesStore { } if (existRequest != null && existRequest.getStatus() != ProtoConstants.FriendRequestStatus.RequestStatus_Accepted) { - if (System.currentTimeMillis() - existRequest.getUpdateDt() > 7 * 24 * 60 * 60 * 1000) { + if (System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestDuration) { if (existRequest.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Rejected - && System.currentTimeMillis() - existRequest.getUpdateDt() < 30 * 24 * 60 * 60 * 1000) { + && System.currentTimeMillis() - existRequest.getUpdateDt() < mFriendRejectDuration) { return ErrorCode.ERROR_CODE_FRIEND_REQUEST_BLOCKED; } } else { @@ -1974,7 +2000,7 @@ public class MemoryMessagesStore implements IMessagesStore { } if (existRequest != null) { - if (System.currentTimeMillis() - existRequest.getUpdateDt() > 7 * 24 * 60 * 60 * 1000) { + if (System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestDuration) { return ErrorCode.ERROR_CODE_FRIEND_REQUEST_OVERTIME; } else { existRequest = existRequest.toBuilder().setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Accepted).setUpdateDt(System.currentTimeMillis()).build(); diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index de350de4..4ce37429 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -98,7 +98,7 @@ public interface IMessagesStore { DatabaseStore getDatabaseStore(); WFCMessage.Message storeMessage(String fromUser, String fromClientId, WFCMessage.Message message); void storeSensitiveMessage(WFCMessage.Message message); - int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder message, Set notifyReceivers); + int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder message, Set notifyReceivers, boolean ignoreMsg); Set getAllEnds(); WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType); WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count); diff --git a/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java b/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java index 966301e9..c60deaca 100644 --- a/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java +++ b/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java @@ -145,6 +145,11 @@ public class ProtoConstants { int Forbidden = 2; } + public interface BlacklistStrategy { + int Message_Reject = 0; + int Message_Ignore = 1; + } + public static final int MESSAGE_CONTENT_TYPE_CREATE_GROUP = 104; diff --git a/distribution/src/main/resources/wildfirechat.conf b/distribution/src/main/resources/wildfirechat.conf index 5f32367d..eefd00b6 100755 --- a/distribution/src/main/resources/wildfirechat.conf +++ b/distribution/src/main/resources/wildfirechat.conf @@ -52,9 +52,18 @@ message.remote_history_message 0 ##服务器为每个用户缓存的消息数量。这个值改得太大,拉取消息时间变长,另外会占用大量内存。 message.max_queue 1024 -##是否允许陌生人聊天 +##是否禁止陌生人聊天 message.disable_stranger_chat false +##黑名单处理策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃; +message.blacklist.strategy 0 + +##好友请求重复发送的间隔,单位是毫秒,默认是7天,0为不限制 +friend.repeat_request_duration 604800000 + +##好友请求被拒绝后再次发送的间隔,单位是毫秒,默认是30天,0为不限制 +friend.reject_request_duration 2592000000 + #********************************************************************* # hazelcase configuration #*********************************************************************