From cdc3b08759ab7268fc126840037f4dd86f188db7 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Sat, 6 Mar 2021 10:13:21 +0100 Subject: [PATCH] novnc: Accept new novnc client and disconnect old session (#4531) * novnc: Reject new novnc client if novnc viewer object is still alive * #4531 novnc: Accept new novnc client and disconnect old session --- .../com/cloud/consoleproxy/ConsoleProxy.java | 18 +++++++++++++++--- .../consoleproxy/ConsoleProxyNoVNCHandler.java | 10 ++++++++-- .../consoleproxy/ConsoleProxyNoVncClient.java | 4 ++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxy.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxy.java index 7a70a38b786..577d6ed8163 100644 --- a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxy.java +++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxy.java @@ -551,11 +551,23 @@ public class ConsoleProxy { !param.getClientHostPassword().equals(viewer.getClientHostPassword())) throw new AuthenticationException("Cannot use the existing viewer " + viewer + ": bad sid"); - if (!viewer.isFrontEndAlive()) { + try { authenticationExternally(param); - viewer.initClient(param); - reportLoadChange = true; + } catch (Exception e) { + s_logger.error("Authencation failed for param: " + param); + return null; } + s_logger.info("Initializing new novnc client and disconnecting existing session"); + try { + ((ConsoleProxyNoVncClient)viewer).getSession().disconnect(); + } catch (IOException e) { + s_logger.error("Exception while disconnect session of novnc viewer object: " + viewer, e); + } + removeViewer(viewer); + viewer = new ConsoleProxyNoVncClient(session); + viewer.initClient(param); + connectionMap.put(clientKey, viewer); + reportLoadChange = true; } if (reportLoadChange) { diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCHandler.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCHandler.java index 349d98408a1..b3359b5863e 100644 --- a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCHandler.java +++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCHandler.java @@ -38,7 +38,7 @@ import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; @WebSocket public class ConsoleProxyNoVNCHandler extends WebSocketHandler { - private ConsoleProxyNoVncClient viewer; + private ConsoleProxyNoVncClient viewer = null; private static final Logger s_logger = Logger.getLogger(ConsoleProxyNoVNCHandler.class); public ConsoleProxyNoVNCHandler() { @@ -130,12 +130,18 @@ public class ConsoleProxyNoVNCHandler extends WebSocketHandler { } catch (Exception e) { s_logger.warn("Failed to create viewer due to " + e.getMessage(), e); return; + } finally { + if (viewer == null) { + session.disconnect(); + } } } @OnWebSocketClose public void onClose(Session session, int statusCode, String reason) throws IOException, InterruptedException { - ConsoleProxy.removeViewer(viewer); + if (viewer != null) { + ConsoleProxy.removeViewer(viewer); + } } @OnWebSocketFrame diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java index 97963f80caf..353c32da24b 100644 --- a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java +++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java @@ -235,4 +235,8 @@ public class ConsoleProxyNoVncClient implements ConsoleProxyClient { return ""; } + public Session getSession() { + return session; + } + }