From d3754a7b0a9cb73b7be9a3f65cb71c2f7b233292 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 10 Dec 2020 12:05:38 +0000 Subject: [PATCH 1/2] novnc: Reject new novnc client if novnc viewer object is still alive --- .../main/java/com/cloud/consoleproxy/ConsoleProxy.java | 4 ++++ .../cloud/consoleproxy/ConsoleProxyNoVNCHandler.java | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 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 7a70a38b7868..aa0324d6dfa4 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 @@ -552,9 +552,13 @@ public static ConsoleProxyNoVncClient getNoVncViewer(ConsoleProxyClientParam par throw new AuthenticationException("Cannot use the existing viewer " + viewer + ": bad sid"); if (!viewer.isFrontEndAlive()) { + s_logger.info("Initializing new novnc client as novnc view object is not alive: " + viewer); authenticationExternally(param); viewer.initClient(param); reportLoadChange = true; + } else { + s_logger.info("Rejecting new novnc client as novnc viewer object is still alive: " + viewer); + return null; } } 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 349d98408a13..b3359b5863e1 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 @@ @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 void onConnect(final Session session) throws IOException, InterruptedExce } 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 From 30eab0c1433dd5f821ca5be84ff3de7e183482e1 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 18 Feb 2021 15:23:00 +0000 Subject: [PATCH 2/2] #4531 novnc: Accept new novnc client and disconnect old session --- .../com/cloud/consoleproxy/ConsoleProxy.java | 20 +++++++++++++------ .../consoleproxy/ConsoleProxyNoVncClient.java | 4 ++++ 2 files changed, 18 insertions(+), 6 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 aa0324d6dfa4..577d6ed81631 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,15 +551,23 @@ public static ConsoleProxyNoVncClient getNoVncViewer(ConsoleProxyClientParam par !param.getClientHostPassword().equals(viewer.getClientHostPassword())) throw new AuthenticationException("Cannot use the existing viewer " + viewer + ": bad sid"); - if (!viewer.isFrontEndAlive()) { - s_logger.info("Initializing new novnc client as novnc view object is not alive: " + viewer); + try { authenticationExternally(param); - viewer.initClient(param); - reportLoadChange = true; - } else { - s_logger.info("Rejecting new novnc client as novnc viewer object is still alive: " + viewer); + } 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/ConsoleProxyNoVncClient.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java index 97963f80cafd..353c32da24bc 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 String getClientTag() { return ""; } + public Session getSession() { + return session; + } + }