From 5f7df376646026c1791ee1e9a36f0a06ad501f73 Mon Sep 17 00:00:00 2001 From: imhao183 Date: Fri, 22 Jan 2021 10:23:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=B8=A2=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=B8=8B=E7=BA=BFapi=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/admin/KickoffUserClientAction.java | 52 +++++++++++++++++++ .../persistence/MemorySessionStore.java | 28 ++++++++++ .../java/io/moquette/spi/ISessionsStore.java | 2 + .../java/cn/wildfirechat/common/APIPath.java | 1 + .../cn/wildfirechat/pojos/StringPairPojo.java | 38 ++++++++++++++ .../java/cn/wildfirechat/sdk/UserAdmin.java | 9 ++++ 6 files changed, 130 insertions(+) create mode 100755 broker/src/main/java/com/xiaoleilu/loServer/action/admin/KickoffUserClientAction.java create mode 100755 common/src/main/java/cn/wildfirechat/pojos/StringPairPojo.java diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/KickoffUserClientAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/KickoffUserClientAction.java new file mode 100755 index 00000000..46b17103 --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/KickoffUserClientAction.java @@ -0,0 +1,52 @@ +/* + * 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.InputOutputUserBlockStatus; +import cn.wildfirechat.pojos.StringPairPojo; +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; + +@Route(APIPath.User_Kickoff_Client) +@HttpMethod("POST") +public class KickoffUserClientAction extends AdminAction { + + @Override + public boolean isTransactionAction() { + return true; + } + + @Override + public boolean action(Request request, Response response) { + if (request.getNettyRequest() instanceof FullHttpRequest) { + StringPairPojo pojo = getRequestBody(request.getNettyRequest(), StringPairPojo.class); + if (pojo != null && !StringUtil.isNullOrEmpty(pojo.getFirst())) { + sessionsStore.kickoffUserClient(pojo.getFirst(), pojo.getSecond()); + sendResponse(response, ErrorCode.ERROR_CODE_SUCCESS, null); + } 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/persistence/MemorySessionStore.java b/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java index 30a62cb3..68d2ea0b 100755 --- a/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java @@ -419,6 +419,34 @@ public class MemorySessionStore implements ISessionsStore { return session; } + @Override + public void kickoffUserClient(String username, String cid) { + List clientIds = new ArrayList<>(); + if(StringUtil.isNullOrEmpty(cid)) { + ConcurrentSkipListSet sessionSet = getUserSessionSet(username); + clientIds.addAll(sessionSet); + } else { + clientIds.add(cid); + } + + for (String clientID: clientIds) { + Session session = sessions.get(clientID); + if(session == null) { + ClientSession clientSession = new ClientSession(clientID, this); + session = databaseStore.getSession(username, clientID, clientSession); + if (session == null || session.getDeleted() > 0) { + continue; + } + sessions.put(clientID, session); + } + + if (session.getDeleted() == 0) { + session.setDeleted(1); + databaseStore.updateSessionDeleted(username, clientID, 1); + mServer.getProcessor().kickoffSession(session); + } + } + } @Override public ErrorCode loadActiveSession(String username, String clientID) { diff --git a/broker/src/main/java/io/moquette/spi/ISessionsStore.java b/broker/src/main/java/io/moquette/spi/ISessionsStore.java index 217ef214..324d6500 100755 --- a/broker/src/main/java/io/moquette/spi/ISessionsStore.java +++ b/broker/src/main/java/io/moquette/spi/ISessionsStore.java @@ -51,6 +51,8 @@ public interface ISessionsStore { void updateSessionToken(Session session, boolean voip); void clearUserSession(String username); + + void kickoffUserClient(String userId, String clientId); /** * @param clientID * the client owning the session. diff --git a/common/src/main/java/cn/wildfirechat/common/APIPath.java b/common/src/main/java/cn/wildfirechat/common/APIPath.java index 1c973125..714104c5 100644 --- a/common/src/main/java/cn/wildfirechat/common/APIPath.java +++ b/common/src/main/java/cn/wildfirechat/common/APIPath.java @@ -30,6 +30,7 @@ public interface APIPath { String User_Get_Online_Status = "/admin/user/onlinestatus"; String User_Put_Setting = "/admin/user/put_setting"; String User_Get_Setting = "/admin/user/get_setting"; + String User_Kickoff_Client = "/admin/user/kickoff_client"; String Friend_Update_Status = "/admin/friend/status"; String Friend_Get_List = "/admin/friend/list"; diff --git a/common/src/main/java/cn/wildfirechat/pojos/StringPairPojo.java b/common/src/main/java/cn/wildfirechat/pojos/StringPairPojo.java new file mode 100755 index 00000000..36cc3ad7 --- /dev/null +++ b/common/src/main/java/cn/wildfirechat/pojos/StringPairPojo.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 cn.wildfirechat.pojos; + +public class StringPairPojo { + private String first; + private String second; + + public StringPairPojo() { + } + + public StringPairPojo(String first, String second) { + this.first = first; + this.second = second; + } + + public String getFirst() { + return first; + } + + public void setFirst(String first) { + this.first = first; + } + + public String getSecond() { + return second; + } + + public void setSecond(String second) { + this.second = second; + } +} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java index 1d005a6f..9a5c520e 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java @@ -63,6 +63,15 @@ public class UserAdmin { return AdminHttpUtils.httpJsonPost(path, getUserInfo, OutputCheckUserOnline.class); } + /* 强迫用户下线,需要用户重新获取token才能进行连接。 + userId必须有效,clientId可以为空,当为空时,踢下线说有客户端,当不为空时仅踢掉对应客户端。 + */ + public static IMResult kickoffUserClient(String userId, String clientId) throws Exception { + String path = APIPath.User_Kickoff_Client; + StringPairPojo pojo = new StringPairPojo(userId, clientId); + return AdminHttpUtils.httpJsonPost(path, pojo, Void.class); + } + public static IMResult destroyUser(String userId) throws Exception { String path = APIPath.Destroy_User; InputDestroyUser inputDestroyUser = new InputDestroyUser();