diff --git a/broker/config/wildfirechat.conf b/broker/config/wildfirechat.conf index cce17d22..75404bd2 100755 --- a/broker/config/wildfirechat.conf +++ b/broker/config/wildfirechat.conf @@ -267,6 +267,16 @@ group.enable_mark_deletion true ## 销毁用户时,用户信息会被清空,deleted字段设置为1,这个开关控制是否保留用户昵称,默认为true。 user.keep_display_name_when_destroy true +## 销毁用户时deleted字段设置为1,这个开关控制是否保留其他信息,默认是false。 +user.keep_full_info_when_destroy false + +## 销毁用户时,如果user.keep_full_info_when_destroy为true,会保留所有信息,这个开关控制是否保留这个用户信息的电话号码,默认为false。 +## 当保留所有信息且保留电话号码时,用户如果再注册会用到原来的UID,能够看到原来用户的消息,需要考虑一下是否让已删除用户再次注册登录看到之前的消息。 +user.keep_mobile_when_destroy false + +## 销毁用户时是否保留归属于这个用户的所有消息记录,默认为false。 +user.keep_messages_when_destroy false + # 好友/好友请求/用户设置 这三类数据同步的最大条目数。之前是客户第一次登录时,会把所有的对应数据一次下载到客户端,但如果有特别多的信息,会导致无法同步到客户端, # 因此需要分段多次同步,此开关定义了每次同步的数据的条数。此需要客户端支持,客户端SDK在2021.5.25日后支持此功能。如果确认所有客户端都在这个日志之后才可以打开此设置。 #sync.data_part_size 1000 diff --git a/broker/src/main/java/io/moquette/BrokerConstants.java b/broker/src/main/java/io/moquette/BrokerConstants.java index 791b274d..cd7287d3 100755 --- a/broker/src/main/java/io/moquette/BrokerConstants.java +++ b/broker/src/main/java/io/moquette/BrokerConstants.java @@ -213,6 +213,9 @@ public final class BrokerConstants { public static final String USER_HIDE_PROPERTIES = "user.hide_properties"; public static final String USER_KEEP_DISPLAY_NAME_WHEN_DESTROY = "user.keep_display_name_when_destroy"; + public static final String USER_KEEP_FULL_INFO_WHEN_DESTROY = "user.keep_full_info_when_destroy"; + public static final String USER_KEEP_MOBILE_WHEN_DESTROY = "user.keep_mobile_when_destroy"; + public static final String USER_KEEP_MESSAGES_WHEN_DESTROY = "user.keep_messages_when_destroy"; public static final String SYNC_Data_Part_Size = "sync.data_part_size"; diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 2b58d603..4e4e1f41 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -202,6 +202,10 @@ public class MemoryMessagesStore implements IMessagesStore { private int mGroupForbiddenClientOperation; private int mSyncDataPartSize = 0; private boolean keepDisplayNameWhenDestroyUser = true; + private boolean keepFullInfoWhenDestroyUser = false; + private boolean keepMobileWhenDestroyUser = false; + private boolean keepMessagesWhenDestroyUser = false; + private String mRecallForwardUrl = null; private boolean mBroadcastTargetFromUserTable = false; @@ -600,6 +604,17 @@ public class MemoryMessagesStore implements IMessagesStore { } catch (Exception e) { } + try { + keepFullInfoWhenDestroyUser = "true".equals(server.getConfig().getProperty(USER_KEEP_FULL_INFO_WHEN_DESTROY)); + } catch (Exception e) {} + + try { + keepMobileWhenDestroyUser = "true".equals(server.getConfig().getProperty(USER_KEEP_MOBILE_WHEN_DESTROY)); + } catch (Exception e) {} + + try { + keepMessagesWhenDestroyUser = "true".equals(server.getConfig().getProperty(USER_KEEP_MESSAGES_WHEN_DESTROY)); + } catch (Exception e) {} try { @@ -2758,8 +2773,9 @@ public class MemoryMessagesStore implements IMessagesStore { } finally { mWriteLock.unlock(); } - - databaseStore.clearUserMessage(userId); + if(!keepMessagesWhenDestroyUser) { + databaseStore.clearUserMessage(userId); + } } @Override @@ -3137,37 +3153,29 @@ public class MemoryMessagesStore implements IMessagesStore { IMap mUserMap = hzInstance.getMap(USERS); WFCMessage.User us = mUserMap.get(userId); if (us != null) { - if (keepDisplayNameWhenDestroyUser) { - us = WFCMessage.User.newBuilder() - .setUid(userId) - .setUpdateDt(System.currentTimeMillis()) - .setName(userId) - .setDeleted(1) - .clearAddress() - .clearCompany() - .clearEmail() - .clearExtra() - .clearMobile() - .clearPortrait() - .clearSocial() - .build(); + WFCMessage.User.Builder builder = WFCMessage.User.newBuilder().setUpdateDt(System.currentTimeMillis()).setDeleted(1); + + if(keepFullInfoWhenDestroyUser) { + if(!keepMobileWhenDestroyUser) { + builder.clearMobile(); + } } else { - us = WFCMessage.User.newBuilder() - .setUid(userId) - .setUpdateDt(System.currentTimeMillis()) + builder.setUid(userId) .setName(userId) - .setDeleted(1) - .clearDisplayName() .clearAddress() .clearCompany() .clearEmail() .clearExtra() .clearMobile() .clearPortrait() - .clearSocial() - .build(); + .clearGender() + .clearSocial(); + if (!keepDisplayNameWhenDestroyUser) { + builder.clearDisplayName(); + } } + us = builder.build(); try { databaseStore.updateUser(us); } catch (Exception e) { @@ -3176,8 +3184,8 @@ public class MemoryMessagesStore implements IMessagesStore { } mUserMap.put(userId, us); } - } + @Override public void updateUserInfo(WFCMessage.User user) throws Exception { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); diff --git a/common/src/main/java/cn/wildfirechat/pojos/InputOutputUserInfo.java b/common/src/main/java/cn/wildfirechat/pojos/InputOutputUserInfo.java index c261419a..00062ce1 100755 --- a/common/src/main/java/cn/wildfirechat/pojos/InputOutputUserInfo.java +++ b/common/src/main/java/cn/wildfirechat/pojos/InputOutputUserInfo.java @@ -25,6 +25,7 @@ public class InputOutputUserInfo { private String social; private String extra; private int type; + private int deleted; private long updateDt; public static InputOutputUserInfo fromPbUser(WFCMessage.User pbUser) { @@ -42,6 +43,7 @@ public class InputOutputUserInfo { inputCreateUser.extra = pbUser.getExtra(); inputCreateUser.type = pbUser.getType(); inputCreateUser.updateDt = pbUser.getUpdateDt(); + inputCreateUser.deleted = pbUser.getDeleted(); return inputCreateUser; } @@ -77,6 +79,7 @@ public class InputOutputUserInfo { newUserBuilder.setExtra(getExtra()); newUserBuilder.setGender(gender); newUserBuilder.setType(type); + newUserBuilder.setDeleted(deleted); newUserBuilder.setUpdateDt(System.currentTimeMillis()); return newUserBuilder.build(); @@ -185,4 +188,12 @@ public class InputOutputUserInfo { public void setType(int type) { this.type = type; } + + public int getDeleted() { + return deleted; + } + + public void setDeleted(int deleted) { + this.deleted = deleted; + } } diff --git a/distribution/src/main/resources/wildfirechat.conf b/distribution/src/main/resources/wildfirechat.conf index 501656e8..ae0b729a 100755 --- a/distribution/src/main/resources/wildfirechat.conf +++ b/distribution/src/main/resources/wildfirechat.conf @@ -262,6 +262,19 @@ group.enable_mark_deletion true ## 注意,修改本配置不会对已经同步的信息产生影响。 #user.hide_properties 3,4 +## 销毁用户时,用户信息会被清空,deleted字段设置为1,这个开关控制是否保留用户昵称,默认为true。 +user.keep_display_name_when_destroy true + +## 销毁用户时deleted字段设置为1,这个开关控制是否保留其他信息,默认是false。 +user.keep_full_info_when_destroy false + +## 销毁用户时,如果user.keep_full_info_when_destroy为true,会保留所有信息,这个开关控制是否保留这个用户信息的电话号码,默认为false。 +## 当保留所有信息且保留电话号码时,用户如果再注册会用到原来的UID,能够看到原来用户的消息,需要考虑一下是否让已删除用户再次注册登录看到之前的消息。 +user.keep_mobile_when_destroy false + +## 销毁用户时是否保留归属于这个用户的所有消息记录,默认为false。 +user.keep_messages_when_destroy false + # 好友/好友请求/用户设置 这三类数据同步的最大条目数。之前是客户第一次登录时,会把所有的对应数据一次下载到客户端,但如果有特别多的信息,会导致无法同步到客户端, # 因此需要分段多次同步,此开关定义了每次同步的数据的条数。此需要客户端支持,客户端SDK在2021.5.25日后支持此功能。如果确认所有客户端都在这个日志之后才可以打开此设置。 #sync.data_part_size 1000