diff --git a/broker/config/wildfirechat.conf b/broker/config/wildfirechat.conf index 6526d508..93c0f768 100755 --- a/broker/config/wildfirechat.conf +++ b/broker/config/wildfirechat.conf @@ -177,6 +177,9 @@ friend.reject_request_duration 2592000000 ##好友请求过期时间,单位是毫秒,默认是7天,0为无限长期限。 friend.request_expiration_duration 604800000 +##好友请求限制频率,一个用户24小时之内允许请求好友的次数,默认不限频。 +friend.request_rate_limit 30 + ##请求添加机器人为好友时,机器人是否自动接受,默认为true friend.robot_auto_accept true diff --git a/broker/src/main/java/io/moquette/BrokerConstants.java b/broker/src/main/java/io/moquette/BrokerConstants.java index fcd031e4..140ac7ef 100755 --- a/broker/src/main/java/io/moquette/BrokerConstants.java +++ b/broker/src/main/java/io/moquette/BrokerConstants.java @@ -175,6 +175,7 @@ public final class BrokerConstants { public static final String FRIEND_Repeat_Request_Duration = "friend.repeat_request_duration"; public static final String FRIEND_Reject_Request_Duration = "friend.reject_request_duration"; public static final String FRIEND_Request_Expiration_Duration = "friend.request_expiration_duration"; + public static final String FRIEND_Request_Rate_Limit = "friend.request_rate_limit"; public static final String FRIEND_Request_Robot_Auto_Accept = "friend.robot_auto_accept"; diff --git a/broker/src/main/java/io/moquette/imhandler/AddFriendHandler.java b/broker/src/main/java/io/moquette/imhandler/AddFriendHandler.java index 5960a9b3..5ec3c997 100644 --- a/broker/src/main/java/io/moquette/imhandler/AddFriendHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/AddFriendHandler.java @@ -24,7 +24,8 @@ public class AddFriendHandler extends GroupHandler public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, WFCMessage.AddFriendRequest request, Qos1PublishHandler.IMCallback callback) { long[] head = new long[1]; boolean isAdmin = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Admin; - ErrorCode errorCode = m_messagesStore.saveAddFriendRequest(fromUser, request, head, isAdmin); + boolean isRobot = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Robot; + ErrorCode errorCode = m_messagesStore.saveAddFriendRequest(fromUser, request, head, isAdmin, isRobot); if (errorCode == ERROR_CODE_SUCCESS) { WFCMessage.User user = m_messagesStore.getUserInfo(request.getTargetUid()); if (user != null && user.getType() == ProtoConstants.UserType.UserType_Normal) { diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 18b63d3c..30c2200c 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -155,6 +155,7 @@ public class MemoryMessagesStore implements IMessagesStore { private long mFriendRequestDuration = 7 * 24 * 60 * 60 * 1000; private long mFriendRejectDuration = 30 * 24 * 60 * 60 * 1000; private long mFriendRequestExpiration = 7 * 24 * 60 * 60 * 1000; + private RateLimiter mFriendRateLimiter; private boolean mFriendRobotAutoAccept = true; private long mPushExpiredTimes = 604800000L; @@ -344,6 +345,13 @@ public class MemoryMessagesStore implements IMessagesStore { printMissConfigLog(FRIEND_Request_Expiration_Duration, mFriendRequestExpiration + ""); } + try { + int friendRequestRateLimit = Integer.parseInt(m_Server.getConfig().getProperty(FRIEND_Request_Rate_Limit, "0")); + if(friendRequestRateLimit > 0) { + mFriendRateLimiter = new RateLimiter(86400, friendRequestRateLimit); + } + } catch (Exception e) { + } try { mFriendRobotAutoAccept = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.FRIEND_Request_Robot_Auto_Accept, "true")); @@ -3353,11 +3361,18 @@ public class MemoryMessagesStore implements IMessagesStore { } @Override - public ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin) { + public ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin, boolean isRobot) { if (!isAdmin && mDisableFriendRequest) { return ErrorCode.ERROR_CODE_NOT_RIGHT; } + if(!isRobot && !isAdmin && mFriendRateLimiter != null) { + if(!mFriendRateLimiter.isGranted(userId)) { + LOG.error("User {} request add friend over frequency", userId); + return ErrorCode.ERROR_CODE_OVER_FREQUENCY; + } + } + HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); MultiMap requestMap = hzInstance.getMultiMap(USER_FRIENDS_REQUEST); diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 70892613..2b7b5c32 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -179,7 +179,7 @@ public interface IMessagesStore { void clearUserFriend(String userId); List getFriendRequestList(String userId, long version); - ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin); + ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin, boolean isRobot); ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads, boolean isAdmin); ErrorCode deleteFriend(String userId, String friendUid, long[] head); ErrorCode blackUserRequest(String fromUser, String targetUserId, int status, long[] head); diff --git a/distribution/src/main/resources/wildfirechat.conf b/distribution/src/main/resources/wildfirechat.conf index e2f7d935..c05a7a17 100755 --- a/distribution/src/main/resources/wildfirechat.conf +++ b/distribution/src/main/resources/wildfirechat.conf @@ -175,6 +175,9 @@ friend.reject_request_duration 2592000000 ##好友请求过期时间,单位是毫秒,默认是7天,0为无限长期限。 friend.request_expiration_duration 604800000 +##好友请求限制频率,一个用户24小时之内允许请求好友的次数,默认不限频。 +#friend.request_rate_limit 30 + ##请求添加机器人为好友时,机器人是否自动接受,默认为true friend.robot_auto_accept true