From: Michael Jumper Date: Fri, 23 Mar 2012 06:33:34 +0000 (-0700) Subject: Refactored as implementations of AuthenticatingHttpServlet. X-Git-Url: http://git.alex.org.uk Refactored as implementations of AuthenticatingHttpServlet. --- diff --git a/src/main/java/net/sourceforge/guacamole/net/basic/BasicGuacamoleTunnelServlet.java b/src/main/java/net/sourceforge/guacamole/net/basic/BasicGuacamoleTunnelServlet.java index 44123c3..6d7e574 100644 --- a/src/main/java/net/sourceforge/guacamole/net/basic/BasicGuacamoleTunnelServlet.java +++ b/src/main/java/net/sourceforge/guacamole/net/basic/BasicGuacamoleTunnelServlet.java @@ -18,8 +18,11 @@ package net.sourceforge.guacamole.net.basic; * along with this program. If not, see . */ +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 configs, + HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { - // Get authorized configs - Map configs = (Map) - 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 configs = (Map) + 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; + + } + + }; } diff --git a/src/main/java/net/sourceforge/guacamole/net/basic/BasicLogin.java b/src/main/java/net/sourceforge/guacamole/net/basic/BasicLogin.java index e3714a4..7b898f8 100644 --- a/src/main/java/net/sourceforge/guacamole/net/basic/BasicLogin.java +++ b/src/main/java/net/sourceforge/guacamole/net/basic/BasicLogin.java @@ -18,92 +18,30 @@ package net.sourceforge.guacamole.net.basic; * along with this program. If not, see . */ -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 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 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."); } } diff --git a/src/main/java/net/sourceforge/guacamole/net/basic/ConfigurationList.java b/src/main/java/net/sourceforge/guacamole/net/basic/ConfigurationList.java index f7585a6..30bf1d2 100644 --- a/src/main/java/net/sourceforge/guacamole/net/basic/ConfigurationList.java +++ b/src/main/java/net/sourceforge/guacamole/net/basic/ConfigurationList.java @@ -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 configs, + HttpServletRequest request, HttpServletResponse response) throws IOException { - HttpSession httpSession = request.getSession(true); - - // Get user configuration - // Get authorized configs - Map configs = (Map) - 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("");