Skip to content

Commit 6877246

Browse files
committed
Code Changes added
1 parent a764cad commit 6877246

9 files changed

Lines changed: 406 additions & 436 deletions

File tree

server/src/com/cloud/servlet/ConsoleProxyServlet.java

Lines changed: 161 additions & 150 deletions
Large diffs are not rendered by default.

services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ public static void start(Properties conf) {
329329
}
330330

331331
if (httpListenPort != 0) {
332-
startServerForNoVNC();
332+
startupHttpMain();
333333
} else {
334334
s_logger.error("A valid HTTP server port is required to be specified, please check your consoleproxy.httpListenPort settings");
335335
System.exit(1);
@@ -359,19 +359,19 @@ private static void startupHttpCmdPort() {
359359
}
360360
}
361361

362-
private static void startServerForNoVNC() {
362+
private static void startupHttpMain() {
363363
try {
364364
ConsoleProxyServerFactory factory = getHttpServerFactory();
365365
if (factory == null) {
366366
s_logger.error("Unable to load HTTP server factory");
367367
System.exit(1);
368368
}
369369
Server webServer = factory.
370-
createConsoleProxyServer(443);
370+
createHttpServerInstance(httpListenPort);
371371
webServer.start();
372372
} catch (Exception e) {
373-
s_logger.error(" could not start webserver at 80", e);
374-
throw new RuntimeException("could not start webserver at 80");
373+
s_logger.error(" could not start webserver at " + httpListenPort, e);
374+
throw new RuntimeException("could not start webserver at " + httpListenPort);
375375
}
376376
}
377377

services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java

Lines changed: 150 additions & 150 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,156 @@ public class ConsoleProxyAjaxHandler extends AbstractHandler {
3939
public ConsoleProxyAjaxHandler() {
4040
}
4141

42+
@Override
43+
public void handle(String s, Request request, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException, ServletException {
44+
try {
45+
if (s_logger.isTraceEnabled())
46+
s_logger.trace("AjaxHandler " + request.getRequestURI());
47+
48+
long startTick = System.currentTimeMillis();
49+
50+
doHandle(request, httpServletResponse);
51+
52+
if (s_logger.isTraceEnabled())
53+
s_logger.trace(request.getRequestURI() + " process time " + (System.currentTimeMillis() - startTick) + " ms");
54+
} catch (IOException e) {
55+
throw e;
56+
} catch (IllegalArgumentException e) {
57+
s_logger.warn("Exception, ", e);
58+
httpServletResponse.setStatus(400);
59+
} catch (Throwable e) {
60+
s_logger.error("Unexpected exception, ", e);
61+
httpServletResponse.setStatus(500);
62+
} finally {
63+
request.setHandled(true);
64+
}
65+
}
66+
67+
private void doHandle(Request request, HttpServletResponse response) throws Exception, IllegalArgumentException {
68+
String queries = request.getUri().getQuery();
69+
if (s_logger.isTraceEnabled())
70+
s_logger.trace("Handle AJAX request: " + queries);
71+
72+
Map<String, String> queryMap = ConsoleProxyHttpHandlerHelper.getQueryMap(queries);
73+
74+
String host = queryMap.get("host");
75+
String portStr = queryMap.get("port");
76+
String sid = queryMap.get("sid");
77+
String tag = queryMap.get("tag");
78+
String ticket = queryMap.get("ticket");
79+
String ajaxSessionIdStr = queryMap.get("sess");
80+
String eventStr = queryMap.get("event");
81+
String console_url = queryMap.get("consoleurl");
82+
String console_host_session = queryMap.get("sessionref");
83+
String vm_locale = queryMap.get("locale");
84+
String hypervHost = queryMap.get("hypervHost");
85+
String username = queryMap.get("username");
86+
String password = queryMap.get("password");
87+
88+
if (tag == null)
89+
tag = "";
90+
91+
long ajaxSessionId = 0;
92+
int event = 0;
93+
94+
int port;
95+
96+
if (host == null || portStr == null || sid == null)
97+
throw new IllegalArgumentException();
98+
99+
try {
100+
port = Integer.parseInt(portStr);
101+
} catch (NumberFormatException e) {
102+
s_logger.warn("Invalid number parameter in query string: " + portStr);
103+
throw new IllegalArgumentException(e);
104+
}
105+
106+
if (ajaxSessionIdStr != null) {
107+
try {
108+
ajaxSessionId = Long.parseLong(ajaxSessionIdStr);
109+
} catch (NumberFormatException e) {
110+
s_logger.warn("Invalid number parameter in query string: " + ajaxSessionIdStr);
111+
throw new IllegalArgumentException(e);
112+
}
113+
}
114+
115+
if (eventStr != null) {
116+
try {
117+
event = Integer.parseInt(eventStr);
118+
} catch (NumberFormatException e) {
119+
s_logger.warn("Invalid number parameter in query string: " + eventStr);
120+
throw new IllegalArgumentException(e);
121+
}
122+
}
123+
124+
ConsoleProxyClient viewer = null;
125+
try {
126+
ConsoleProxyClientParam param = new ConsoleProxyClientParam();
127+
param.setClientHostAddress(host);
128+
param.setClientHostPort(port);
129+
param.setClientHostPassword(sid);
130+
param.setClientTag(tag);
131+
param.setTicket(ticket);
132+
param.setClientTunnelUrl(console_url);
133+
param.setClientTunnelSession(console_host_session);
134+
param.setLocale(vm_locale);
135+
param.setHypervHost(hypervHost);
136+
param.setUsername(username);
137+
param.setPassword(password);
138+
139+
viewer = ConsoleProxy.getAjaxVncViewer(param, ajaxSessionIdStr);
140+
} catch (Exception e) {
141+
142+
s_logger.warn("Failed to create viewer due to " + e.getMessage(), e);
143+
144+
String[] content =
145+
new String[] {"<html><head></head><body>", "<div id=\"main_panel\" tabindex=\"1\">",
146+
"<p>Access is denied for the console session. Please close the window and retry again</p>", "</div></body></html>"};
147+
148+
StringBuffer sb = new StringBuffer();
149+
for (int i = 0; i < content.length; i++)
150+
sb.append(content[i]);
151+
152+
sendResponse(response, "text/html", sb.toString());
153+
return;
154+
}
155+
156+
if (event != 0) {
157+
if (ajaxSessionId != 0 && ajaxSessionId == viewer.getAjaxSessionId()) {
158+
if (event == 7) {
159+
// client send over an event bag
160+
handleClientEventBag(viewer, convertStreamToString(request.getReader(), true));
161+
} else {
162+
handleClientEvent(viewer, event, queryMap);
163+
}
164+
sendResponse(response, "text/html", "OK");
165+
} else {
166+
if (s_logger.isDebugEnabled())
167+
s_logger.debug("Ajax request comes from a different session, id in request: " + ajaxSessionId + ", id in viewer: " + viewer.getAjaxSessionId());
168+
169+
sendResponse(response, "text/html", "Invalid ajax client session id");
170+
}
171+
} else {
172+
if (ajaxSessionId != 0 && ajaxSessionId != viewer.getAjaxSessionId()) {
173+
s_logger.info("Ajax request comes from a different session, id in request: " + ajaxSessionId + ", id in viewer: " + viewer.getAjaxSessionId());
174+
handleClientKickoff(response, viewer);
175+
} else if (ajaxSessionId == 0) {
176+
if (s_logger.isDebugEnabled())
177+
s_logger.debug("Ajax request indicates a fresh client start");
178+
179+
String title = queryMap.get("t");
180+
String guest = queryMap.get("guest");
181+
handleClientStart(response, viewer, title != null ? title : "", guest);
182+
} else {
183+
184+
if (s_logger.isTraceEnabled())
185+
s_logger.trace("Ajax request indicates client update");
186+
187+
handleClientUpdate(response, viewer);
188+
}
189+
}
190+
}
191+
42192
private static String convertStreamToString(BufferedReader reader, boolean closeStreamAfterRead) {
43193
StringBuilder sb = new StringBuilder();
44194
String line = null;
@@ -250,154 +400,4 @@ private void handleClientUpdate(HttpServletResponse httpServletResponse, Console
250400
os.close();
251401
}
252402
}
253-
254-
@Override
255-
public void handle(String s, Request request, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException, ServletException {
256-
try {
257-
if (s_logger.isTraceEnabled())
258-
s_logger.trace("AjaxHandler " + request.getRequestURI());
259-
260-
long startTick = System.currentTimeMillis();
261-
262-
doHandle(request, httpServletResponse);
263-
264-
if (s_logger.isTraceEnabled())
265-
s_logger.trace(request.getRequestURI() + " process time " + (System.currentTimeMillis() - startTick) + " ms");
266-
} catch (IOException e) {
267-
throw e;
268-
} catch (IllegalArgumentException e) {
269-
s_logger.warn("Exception, ", e);
270-
httpServletResponse.setStatus(400);
271-
} catch (Throwable e) {
272-
s_logger.error("Unexpected exception, ", e);
273-
httpServletResponse.setStatus(500);
274-
} finally {
275-
request.setHandled(true);
276-
}
277-
}
278-
279-
private void doHandle(Request request, HttpServletResponse response) throws Exception, IllegalArgumentException {
280-
String queries = request.getUri().getQuery();
281-
if (s_logger.isTraceEnabled())
282-
s_logger.trace("Handle AJAX request: " + queries);
283-
284-
Map<String, String> queryMap = ConsoleProxyHttpHandlerHelper.getQueryMap(queries);
285-
286-
String host = queryMap.get("host");
287-
String portStr = queryMap.get("port");
288-
String sid = queryMap.get("sid");
289-
String tag = queryMap.get("tag");
290-
String ticket = queryMap.get("ticket");
291-
String ajaxSessionIdStr = queryMap.get("sess");
292-
String eventStr = queryMap.get("event");
293-
String console_url = queryMap.get("consoleurl");
294-
String console_host_session = queryMap.get("sessionref");
295-
String vm_locale = queryMap.get("locale");
296-
String hypervHost = queryMap.get("hypervHost");
297-
String username = queryMap.get("username");
298-
String password = queryMap.get("password");
299-
300-
if (tag == null)
301-
tag = "";
302-
303-
long ajaxSessionId = 0;
304-
int event = 0;
305-
306-
int port;
307-
308-
if (host == null || portStr == null || sid == null)
309-
throw new IllegalArgumentException();
310-
311-
try {
312-
port = Integer.parseInt(portStr);
313-
} catch (NumberFormatException e) {
314-
s_logger.warn("Invalid number parameter in query string: " + portStr);
315-
throw new IllegalArgumentException(e);
316-
}
317-
318-
if (ajaxSessionIdStr != null) {
319-
try {
320-
ajaxSessionId = Long.parseLong(ajaxSessionIdStr);
321-
} catch (NumberFormatException e) {
322-
s_logger.warn("Invalid number parameter in query string: " + ajaxSessionIdStr);
323-
throw new IllegalArgumentException(e);
324-
}
325-
}
326-
327-
if (eventStr != null) {
328-
try {
329-
event = Integer.parseInt(eventStr);
330-
} catch (NumberFormatException e) {
331-
s_logger.warn("Invalid number parameter in query string: " + eventStr);
332-
throw new IllegalArgumentException(e);
333-
}
334-
}
335-
336-
ConsoleProxyClient viewer = null;
337-
try {
338-
ConsoleProxyClientParam param = new ConsoleProxyClientParam();
339-
param.setClientHostAddress(host);
340-
param.setClientHostPort(port);
341-
param.setClientHostPassword(sid);
342-
param.setClientTag(tag);
343-
param.setTicket(ticket);
344-
param.setClientTunnelUrl(console_url);
345-
param.setClientTunnelSession(console_host_session);
346-
param.setLocale(vm_locale);
347-
param.setHypervHost(hypervHost);
348-
param.setUsername(username);
349-
param.setPassword(password);
350-
351-
viewer = ConsoleProxy.getAjaxVncViewer(param, ajaxSessionIdStr);
352-
} catch (Exception e) {
353-
354-
s_logger.warn("Failed to create viewer due to " + e.getMessage(), e);
355-
356-
String[] content =
357-
new String[] {"<html><head></head><body>", "<div id=\"main_panel\" tabindex=\"1\">",
358-
"<p>Access is denied for the console session. Please close the window and retry again</p>", "</div></body></html>"};
359-
360-
StringBuffer sb = new StringBuffer();
361-
for (int i = 0; i < content.length; i++)
362-
sb.append(content[i]);
363-
364-
sendResponse(response, "text/html", sb.toString());
365-
return;
366-
}
367-
368-
if (event != 0) {
369-
if (ajaxSessionId != 0 && ajaxSessionId == viewer.getAjaxSessionId()) {
370-
if (event == 7) {
371-
// client send over an event bag
372-
handleClientEventBag(viewer, convertStreamToString(request.getReader(), true));
373-
} else {
374-
handleClientEvent(viewer, event, queryMap);
375-
}
376-
sendResponse(response, "text/html", "OK");
377-
} else {
378-
if (s_logger.isDebugEnabled())
379-
s_logger.debug("Ajax request comes from a different session, id in request: " + ajaxSessionId + ", id in viewer: " + viewer.getAjaxSessionId());
380-
381-
sendResponse(response, "text/html", "Invalid ajax client session id");
382-
}
383-
} else {
384-
if (ajaxSessionId != 0 && ajaxSessionId != viewer.getAjaxSessionId()) {
385-
s_logger.info("Ajax request comes from a different session, id in request: " + ajaxSessionId + ", id in viewer: " + viewer.getAjaxSessionId());
386-
handleClientKickoff(response, viewer);
387-
} else if (ajaxSessionId == 0) {
388-
if (s_logger.isDebugEnabled())
389-
s_logger.debug("Ajax request indicates a fresh client start");
390-
391-
String title = queryMap.get("t");
392-
String guest = queryMap.get("guest");
393-
handleClientStart(response, viewer, title != null ? title : "", guest);
394-
} else {
395-
396-
if (s_logger.isTraceEnabled())
397-
s_logger.trace("Ajax request indicates client update");
398-
399-
handleClientUpdate(response, viewer);
400-
}
401-
}
402-
}
403403
}

services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,7 @@
1717
package com.cloud.consoleproxy;
1818

1919
import java.io.IOException;
20-
import java.net.InetSocketAddress;
21-
2220
import javax.net.ssl.SSLServerSocket;
23-
24-
import com.sun.net.httpserver.HttpServer;
25-
2621
import com.cloud.consoleproxy.util.Logger;
2722
import org.eclipse.jetty.server.Handler;
2823
import org.eclipse.jetty.server.Server;
@@ -37,14 +32,7 @@ public void init(byte[] ksBits, String ksPassword) {
3732
}
3833

3934
@Override
40-
public HttpServer createHttpServerInstance(int port) throws IOException {
41-
if (s_logger.isInfoEnabled())
42-
s_logger.info("create HTTP server instance at port: " + port);
43-
return HttpServer.create(new InetSocketAddress(port), 5);
44-
}
45-
46-
@Override
47-
public Server createConsoleProxyServer(int port) throws IOException {
35+
public Server createHttpServerInstance(int port) throws IOException {
4836
Server webServer = new Server(port);
4937
Handler[] handlerList = new Handler[6];
5038

0 commit comments

Comments
 (0)