diff --git a/broker/config/wildfirechat.conf b/broker/config/wildfirechat.conf index 2fdf89de..073ba47c 100755 --- a/broker/config/wildfirechat.conf +++ b/broker/config/wildfirechat.conf @@ -145,6 +145,9 @@ friend.disable_search false ##禁止按照昵称搜索用户。 friend.disable_nick_name_search false +##禁止按照用户id搜索用户,默认为true。 +friend.disable_user_id_search true + ##禁止发送好友邀请,通过server api添加好友不受此限制(force参数需要为true) friend.disable_friend_request false diff --git a/broker/src/main/java/io/moquette/BrokerConstants.java b/broker/src/main/java/io/moquette/BrokerConstants.java index 8ac2b9d7..aac4d210 100755 --- a/broker/src/main/java/io/moquette/BrokerConstants.java +++ b/broker/src/main/java/io/moquette/BrokerConstants.java @@ -161,6 +161,7 @@ public final class BrokerConstants { public static final String FRIEND_Disable_Search = "friend.disable_search"; public static final String FRIEND_Disable_NickName_Search = "friend.disable_nick_name_search"; + public static final String FRIEND_Disable_UserId_Search = "friend.disable_user_id_search"; public static final String FRIEND_Disable_Friend_Request = "friend.disable_friend_request"; public static final String FRIEND_Repeat_Request_Duration = "friend.repeat_request_duration"; public static final String FRIEND_Reject_Request_Duration = "friend.reject_request_duration"; diff --git a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java index 481ccbf5..4baf1f96 100644 --- a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java +++ b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java @@ -12,7 +12,6 @@ import cn.wildfirechat.pojos.SystemSettingPojo; import cn.wildfirechat.proto.ProtoConstants; import cn.wildfirechat.proto.WFCMessage; import cn.wildfirechat.server.ThreadPoolExecutorWrapper; -import com.google.protobuf.InvalidProtocolBufferException; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.MultiMap; import com.hazelcast.util.StringUtil; @@ -163,7 +162,7 @@ public class DatabaseStore { return null; } - List searchUserByNameMobile(String keyword, int searchType) { + List searchUserByNameMobileUserId(String keyword, int searchType) { ArrayList out = new ArrayList<>(); Connection connection = null; PreparedStatement statement = null; @@ -182,26 +181,34 @@ public class DatabaseStore { ", `_extra`" + ", `_dt`, `_type` from t_user"; + int sqlParaCount = 1; if(searchType == SearchUserType_Name) { sql += " where `_name` = ? "; } else if(searchType == SearchUserType_Mobile) { sql += " where `_mobile` = ? "; - } else { + } else if(searchType == SearchUserType_UserId) { + sql += " where `_uid` = ? "; + } else if(searchType == SearchUserType_Name_Mobile) { + sqlParaCount = 2; sql += " where (`_name` = ? or `_mobile` = ?) "; + } else { + sqlParaCount = 3; + sql += " where (`_name` = ? or `_mobile` = ? or `_uid` = ?) "; } sql += " and `_type` <> 2 and `_deleted` = 0"; //can search normal user(0) and robot(1) and admin(100), can not search things - if(searchType == SearchUserType_Name || searchType == SearchUserType_Mobile) { + if(searchType == SearchUserType_Name || searchType == SearchUserType_Mobile || searchType == SearchUserType_UserId) { sql += " limit 1"; - } else { + } else if(searchType == SearchUserType_Name_Mobile) { sql += " limit 2"; + } else { + sql += " limit 3"; } statement = connection.prepareStatement(sql); - statement.setString(1, keyword); - if(searchType != SearchUserType_Name && searchType != SearchUserType_Mobile) { - statement.setString(2, keyword); + for (int i = 0; i < sqlParaCount; i++) { + statement.setString(i+1, keyword); } rs = statement.executeQuery(); @@ -284,7 +291,7 @@ public class DatabaseStore { if (searchType == SearchUserType_Name) { filter.add(user); continue; - } else if(searchType != SearchUserType_Mobile) { + } else if(searchType == SearchUserType_Name_Mobile) { if(keyword.equals(user.getName())) { if(!keyword.equals(user.getMobile())) { filter.add(user); @@ -294,15 +301,96 @@ public class DatabaseStore { continue; } } + } else if(searchType == SearchUserType_Name_Mobile_UserId) { + if(keyword.equals(user.getName())) { + if(keyword.equals(user.getMobile()) && keyword.equals(user.getUid())) { + if((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0 && (value & ProtoConstants.DisableSearchMask.DisableSearchUserIdMask) > 0) { + filter.add(user); + continue; + } + } else if(keyword.equals(user.getMobile())) { + if((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) { + filter.add(user); + continue; + } + } else if(keyword.equals(user.getUid())) { + if((value & ProtoConstants.DisableSearchMask.DisableSearchUserIdMask) > 0) { + filter.add(user); + continue; + } + } else { + filter.add(user); + continue; + } + } } } - if ((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) { + + if((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) { if (searchType == SearchUserType_Mobile) { filter.add(user); - } else if(searchType != SearchUserType_Name) { - if(keyword.equals(user.getMobile()) && !keyword.equals(user.getName())) { - filter.add(user); + continue; + } else if(searchType == SearchUserType_Name_Mobile) { + if(keyword.equals(user.getMobile())) { + if(!keyword.equals(user.getName())) { + filter.add(user); + continue; + } else if((value & ProtoConstants.DisableSearchMask.DisableSearchNameMask) > 0) { + filter.add(user); + continue; + } + } + } else if(searchType == SearchUserType_Name_Mobile_UserId) { + if(keyword.equals(user.getMobile())) { + if(keyword.equals(user.getName()) && keyword.equals(user.getUid())) { + if((value & ProtoConstants.DisableSearchMask.DisableSearchNameMask) > 0 && (value & ProtoConstants.DisableSearchMask.DisableSearchUserIdMask) > 0) { + filter.add(user); + continue; + } + } else if(keyword.equals(user.getName())) { + if((value & ProtoConstants.DisableSearchMask.DisableSearchNameMask) > 0) { + filter.add(user); + continue; + } + } else if(keyword.equals(user.getUid())) { + if((value & ProtoConstants.DisableSearchMask.DisableSearchUserIdMask) > 0) { + filter.add(user); + continue; + } + } else { + filter.add(user); + continue; + } + } + } + } + + if((value & ProtoConstants.DisableSearchMask.DisableSearchUserIdMask) > 0) { + if (searchType == SearchUserType_UserId) { + filter.add(user); + continue; + } else if(searchType == SearchUserType_Name_Mobile_UserId) { + if(keyword.equals(user.getUid())) { + if(keyword.equals(user.getName()) && keyword.equals(user.getMobile())) { + if((value & ProtoConstants.DisableSearchMask.DisableSearchNameMask) > 0 && (value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) { + filter.add(user); + continue; + } + } else if(keyword.equals(user.getName())) { + if((value & ProtoConstants.DisableSearchMask.DisableSearchNameMask) > 0) { + filter.add(user); + continue; + } + } else if(keyword.equals(user.getMobile())) { + if((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) { + filter.add(user); + continue; + } + } else { + filter.add(user); + continue; + } } } } @@ -423,7 +511,7 @@ public class DatabaseStore { } List searchUserFromDB(String keyword, int searchType, int page) { - List nameOrIdMatched = searchUserByNameMobile(keyword, searchType); + List nameOrIdMatched = searchUserByNameMobileUserId(keyword, searchType); List out = new ArrayList<>(); if(page == 0) { out.addAll(nameOrIdMatched); diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index ca78f35f..d0fcb53f 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -146,6 +146,7 @@ public class MemoryMessagesStore implements IMessagesStore { private boolean mDisableSearch = false; private boolean mDisableNicknameSearch = false; + private boolean mDisableUserIdSearch = false; private boolean mDisableFriendRequest = false; private long mFriendRequestDuration = 7 * 24 * 60 * 60 * 1000; private long mFriendRejectDuration = 30 * 24 * 60 * 60 * 1000; @@ -279,6 +280,12 @@ public class MemoryMessagesStore implements IMessagesStore { Utility.printExecption(LOG, e); printMissConfigLog(FRIEND_Disable_NickName_Search, mDisableNicknameSearch + ""); } + try { + mDisableUserIdSearch = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.FRIEND_Disable_UserId_Search, "true")); + } catch (Exception e) { + + } + try { mDisableFriendRequest = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.FRIEND_Disable_Friend_Request)); } catch (Exception e) { @@ -2838,6 +2845,10 @@ public class MemoryMessagesStore implements IMessagesStore { } if (mDisableNicknameSearch && searchType == ProtoConstants.SearchUserType.SearchUserType_General) { + searchType = ProtoConstants.SearchUserType.SearchUserType_Name_Mobile_UserId; + } + + if(mDisableUserIdSearch && (searchType == ProtoConstants.SearchUserType.SearchUserType_General || searchType == ProtoConstants.SearchUserType.SearchUserType_Name_Mobile_UserId)) { searchType = ProtoConstants.SearchUserType.SearchUserType_Name_Mobile; } diff --git a/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java b/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java index 5e33e5b8..dbf9fad5 100644 --- a/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java +++ b/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java @@ -218,12 +218,15 @@ public class ProtoConstants { int SearchUserType_Name_Mobile = 1; int SearchUserType_Name = 2; int SearchUserType_Mobile = 3; + int SearchUserType_UserId = 4; + int SearchUserType_Name_Mobile_UserId = 5; } public interface DisableSearchMask { int DisableSearchDisplayNameMask = 1; int DisableSearchNameMask = 2; int DisableSearchMobileMask = 4; + int DisableSearchUserIdMask = 8; } public interface UserStatus { diff --git a/distribution/src/main/resources/wildfirechat.conf b/distribution/src/main/resources/wildfirechat.conf index ce5a3464..a825af5a 100755 --- a/distribution/src/main/resources/wildfirechat.conf +++ b/distribution/src/main/resources/wildfirechat.conf @@ -143,6 +143,9 @@ friend.disable_search false ##禁止按照昵称搜索用户。 friend.disable_nick_name_search false +##禁止按照用户id搜索用户,默认为true。 +friend.disable_user_id_search true + ##禁止发送好友邀请,通过server api添加好友不受此限制(force参数需要为true) friend.disable_friend_request false