@@ -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}
0 commit comments