Refactored as implementations of AuthenticatingHttpServlet.
authorMichael Jumper <zhangmaike@users.sourceforge.net>
Fri, 23 Mar 2012 06:33:34 +0000 (23:33 -0700)
committerMichael Jumper <zhangmaike@users.sourceforge.net>
Fri, 23 Mar 2012 06:33:34 +0000 (23:33 -0700)
src/main/java/net/sourceforge/guacamole/net/basic/BasicGuacamoleTunnelServlet.java
src/main/java/net/sourceforge/guacamole/net/basic/BasicLogin.java
src/main/java/net/sourceforge/guacamole/net/basic/ConfigurationList.java

index 44123c3..6d7e574 100644 (file)
@@ -18,8 +18,11 @@ package net.sourceforge.guacamole.net.basic;
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+import java.io.IOException;
 import java.util.Map;
+import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import net.sourceforge.guacamole.GuacamoleException;
 import net.sourceforge.guacamole.net.InetGuacamoleSocket;
@@ -39,54 +42,73 @@ import org.slf4j.LoggerFactory;
  * 
  * @author Michael Jumper
  */
-public class BasicGuacamoleTunnelServlet extends GuacamoleHTTPTunnelServlet {
+public class BasicGuacamoleTunnelServlet extends AuthenticatingHttpServlet {
 
     private Logger logger = LoggerFactory.getLogger(BasicGuacamoleTunnelServlet.class);
-    
+   
     @Override
-    protected GuacamoleTunnel doConnect(HttpServletRequest request) throws GuacamoleException {
-
-        HttpSession httpSession = request.getSession(true);
-
-        // Get ID of connection
-        String id = request.getParameter("id");
+    protected void authenticatedService(
+            Map<String, GuacamoleConfiguration> configs,
+            HttpServletRequest request, HttpServletResponse response)
+    throws IOException, ServletException {
         
-        // Get authorized configs
-        Map<String, GuacamoleConfiguration> configs = (Map<String, GuacamoleConfiguration>) 
-                httpSession.getAttribute("GUAC_CONFIGS");
-
-        // If no configs in session, not authorized
-        if (configs == null)
-            throw new GuacamoleException("Cannot connect - user not logged in.");
-
-        // Get authorized config
-        GuacamoleConfiguration config = configs.get(id);
-        if (config == null) {
-            logger.error("Error retrieving authorized configuration id={}.", id);
-            throw new GuacamoleException("Unknown configuration ID.");
-        }
+        // If authenticated, respond as tunnel
+        tunnelServlet.service(request, response);
         
-        logger.info("Successful connection from {} to \"{}\".", request.getRemoteAddr(), id);
+    }
 
-        // Configure and connect socket
-        String hostname = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_HOSTNAME);
-        int port = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_PORT);
+    /**
+     * Wrapped GuacamoleHTTPTunnelServlet which will handle all authenticated
+     * requests.
+     */
+    private GuacamoleHTTPTunnelServlet tunnelServlet = new GuacamoleHTTPTunnelServlet() {
 
-        GuacamoleSocket socket = new ConfiguredGuacamoleSocket(
-                new InetGuacamoleSocket(hostname, port),
-                config
-        );
+        @Override
+        protected GuacamoleTunnel doConnect(HttpServletRequest request) throws GuacamoleException {
 
-        // Associate socket with tunnel
-        GuacamoleTunnel tunnel = new GuacamoleTunnel(socket);
+            HttpSession httpSession = request.getSession(true);
 
-        // Attach tunnel to session
-        GuacamoleSession session = new GuacamoleSession(httpSession);
-        session.attachTunnel(tunnel);
+            // Get ID of connection
+            String id = request.getParameter("id");
+            
+            // Get authorized configs
+            Map<String, GuacamoleConfiguration> configs = (Map<String, GuacamoleConfiguration>) 
+                    httpSession.getAttribute("GUAC_CONFIGS");
 
-        return tunnel;
+            // If no configs in session, not authorized
+            if (configs == null)
+                throw new GuacamoleException("Cannot connect - user not logged in.");
 
-    }
+            // Get authorized config
+            GuacamoleConfiguration config = configs.get(id);
+            if (config == null) {
+                logger.error("Error retrieving authorized configuration id={}.", id);
+                throw new GuacamoleException("Unknown configuration ID.");
+            }
+            
+            logger.info("Successful connection from {} to \"{}\".", request.getRemoteAddr(), id);
+
+            // Configure and connect socket
+            String hostname = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_HOSTNAME);
+            int port = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_PORT);
+
+            GuacamoleSocket socket = new ConfiguredGuacamoleSocket(
+                    new InetGuacamoleSocket(hostname, port),
+                    config
+            );
+
+            // Associate socket with tunnel
+            GuacamoleTunnel tunnel = new GuacamoleTunnel(socket);
+
+            // Attach tunnel to session
+            GuacamoleSession session = new GuacamoleSession(httpSession);
+            session.attachTunnel(tunnel);
+
+            return tunnel;
+
+        }
+
+    };
 
 }
 
