diff --git a/broker/config/wildfirechat.conf b/broker/config/wildfirechat.conf index 8e88432c..42da038e 100755 --- a/broker/config/wildfirechat.conf +++ b/broker/config/wildfirechat.conf @@ -113,6 +113,11 @@ group.allow_client_custom_operation_notification false ## 0 不发送,1 退群时发送,2 踢人时发送,3 退群和踢人时都发送。 group.visible_quit_or_kickoff_notification 0 +## 隐藏用户信息属性类型,2是性别,3是电话号码,4是邮箱,5是地址,6是公司信息,7是社交账号,8是Extra信息。当需要隐藏多个时以英文逗号分开; +## 本配置是为了提高安全性,避免把对应信息同步到客户端,这样就能防止程序被破解从而拿到用户关键信息。仅对客户端有效,server api不受影响。 +## 注意,修改本配置不会对已经同步的信息产生影响。 +#user.hide_properties 3,4,5 + #********************************************************************* # hazelcase configuration #********************************************************************* diff --git a/broker/src/main/java/io/moquette/BrokerConstants.java b/broker/src/main/java/io/moquette/BrokerConstants.java index ec7afcab..9149840e 100755 --- a/broker/src/main/java/io/moquette/BrokerConstants.java +++ b/broker/src/main/java/io/moquette/BrokerConstants.java @@ -148,6 +148,7 @@ public final class BrokerConstants { public static final String GROUP_Allow_Client_Custom_Operation_Notification = "group.allow_client_custom_operation_notification"; public static final String GROUP_Visible_Quit_Kickoff_Notification = "group.visible_quit_or_kickoff_notification"; + public static final String USER_HIDE_PROPERTIES = "user.hide_properties"; public static final String MESSAGES_FORBIDDEN_CLIENT_SEND_TYPES = "message.forbidden_client_send_types"; diff --git a/broker/src/main/java/io/moquette/imhandler/GetUserInfoHandler.java b/broker/src/main/java/io/moquette/imhandler/GetUserInfoHandler.java index d8836070..7c9116a4 100644 --- a/broker/src/main/java/io/moquette/imhandler/GetUserInfoHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/GetUserInfoHandler.java @@ -22,7 +22,7 @@ public class GetUserInfoHandler extends IMHandler { public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.PullUserRequest request, Qos1PublishHandler.IMCallback callback) { WFCMessage.PullUserResult.Builder resultBuilder = WFCMessage.PullUserResult.newBuilder(); - ErrorCode errorCode = m_messagesStore.getUserInfo(request.getRequestList(), resultBuilder); + ErrorCode errorCode = m_messagesStore.getUserInfo(fromUser, request.getRequestList(), resultBuilder); if (errorCode == ERROR_CODE_SUCCESS) { byte[] data = resultBuilder.build().toByteArray(); ackPayload.ensureWritable(data.length).writeBytes(data); diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 7d853a24..9d907162 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -152,6 +152,8 @@ public class MemoryMessagesStore implements IMessagesStore { private boolean mGroupAllowClientCustomOperationNotification; private int mGroupVisibleQuitKickoffNotification; + private Set mUserHideProperties = new HashSet<>(); + MemoryMessagesStore(Server server, DatabaseStore databaseStore) { m_Server = server; this.databaseStore = databaseStore; @@ -330,6 +332,22 @@ public class MemoryMessagesStore implements IMessagesStore { } + try { + String userHideStr = server.getConfig().getProperty(USER_HIDE_PROPERTIES); + if(!StringUtil.isNullOrEmpty(userHideStr)) { + String[] proStrs = userHideStr.split(","); + for (String proStr:proStrs) { + int value = Integer.parseInt(proStr); + if(value > 1 && value < 9) { + mUserHideProperties.add(value); + } + } + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + + } private void printMissConfigLog(String config, String defaultValue) { @@ -1909,7 +1927,7 @@ public class MemoryMessagesStore implements IMessagesStore { @Override - public ErrorCode getUserInfo(List requestList, WFCMessage.PullUserResult.Builder builder) { + public ErrorCode getUserInfo(String fromUser, List requestList, WFCMessage.PullUserResult.Builder builder) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); IMap mUserMap = hzInstance.getMap(USERS); @@ -1931,6 +1949,27 @@ public class MemoryMessagesStore implements IMessagesStore { } else { LOG.debug("Get user info, user {} userDt {} : request {}",request.getUid(), user.getUpdateDt(), request.getUpdateDt()); if (user.getUpdateDt() > request.getUpdateDt()) { + if(!mUserHideProperties.isEmpty() && !user.getUid().equals(fromUser)) { + WFCMessage.User.Builder userBuilder = user.toBuilder(); + for (Integer i:mUserHideProperties) { + if(i == Modify_Gender) { + userBuilder.clearGender(); + } else if(i == Modify_Mobile) { + userBuilder.clearMobile(); + } else if(i == Modify_Email) { + userBuilder.clearEmail(); + } else if(i == Modify_Address) { + userBuilder.clearAddress(); + } else if(i == Modify_Company) { + userBuilder.clearCompany(); + } else if(i == Modify_Social) { + userBuilder.clearSocial(); + } else if(i == Modify_Extra) { + userBuilder.clearExtra(); + } + } + user = userBuilder.build(); + } resultBuilder.setUser(user); resultBuilder.setCode(ProtoConstants.UserResultCode.Success); } else { diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 32e0d479..5019b47f 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -131,7 +131,9 @@ public interface IMessagesStore { WFCMessage.Robot getRobot(String robotId); void addRobot(WFCMessage.Robot robot); - ErrorCode getUserInfo(List requestList, WFCMessage.PullUserResult.Builder builder); + + ErrorCode getUserInfo(String fromUser, List requestList, WFCMessage.PullUserResult.Builder builder); + ErrorCode modifyUserInfo(String userId, WFCMessage.ModifyMyInfoRequest request) throws Exception; void updateUserOnlineSetting(MemorySessionStore.Session session, boolean online); diff --git a/distribution/src/main/resources/wildfirechat.conf b/distribution/src/main/resources/wildfirechat.conf index 1a1b3522..527999fc 100755 --- a/distribution/src/main/resources/wildfirechat.conf +++ b/distribution/src/main/resources/wildfirechat.conf @@ -109,6 +109,11 @@ group.allow_client_custom_operation_notification false ## 如果应用需要退群或者踢人不通知普通成员,请设置此参数为3,然后修改客户端踢人或退群消息的flag为not_presist。 group.visible_quit_or_kickoff_notification 0 +## 隐藏用户信息属性类型,2是性别,3是电话号码,4是邮箱,5是地址,6是公司信息,7是社交账号,8是Extra信息。当需要隐藏多个时以英文逗号分开; +## 本配置是为了提高安全性,避免把对应信息同步到客户端,这样就能防止程序被破解从而拿到用户关键信息。仅对客户端有效,server api不受影响。 +## 注意,修改本配置不会对已经同步的信息产生影响。 +#user.hide_properties 3,4 + #********************************************************************* # hazelcase configuration #*********************************************************************