diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/DestroyUserAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/DestroyUserAction.java new file mode 100755 index 00000000..c7fd0a53 --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/DestroyUserAction.java @@ -0,0 +1,97 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package com.xiaoleilu.loServer.action.admin; + +import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.common.ErrorCode; +import cn.wildfirechat.pojos.InputDestroyUser; +import cn.wildfirechat.pojos.InputOutputUserInfo; +import cn.wildfirechat.pojos.OutputCreateUser; +import cn.wildfirechat.pojos.OutputGetIMTokenData; +import cn.wildfirechat.proto.WFCMessage; +import com.google.gson.Gson; +import com.xiaoleilu.loServer.RestResult; +import com.xiaoleilu.loServer.annotation.HttpMethod; +import com.xiaoleilu.loServer.annotation.Route; +import com.xiaoleilu.loServer.handler.Request; +import com.xiaoleilu.loServer.handler.Response; +import io.moquette.persistence.RPCCenter; +import io.moquette.persistence.TargetEntry; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.util.internal.StringUtil; +import win.liyufan.im.IMTopic; +import win.liyufan.im.UUIDGenerator; + +import java.util.Base64; +import java.util.concurrent.Executor; + +@Route(APIPath.Destroy_User) +@HttpMethod("POST") +public class DestroyUserAction extends AdminAction { + + @Override + public boolean isTransactionAction() { + return true; + } + + @Override + public boolean action(Request request, Response response) { + if (request.getNettyRequest() instanceof FullHttpRequest) { + InputDestroyUser inputDestroyUser = getRequestBody(request.getNettyRequest(), InputDestroyUser.class); + if (inputDestroyUser != null + && !StringUtil.isNullOrEmpty(inputDestroyUser.getUserId())) { + + WFCMessage.IDBuf idBuf = WFCMessage.IDBuf.newBuilder().setId(inputDestroyUser.getUserId()).build(); + RPCCenter.getInstance().sendRequest(inputDestroyUser.getUserId(), null, IMTopic.DestroyUserTopic, idBuf.toByteArray(), inputDestroyUser.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() { + @Override + public void onSuccess(byte[] result) { + ErrorCode errorCode1 = ErrorCode.fromCode(result[0]); + if (errorCode1 == ErrorCode.ERROR_CODE_SUCCESS) { + //ba errorcode qudiao + byte[] data = new byte[result.length -1]; + for (int i = 0; i < data.length; i++) { + data[i] = result[i+1]; + } + String token = Base64.getEncoder().encodeToString(data); + + sendResponse(response, null, null); + } else { + sendResponse(response, errorCode1, null); + } + } + + @Override + public void onError(ErrorCode errorCode) { + sendResponse(response, errorCode, null); + } + + @Override + public void onTimeout() { + sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null); + } + + @Override + public Executor getResponseExecutor() { + return command -> { + ctx.executor().execute(command); + }; + } + }, true); + return false; + } else { + response.setStatus(HttpResponseStatus.OK); + RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER); + response.setContent(new Gson().toJson(result)); + } + + } + return true; + } +} diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserGroupsAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserGroupsAction.java new file mode 100755 index 00000000..dfae593e --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserGroupsAction.java @@ -0,0 +1,63 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package com.xiaoleilu.loServer.action.admin; + +import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.common.ErrorCode; +import cn.wildfirechat.pojos.InputGetGroup; +import cn.wildfirechat.pojos.InputUserId; +import cn.wildfirechat.pojos.OutputGroupIds; +import cn.wildfirechat.pojos.PojoGroupInfo; +import cn.wildfirechat.proto.WFCMessage; +import com.google.gson.Gson; +import com.xiaoleilu.loServer.RestResult; +import com.xiaoleilu.loServer.annotation.HttpMethod; +import com.xiaoleilu.loServer.annotation.Route; +import com.xiaoleilu.loServer.handler.Request; +import com.xiaoleilu.loServer.handler.Response; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.util.internal.StringUtil; + +import java.util.ArrayList; +import java.util.Set; + +@Route(APIPath.Get_User_Groups) +@HttpMethod("POST") +public class GetUserGroupsAction extends AdminAction { + + @Override + public boolean isTransactionAction() { + return true; + } + + @Override + public boolean action(Request request, Response response) { + if (request.getNettyRequest() instanceof FullHttpRequest) { + InputUserId inputUserId = getRequestBody(request.getNettyRequest(), InputUserId.class); + if (inputUserId != null + && (!StringUtil.isNullOrEmpty(inputUserId.getUserId()))) { + + Set groupIds = messagesStore.getUserGroupIds(inputUserId.getUserId()); + response.setStatus(HttpResponseStatus.OK); + OutputGroupIds outputGroupIds = new OutputGroupIds(); + outputGroupIds.setGroupIds(new ArrayList<>(groupIds)); + RestResult result = RestResult.ok(outputGroupIds); + + response.setContent(new Gson().toJson(result)); + } else { + response.setStatus(HttpResponseStatus.OK); + RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER); + response.setContent(new Gson().toJson(result)); + } + + } + return true; + } +} diff --git a/broker/src/main/java/io/moquette/imhandler/DestroyUserHandler.java b/broker/src/main/java/io/moquette/imhandler/DestroyUserHandler.java new file mode 100644 index 00000000..39b55bea --- /dev/null +++ b/broker/src/main/java/io/moquette/imhandler/DestroyUserHandler.java @@ -0,0 +1,38 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package io.moquette.imhandler; + +import cn.wildfirechat.common.ErrorCode; +import cn.wildfirechat.proto.WFCMessage; +import io.moquette.persistence.MemorySessionStore; +import io.moquette.spi.impl.Qos1PublishHandler; +import io.moquette.spi.impl.security.TokenAuthenticator; +import io.netty.buffer.ByteBuf; +import win.liyufan.im.IMTopic; + +@Handler(IMTopic.DestroyUserTopic) +public class DestroyUserHandler extends IMHandler { + @Override + public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.IDBuf request, Qos1PublishHandler.IMCallback callback) { + if (isAdmin) { + mServer.getImBusinessScheduler().execute(()-> { + m_sessionsStore.clearUserSession(fromUser); + m_messagesStore.clearUserMessages(fromUser); + m_messagesStore.clearUserSettings(fromUser); + m_messagesStore.clearUserFriend(fromUser); + m_messagesStore.clearUserGroups(fromUser); + m_messagesStore.clearUserChannels(fromUser); + m_messagesStore.destoryUser(fromUser); + }); + return ErrorCode.ERROR_CODE_SUCCESS; + } else { + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + } +} diff --git a/broker/src/main/java/io/moquette/imhandler/IMHandler.java b/broker/src/main/java/io/moquette/imhandler/IMHandler.java index 6b066aaa..fc946fda 100755 --- a/broker/src/main/java/io/moquette/imhandler/IMHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/IMHandler.java @@ -83,11 +83,10 @@ abstract public class IMHandler { } } - for (Method method : getClass().getDeclaredMethods() ) { - if (method.getName() == actionName && method.getParameterCount() == 6) { + if (method.getName() == actionName && method.getParameterCount() == 6 && !method.getParameterTypes()[4].equals(Object.class)) { dataCls = method.getParameterTypes()[4]; break; } diff --git a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java index 26425f08..849c38ed 100644 --- a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java +++ b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java @@ -788,6 +788,40 @@ public class DatabaseStore { }); } + void clearUserMessage(final String userId) { + mScheduler.execute(()->{ + String tableName = getUserMessageTable(userId); + Connection connection = null; + PreparedStatement statement = null; + try { + connection = DBUtil.getConnection(); + + String sql = "delete from " + tableName + " where _uid = ?"; + statement = connection.prepareStatement(sql); + statement.setString(1, userId); + int count = statement.executeUpdate(); + LOG.info("Update rows {}", count); + + try { + if (statement!=null) { + statement.close(); + } + statement = null; + } catch (SQLException e) { + e.printStackTrace(); + Utility.printExecption(LOG, e); + } + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Utility.printExecption(LOG, e); + } finally { + DBUtil.closeDB(connection, statement); + } + }); + + } + void removeFavGroup(final String groupId, final List memberIds) { Connection connection = null; PreparedStatement statement = null; @@ -863,6 +897,31 @@ public class DatabaseStore { }); } + void clearUserSetting(final String userId) { + mScheduler.execute(()->{ + Connection connection = null; + PreparedStatement statement = null; + try { + connection = DBUtil.getConnection(); + + String sql = "delete from t_user_setting where `_uid` = ?"; + + statement = connection.prepareStatement(sql); + int index = 1; + statement.setString(index++, userId); + + int count = statement.executeUpdate(); + LOG.info("Update rows {}", count); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Utility.printExecption(LOG, e); + } finally { + DBUtil.closeDB(connection, statement); + } + }); + } + List getPersistUserSetting(final String userId) { Connection connection = null; PreparedStatement statement = null; @@ -1070,6 +1129,27 @@ public class DatabaseStore { return result; } + void clearUserSessions(String uid) { + Connection connection = null; + PreparedStatement statement = null; + try { + connection = DBUtil.getConnection(); + String sql = "delete from t_user_session where `_uid`=?"; + statement = connection.prepareStatement(sql); + int index = 1; + statement.setString(index++, uid); + + int count = statement.executeUpdate(); + LOG.info("Update rows {}", count); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Utility.printExecption(LOG, e); + } finally { + DBUtil.closeDB(connection, statement); + } + } + MemorySessionStore.Session getSession(String uid, String clientId, ClientSession clientSession) { String sql = "select `_package_name`,`_token`,`_voip_token`,`_secret`,`_db_secret`,`_platform`,`_push_type`,`_device_name`,`_device_version`,`_phone_name`,`_language`,`_carrier_name`, `_dt`, `_deleted` from t_user_session where `_uid` = ? and `_cid` = ? limit 1"; Connection connection = null; @@ -1422,6 +1502,35 @@ public class DatabaseStore { return null; } + Set getUserGroupIds(String userId) { + Connection connection = null; + PreparedStatement statement = null; + ResultSet rs = null; + try { + connection = DBUtil.getConnection(); + String sql = "select `_gid` from t_group_member where `_mid` = ? and `_type` <> ?"; + statement = connection.prepareStatement(sql); + + statement.setString(1, userId); + statement.setInt(2, ProtoConstants.GroupMemberType.GroupMemberType_Removed); + + + rs = statement.executeQuery(); + Set out = new HashSet<>(); + while (rs.next()) { + String uid = rs.getString(1); + out.add(uid); + } + return out; + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Utility.printExecption(LOG, e); + } finally { + DBUtil.closeDB(connection, statement, rs); + } + return null; + } void updateGroupMemberCountDt(final String groupId, final int count, final long dt) { mScheduler.execute(()->{ Connection connection = null; @@ -2364,6 +2473,52 @@ public class DatabaseStore { return null; } + + void removeUserFriend(String userId) { + Connection connection = null; + PreparedStatement statement = null; + try { + connection = DBUtil.getConnection(); + String sql = "update t_friend set `_alias` = '', `_state` = 1, `_blacked` = 0, `_dt` = ? where `_uid` = ? or `_friend_uid` = ?"; + + statement = connection.prepareStatement(sql); + int index = 1; + statement.setLong(index++, System.currentTimeMillis()); + statement.setString(index++, userId); + statement.setString(index++, userId); + int count = statement.executeUpdate(); + LOG.info("Update rows {}", count); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Utility.printExecption(LOG, e); + } finally { + DBUtil.closeDB(connection, statement); + } + } + + void removeUserFriendRequest(String userId) { + Connection connection = null; + PreparedStatement statement = null; + try { + connection = DBUtil.getConnection(); + String sql = "delete from t_friend_request where _uid = ? or _friend_uid = ?"; + + statement = connection.prepareStatement(sql); + int index = 1; + statement.setString(index++, userId); + statement.setString(index++, userId); + int count = statement.executeUpdate(); + LOG.info("Update rows {}", count); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Utility.printExecption(LOG, e); + } finally { + DBUtil.closeDB(connection, statement); + } + } + List getPersistFriendRequests(String userId) { Connection connection = null; PreparedStatement statement = null; diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 70e136b4..a2b4ab65 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -772,7 +772,31 @@ public class MemoryMessagesStore implements IMessagesStore { } if (groupInfo.getType() != ProtoConstants.GroupType.GroupType_Free && groupInfo.getOwner() != null && groupInfo.getOwner().equals(operator)) { - return ErrorCode.ERROR_CODE_NOT_RIGHT; + MultiMap groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS); + Collection members = groupMembers.get(groupId); + if (members == null || members.size() == 0) { + members = loadGroupMemberFromDB(hzInstance, groupId); + } + + WFCMessage.GroupMember newOwner = null; + for (WFCMessage.GroupMember member :members) { + if (!member.getMemberId().equals(operator) && member.getType() != GroupMemberType_Removed) { + newOwner = member; + break; + } + } + + if (newOwner == null) { + return dismissGroup(operator, groupId, false); + } + + transferGroup(operator, groupId, newOwner.getMemberId(), false); + + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } } removeGroupMember(groupId, Arrays.asList(operator)); @@ -781,6 +805,18 @@ public class MemoryMessagesStore implements IMessagesStore { return ErrorCode.ERROR_CODE_SUCCESS; } + @Override + public void clearUserGroups(String userId) { + Set groupIds = databaseStore.getUserGroupIds(userId); + int[] removedCount = new int[1]; + for (String groupId : groupIds) { + removedCount[0] = 0; + ErrorCode errorCode = quitGroup(userId, groupId); + LOG.info("clear user {} group {} result {}", userId, groupId, errorCode); + } + } + + private void removeGroupUserSettings(String groupId, List users) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); MultiMap userSettingMap = hzInstance.getMultiMap(USER_SETTING); @@ -971,6 +1007,11 @@ public class MemoryMessagesStore implements IMessagesStore { return groupInfo; } + @Override + public Set getUserGroupIds(String userId) { + return databaseStore.getUserGroupIds(userId); + } + @Override public ErrorCode getGroupMembers(String groupId, long maxDt, List members) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); @@ -1230,6 +1271,18 @@ public class MemoryMessagesStore implements IMessagesStore { } } + @Override + public void clearUserMessages(String userId) { + mWriteLock.lock(); + try { + userMessages.remove(userId); + } finally { + mWriteLock.unlock(); + } + + databaseStore.clearUserMessage(userId); + } + @Override public WFCMessage.Robot getRobot(String robotId) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); @@ -1400,6 +1453,18 @@ public class MemoryMessagesStore implements IMessagesStore { databaseStore.updateUserPassword(user.getUid(), password); } + @Override + public void destoryUser(String userId) { + HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); + IMap mUserMap = hzInstance.getMap(USERS); + WFCMessage.User us = mUserMap.get(userId); + if (us != null) { + us = WFCMessage.User.newBuilder().setUid(userId).setUpdateDt(System.currentTimeMillis()).setDisplayName("已删除用户").setName(userId).build(); + mUserMap.put(userId, us); + } + + } + @Override public WFCMessage.User getUserInfo(String userId) { if (StringUtil.isNullOrEmpty(userId)) { @@ -1689,6 +1754,31 @@ public class MemoryMessagesStore implements IMessagesStore { return out; } + @Override + public void clearUserFriend(String userId) { + HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); + MultiMap friendsMap = hzInstance.getMultiMap(USER_FRIENDS); + + Collection friendDatas = friendsMap.get(userId); + if (friendDatas == null || friendDatas.size() == 0) { + friendDatas = loadFriend(friendsMap, userId); + } + + databaseStore.removeUserFriend(userId); + databaseStore.removeUserFriendRequest(userId); + + MultiMap requestMap = hzInstance.getMultiMap(USER_FRIENDS_REQUEST); + requestMap.remove(userId); + + + if (friendDatas != null) { + for (FriendData fd : friendDatas) { + friendsMap.remove(fd.getFriendUid()); + } + friendsMap.remove(userId); + } + } + @Override public List getFriendRequestList(String userId, long version) { List out = new ArrayList<>(); @@ -2189,6 +2279,14 @@ public class MemoryMessagesStore implements IMessagesStore { return updateDt; } + @Override + public void clearUserSettings(String userId) { + databaseStore.clearUserSetting(userId); + HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); + MultiMap userSettingMap = hzInstance.getMultiMap(USER_SETTING); + userSettingMap.remove(userId); + } + @Override public boolean getUserGlobalSlient(String userId) { Boolean slient = userGlobalSlientMap.get(userId); @@ -2246,6 +2344,12 @@ public class MemoryMessagesStore implements IMessagesStore { return ErrorCode.ERROR_CODE_SUCCESS; } + @Override + public void clearUserChannels(String userId) { + + } + + @Override public ErrorCode modifyChannelInfo(String operator, String channelId, int modifyType, String value) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); diff --git a/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java b/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java index 664babbc..5a3fa592 100755 --- a/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java @@ -24,9 +24,8 @@ import io.moquette.BrokerConstants; import io.moquette.server.Constants; import io.moquette.server.Server; import io.moquette.spi.ClientSession; -import io.moquette.spi.IMessagesStore.StoredMessage; import io.moquette.spi.ISessionsStore; - +import io.moquette.spi.IMessagesStore.StoredMessage; import io.netty.handler.codec.mqtt.MqttVersion; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -314,6 +313,20 @@ public class MemorySessionStore implements ISessionsStore { databaseStore.updateSessionToken(session.getUsername(), session.getClientID(), voip ? session.getVoipDeviceToken() : session.getDeviceToken(), session.getPushType(), voip); } + @Override + public void clearUserSession(String username) { + LOG.info("Fooooooooo <{}>", username); + + databaseStore.clearUserSessions(username); + + ConcurrentSkipListSet sessionSet = getUserSessionSet(username); + for (String clientID : sessionSet) { + Session s = sessions.remove(clientID); + mServer.getProcessor().kickoffSession(s); + } + userSessions.remove(username); + } + @Override public Session createUserSession(String username, String clientID, int platform) { LOG.debug("createUserSession for client <{}>, user <{}>", clientID, username); @@ -344,6 +357,10 @@ public class MemorySessionStore implements ISessionsStore { String c = it.next(); if (!clientID.equals(c)) { Session s = sessions.get(c); + if (s == null) { + it.remove(); + continue; + } boolean remove = false; if (platform == ProtoConstants.Platform.Platform_Android || platform == ProtoConstants.Platform.Platform_iOS) { diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 12231d0c..8bbb810e 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -107,11 +107,13 @@ public interface IMessagesStore { ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List memberList); ErrorCode kickoffGroupMembers(String operator, boolean isAdmin, String groupId, List memberList); ErrorCode quitGroup(String operator, String groupId); + void clearUserGroups(String userId); ErrorCode dismissGroup(String operator, String groupId, boolean isAdmin); ErrorCode modifyGroupInfo(String operator, String groupId, int modifyType, String value, boolean isAdmin); ErrorCode modifyGroupAlias(String operator, String groupId, String alias); List getGroupInfos(List requests); WFCMessage.GroupInfo getGroupInfo(String groupId); + Set getUserGroupIds(String userId); ErrorCode getGroupMembers(String groupId, long maxDt, List members); WFCMessage.GroupMember getGroupMember(String groupId, String memberId); ErrorCode transferGroup(String operator, String groupId, String newOwner, boolean isAdmin); @@ -121,6 +123,8 @@ public interface IMessagesStore { ErrorCode recallMessage(long messageUid, String operatorId, boolean isAdmin); + void clearUserMessages(String userId); + WFCMessage.Robot getRobot(String robotId); void addRobot(WFCMessage.Robot robot); ErrorCode getUserInfo(List requestList, WFCMessage.PullUserResult.Builder builder); @@ -131,6 +135,7 @@ public interface IMessagesStore { List getUserStatusList(); void addUserInfo(WFCMessage.User user, String password); + void destoryUser(String userId); WFCMessage.User getUserInfo(String userId); WFCMessage.User getUserInfoByName(String name); WFCMessage.User getUserInfoByMobile(String mobile); @@ -154,6 +159,7 @@ public interface IMessagesStore { ErrorCode login(String name, String password, List userIdRet); List getFriendList(String userId, String clientId, long version); + void clearUserFriend(String userId); List getFriendRequestList(String userId, long version); ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head); @@ -171,12 +177,14 @@ public interface IMessagesStore { WFCMessage.UserSettingEntry getUserSetting(String userId, int scope, String key); List getUserSetting(String userId, int scope); long updateUserSettings(String userId, WFCMessage.ModifyUserSettingReq request); + void clearUserSettings(String userId); boolean getUserGlobalSlient(String userId); boolean getUserPushHiddenDetail(String userId); boolean getUserConversationSlient(String userId, WFCMessage.Conversation conversation); ErrorCode createChannel(String operator, WFCMessage.ChannelInfo channelInfo); + void clearUserChannels(String userId); ErrorCode modifyChannelInfo(String operator, String channelId, int modifyType, String value); ErrorCode transferChannel(String operator, String channelId, String newOwner); ErrorCode distoryChannel(String operator, String channelId); diff --git a/broker/src/main/java/io/moquette/spi/ISessionsStore.java b/broker/src/main/java/io/moquette/spi/ISessionsStore.java index 0a2ee81b..0cde7d9e 100755 --- a/broker/src/main/java/io/moquette/spi/ISessionsStore.java +++ b/broker/src/main/java/io/moquette/spi/ISessionsStore.java @@ -49,6 +49,8 @@ public interface ISessionsStore { void cleanDuplatedToken(String cid, int pushType, String token, boolean isVoip); void updateSessionToken(Session session, boolean voip); + + void clearUserSession(String username); /** * @param clientID * the client owning the session. diff --git a/broker/src/main/java/win/liyufan/im/IMTopic.java b/broker/src/main/java/win/liyufan/im/IMTopic.java index c4ea00de..b1fb2df6 100755 --- a/broker/src/main/java/win/liyufan/im/IMTopic.java +++ b/broker/src/main/java/win/liyufan/im/IMTopic.java @@ -71,6 +71,7 @@ public interface IMTopic { String ChannelPullTopic = "CHP"; String GetTokenTopic = "GETTOKEN"; + String DestroyUserTopic = "DESTROYUSER"; String LoadRemoteMessagesTopic = "LRM"; } diff --git a/common/src/main/java/cn.wildfirechat.pojos/InputDestroyUser.java b/common/src/main/java/cn.wildfirechat.pojos/InputDestroyUser.java new file mode 100755 index 00000000..a6fc3c19 --- /dev/null +++ b/common/src/main/java/cn.wildfirechat.pojos/InputDestroyUser.java @@ -0,0 +1,22 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package cn.wildfirechat.pojos; + + +public class InputDestroyUser { + private String userId; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } +} diff --git a/common/src/main/java/cn/wildfirechat/common/APIPath.java b/common/src/main/java/cn/wildfirechat/common/APIPath.java index e964f51e..79cfa501 100644 --- a/common/src/main/java/cn/wildfirechat/common/APIPath.java +++ b/common/src/main/java/cn/wildfirechat/common/APIPath.java @@ -11,6 +11,7 @@ public interface APIPath { String Sensitive_Query = "/admin/sensitive/query"; String Create_User = "/admin/user/create"; + String Destroy_User = "/admin/user/destroy"; String Create_Robot = "/admin/robot/create"; String User_Get_Token = "/admin/user/get_token"; String User_Update_Block_Status = "/admin/user/update_block_status"; @@ -37,6 +38,7 @@ public interface APIPath { String Group_Member_Add = "/admin/group/member/add"; String Group_Member_Kickoff = "/admin/group/member/del"; String Group_Set_Manager = "/admin/group/manager/set"; + String Get_User_Groups = "/admin/group/of_user"; String Create_Channel = "/admin/channel/create"; diff --git a/common/src/main/java/cn/wildfirechat/pojos/InputUserId.java b/common/src/main/java/cn/wildfirechat/pojos/InputUserId.java new file mode 100755 index 00000000..313ee80d --- /dev/null +++ b/common/src/main/java/cn/wildfirechat/pojos/InputUserId.java @@ -0,0 +1,21 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package cn.wildfirechat.pojos; + +public class InputUserId { + private String userId; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } +} diff --git a/common/src/main/java/cn/wildfirechat/pojos/OutputGroupIds.java b/common/src/main/java/cn/wildfirechat/pojos/OutputGroupIds.java new file mode 100755 index 00000000..a01be5e2 --- /dev/null +++ b/common/src/main/java/cn/wildfirechat/pojos/OutputGroupIds.java @@ -0,0 +1,23 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package cn.wildfirechat.pojos; + +import java.util.List; + +public class OutputGroupIds { + private List groupIds; + + public List getGroupIds() { + return groupIds; + } + + public void setGroupIds(List groupIds) { + this.groupIds = groupIds; + } +} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/GroupAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/GroupAdmin.java index ae58b274..732deb03 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/GroupAdmin.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/GroupAdmin.java @@ -113,4 +113,12 @@ public class GroupAdmin { return AdminHttpUtils.httpJsonPost(path, kickoffGroupMember, Void.class); } + public static IMResult getUserGroups(String user) throws Exception { + String path = APIPath.Get_User_Groups; + InputUserId inputUserId = new InputUserId(); + inputUserId.setUserId(user); + return AdminHttpUtils.httpJsonPost(path, inputUserId, OutputGroupIds.class); + } + + } diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java index 69dfa1e0..62a1ace1 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java @@ -284,6 +284,18 @@ public class Main { System.exit(-1); } + IMResult groupIdsIMResult = GroupAdmin.getUserGroups("user1"); + if (groupIdsIMResult != null && groupIdsIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + if (groupIdsIMResult.getResult().getGroupIds().contains(groupInfo.getTarget_id())) { + System.out.println("get user groups success"); + } else { + System.out.println("get user groups failure"); + System.exit(-1); + } + } else { + System.out.println("get user groups failure"); + System.exit(-1); + } //*********************************************** @@ -392,5 +404,14 @@ public class Main { System.out.println("robot get user info by userId failure"); System.exit(-1); } + + + voidIMResult = UserAdmin.destroyUser("user1"); + if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("destroy user success"); + } else { + System.out.println("destroy user failure"); + System.exit(-1); + } } } diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java index 7755aa2b..c55ac156 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java @@ -58,6 +58,13 @@ public class UserAdmin { return AdminHttpUtils.httpJsonPost(path, null, OutputUserBlockStatusList.class); } + public static IMResult destroyUser(String userId) throws Exception { + String path = APIPath.Destroy_User; + InputDestroyUser inputDestroyUser = new InputDestroyUser(); + inputDestroyUser.setUserId(userId); + return AdminHttpUtils.httpJsonPost(path, inputDestroyUser, Void.class); + } + //not implement // public static IMResult getUserOnlineStatus(String userId) throws Exception { // String path = APIPath.User_Get_Online_Status;