From 5339fdf350253a6e61115b1dc209728b026c39c8 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 27 Nov 2010 15:31:12 -0800 Subject: [PATCH] Per-client authorization --- .../guacamole/net/GuacamoleSession.java | 28 ++++++++++++++++--- .../guacamole/net/tunnel/Connect.java | 5 +++- .../guacamole/net/tunnel/Inbound.java | 2 ++ .../guacamole/net/tunnel/Outbound.java | 2 ++ 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/net/GuacamoleSession.java b/guacamole/web-client/src/net/sourceforge/guacamole/net/GuacamoleSession.java index 81b3a5636..d95a6e9fe 100644 --- a/guacamole/web-client/src/net/sourceforge/guacamole/net/GuacamoleSession.java +++ b/guacamole/web-client/src/net/sourceforge/guacamole/net/GuacamoleSession.java @@ -32,15 +32,35 @@ public class GuacamoleSession { private GuacamoleConfiguration config; private final HttpSession session; - private Client client; + private SessionClient client; private ReentrantLock instructionStreamLock; - private class SessionClient extends Client implements HttpSessionBindingListener { + public class SessionClient extends Client implements HttpSessionBindingListener { private Client client; + private ReentrantLock authorizedLock; public SessionClient(Client client) { this.client = client; + + authorizedLock = new ReentrantLock(); + authorizedLock.lock(); + } + + public void authorize() { + authorizedLock.unlock(); + } + + public void waitForAuthorization() { + if (authorizedLock.isLocked()) { + try { + authorizedLock.lock(); + authorizedLock.unlock(); + } + catch (Throwable t) { + throw new Error("Internal error waiting for authorization", t); + } + } } public void valueBound(HttpSessionBindingEvent event) { @@ -82,7 +102,7 @@ public class GuacamoleSession { ServletContext context = session.getServletContext(); config = new GuacamoleConfiguration(context); - client = (Client) session.getAttribute("CLIENT"); + client = (SessionClient) session.getAttribute("CLIENT"); instructionStreamLock = (ReentrantLock) session.getAttribute("INSTRUCTION_STREAM_LOCK"); } } @@ -119,7 +139,7 @@ public class GuacamoleSession { return config; } - public Client getClient() { + public SessionClient getClient() { synchronized (session) { return client; } diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/net/tunnel/Connect.java b/guacamole/web-client/src/net/sourceforge/guacamole/net/tunnel/Connect.java index 010661894..596386991 100644 --- a/guacamole/web-client/src/net/sourceforge/guacamole/net/tunnel/Connect.java +++ b/guacamole/web-client/src/net/sourceforge/guacamole/net/tunnel/Connect.java @@ -44,10 +44,13 @@ public class Connect extends GuacamoleServlet { // Obtain new connection session.connect(); + String connectString = "connect:vnc,localhost,5901,potato;"; + // Send data try { - char[] connect = "connect:vnc,localhost,5901,potato;".toCharArray(); + char[] connect = connectString.toCharArray(); session.getClient().write(connect, 0, connect.length); + session.getClient().authorize(); } catch (GuacamoleException e) { throw new GuacamoleException("Error sending data to server: " + e.getMessage(), e); diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/net/tunnel/Inbound.java b/guacamole/web-client/src/net/sourceforge/guacamole/net/tunnel/Inbound.java index 1398bb9aa..415d639bf 100644 --- a/guacamole/web-client/src/net/sourceforge/guacamole/net/tunnel/Inbound.java +++ b/guacamole/web-client/src/net/sourceforge/guacamole/net/tunnel/Inbound.java @@ -32,6 +32,8 @@ public class Inbound extends GuacamoleServlet { @Override protected void handleRequest(GuacamoleSession session, HttpServletRequest request, HttpServletResponse response) throws GuacamoleException { + + session.getClient().waitForAuthorization(); // Send data try { diff --git a/guacamole/web-client/src/net/sourceforge/guacamole/net/tunnel/Outbound.java b/guacamole/web-client/src/net/sourceforge/guacamole/net/tunnel/Outbound.java index 942a2d72d..76aa34c76 100644 --- a/guacamole/web-client/src/net/sourceforge/guacamole/net/tunnel/Outbound.java +++ b/guacamole/web-client/src/net/sourceforge/guacamole/net/tunnel/Outbound.java @@ -35,6 +35,8 @@ public class Outbound extends GuacamoleServlet { @Override protected void handleRequest(GuacamoleSession session, HttpServletRequest request, HttpServletResponse response) throws GuacamoleException { + session.getClient().waitForAuthorization(); + ReentrantLock instructionStreamLock = session.getInstructionStreamLock(); instructionStreamLock.lock();