index e3714a4..7b898f8 100644 (file)
@@ -18,92 +18,30 @@ package net.sourceforge.guacamole.net.basic;
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-import net.sourceforge.guacamole.net.auth.AuthenticationProvider;
 import java.io.IOException;
 import java.util.Map;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-import net.sourceforge.guacamole.GuacamoleException;
-import net.sourceforge.guacamole.net.auth.Credentials;
-import net.sourceforge.guacamole.properties.GuacamoleProperties;
-import net.sourceforge.guacamole.net.basic.properties.BasicGuacamoleProperties;
 import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Retrieves the authorized configurations associated with a given
- * username/password pair using the authentication provider defined in
- * guacamole.properties.
- * 
- * All authorized configurations will be stored in the current HttpSession.
- * 
- * Success and failure are logged.
+ * Simple dummy AuthenticatingHttpServlet which provides an endpoint for arbitrary
+ * authentication requests that do not expect a response.
  * 
  * @author Michael Jumper
  */
-public class BasicLogin extends HttpServlet {
+public class BasicLogin extends AuthenticatingHttpServlet {
 
     private Logger logger = LoggerFactory.getLogger(BasicLogin.class);
     
-    private AuthenticationProvider authProvider;
-
-    @Override
-    public void init() throws ServletException {
-
-        // Get auth provider instance
-        try {
-            authProvider = GuacamoleProperties.getRequiredProperty(BasicGuacamoleProperties.AUTH_PROVIDER);
-        }
-        catch (GuacamoleException e) {
-            logger.error("Error getting authentication provider from properties.", e);
-            throw new ServletException(e);
-        }
-
-    }
-
     @Override
-    protected void service(HttpServletRequest request, HttpServletResponse response)
+    protected void authenticatedService(
+            Map<String, GuacamoleConfiguration> configs,
+            HttpServletRequest request, HttpServletResponse response)
     throws IOException {
-
-        HttpSession httpSession = request.getSession(true);
-
-        // Retrieve username and password from parms
-        String username = request.getParameter("username");
-        String password = request.getParameter("password");
-
-        // Build credentials object
-        Credentials credentials = new Credentials ();
-        credentials.setSession(httpSession);
-        credentials.setRequest(request);
-        credentials.setUsername(username);
-        credentials.setPassword(password);
-        
-        // Get authorized configs
-        Map<String, GuacamoleConfiguration> configs;
-        try {
-            configs = authProvider.getAuthorizedConfigurations(credentials);
-        }
-        catch (GuacamoleException e) {
-            logger.error("Error retrieving configuration(s) for user {}.", username);
-            response.sendError(HttpServletResponse.SC_FORBIDDEN);
-            return;
-        }
-        
-        if (configs == null) {
-            logger.warn("Failed login from {} for user \"{}\".", request.getRemoteAddr(), username);
-            response.sendError(HttpServletResponse.SC_FORBIDDEN);
-            return;
-        }
-
-        logger.info("Successful login from {} for user \"{}\".", request.getRemoteAddr(), username);
-
-        // Associate configs with session
-        httpSession.setAttribute("GUAC_CONFIGS", configs);
-
+        logger.info("Login was successful.");
     }
 
 }
index f7585a6..30bf1d2 100644 (file)
@@ -34,25 +34,14 @@ import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
  * 
  * @author Michael Jumper
  */
-public class ConfigurationList extends HttpServlet {
+public class ConfigurationList extends AuthenticatingHttpServlet {
 
     @Override
-    protected void service(HttpServletRequest request, HttpServletResponse response)
+    protected void authenticatedService(
+            Map<String, GuacamoleConfiguration> configs,
+            HttpServletRequest request, HttpServletResponse response)
     throws IOException {
 
-        HttpSession httpSession = request.getSession(true);
-
-        // Get user configuration
-        // Get authorized configs
-        Map<String, GuacamoleConfiguration> configs = (Map<String, GuacamoleConfiguration>) 
-                httpSession.getAttribute("GUAC_CONFIGS");
-
-        // If no configs in session, not authorized
-        if (configs == null) {
-            response.sendError(HttpServletResponse.SC_FORBIDDEN);
-            return;
-        }
-
         // Do not cache
         response.setHeader("Cache-Control", "no-cache");
         
@@ -72,7 +61,6 @@ public class ConfigurationList extends HttpServlet {
             out.print(config.getProtocol());
             out.println("\"/>");
 
-
         }
 
         out.println("</configs>");