From 675025c0ec3e1ab2072be078ec899432f0ecec06 Mon Sep 17 00:00:00 2001 From: "heavyrain.lee" Date: Fri, 24 May 2019 16:33:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3session=E5=9C=A8=E9=87=8D?= =?UTF-8?q?=E5=90=AF=E5=90=8E=EF=BC=8C=E5=86=85=E5=AD=98=E4=B8=AD=E4=B8=8D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xiaoleilu/loServer/action/RouteAction.java | 2 +- .../java/io/moquette/imhandler/RouteHandler.java | 2 +- .../io/moquette/persistence/MemorySessionStore.java | 6 +++++- .../main/java/io/moquette/spi/ISessionsStore.java | 2 +- .../java/io/moquette/spi/impl/ProtocolProcessor.java | 12 +++++++++++- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/RouteAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/RouteAction.java index 846e7f78..8ea8b858 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/RouteAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/RouteAction.java @@ -79,7 +79,7 @@ public class RouteAction extends Action { MemorySessionStore.Session session = sessionsStore.sessionForClientAndUser(uid, cid); if (session == null) { - ErrorCode errorCode = sessionsStore.createNewSession(uid, cid, true); + ErrorCode errorCode = sessionsStore.createNewSession(uid, cid, true, true); if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) { sendResponse(response, errorCode, null, base64Response); return true; diff --git a/broker/src/main/java/io/moquette/imhandler/RouteHandler.java b/broker/src/main/java/io/moquette/imhandler/RouteHandler.java index f79aa965..47db79c8 100644 --- a/broker/src/main/java/io/moquette/imhandler/RouteHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/RouteHandler.java @@ -32,7 +32,7 @@ public class RouteHandler extends IMHandler { ClientSession clientSession = m_sessionsStore.sessionForClient(clientID); boolean isSessionAlreadyStored = clientSession != null; if (!isSessionAlreadyStored) { - m_sessionsStore.createNewSession(fromUser, clientID, true); + m_sessionsStore.createNewSession(fromUser, clientID, true, true); } else { m_sessionsStore.updateExistSession(fromUser, clientID, request, true); } diff --git a/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java b/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java index 55e27a8c..b03ad509 100755 --- a/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java @@ -282,7 +282,7 @@ public class MemorySessionStore implements ISessionsStore { @Override - public ErrorCode createNewSession(String username, String clientID, boolean cleanSession) { + public ErrorCode createNewSession(String username, String clientID, boolean cleanSession, boolean createWhenNoExist) { LOG.debug("createNewSession for client <{}>", clientID); Session session = sessions.get(clientID); @@ -296,6 +296,10 @@ public class MemorySessionStore implements ISessionsStore { session = databaseStore.getSession(username, clientID, clientSession); if (session == null) { + if (!createWhenNoExist) { + return ErrorCode.ERROR_CODE_NOT_EXIST; + } + session = databaseStore.createSession(username, clientID, clientSession); } diff --git a/broker/src/main/java/io/moquette/spi/ISessionsStore.java b/broker/src/main/java/io/moquette/spi/ISessionsStore.java index f0c6b9fe..d6153bc8 100755 --- a/broker/src/main/java/io/moquette/spi/ISessionsStore.java +++ b/broker/src/main/java/io/moquette/spi/ISessionsStore.java @@ -40,7 +40,7 @@ public interface ISessionsStore { Session createUserSession(String username, String clientID); - ErrorCode createNewSession(String username, String clientID, boolean cleanSession); + ErrorCode createNewSession(String username, String clientID, boolean cleanSession, boolean createNoExist); ClientSession updateExistSession(String username, String clientID, WFCMessage.RouteRequest endpoint, boolean cleanSession); diff --git a/broker/src/main/java/io/moquette/spi/impl/ProtocolProcessor.java b/broker/src/main/java/io/moquette/spi/impl/ProtocolProcessor.java index 9e0e6049..f87965ee 100755 --- a/broker/src/main/java/io/moquette/spi/impl/ProtocolProcessor.java +++ b/broker/src/main/java/io/moquette/spi/impl/ProtocolProcessor.java @@ -251,11 +251,16 @@ public class ProtocolProcessor { pwd = msg.payload().password(); MemorySessionStore.Session session = m_sessionsStore.getSession(clientId); + if (session == null) { + m_sessionsStore.createNewSession(msg.payload().userName(), clientId, true, false); + session = m_sessionsStore.getSession(clientId); + } + if (session != null && session.getUsername().equals(msg.payload().userName())) { pwd = AES.AESDecrypt(pwd, session.getSecret(), true); } else { LOG.error("Password decrypt failed of client {}", clientId); - failedCredentials(channel); + failedNoSession(channel); return false; } @@ -365,6 +370,11 @@ public class ProtocolProcessor { LOG.info("Client {} failed to connect with bad username or password.", session); } + private void failedNoSession(Channel session) { + session.writeAndFlush(connAck(CONNECTION_REFUSED_SESSION_NOT_EXIST)); + LOG.info("Client {} failed to connect with bad username or password.", session); + } + private void setIdleTime(ChannelPipeline pipeline, int idleTime) { if (pipeline.names().contains("idleStateHandler")) { pipeline.remove("idleStateHandler");