Migrated to new tunnel API.
[guacamole.git] / src / main / java / net / sourceforge / guacamole / net / basic / BasicGuacamoleTunnelServlet.java
index 08c5b15..9480f06 100644 (file)
@@ -18,40 +18,87 @@ package net.sourceforge.guacamole.net.basic;
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+import java.lang.reflect.InvocationTargetException;
+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.GuacamoleTCPClient;
 import net.sourceforge.guacamole.net.Configuration;
 import net.sourceforge.guacamole.net.GuacamoleProperties;
 import net.sourceforge.guacamole.net.GuacamoleSession;
+import net.sourceforge.guacamole.net.tunnel.GuacamoleTunnel;
 import net.sourceforge.guacamole.net.tunnel.GuacamoleTunnelServlet;
 
 public class BasicGuacamoleTunnelServlet extends GuacamoleTunnelServlet {
 
+    private AuthenticationProvider authProvider;
+
     @Override
-    protected void doConnect(HttpServletRequest request, HttpServletResponse response) throws GuacamoleException {
+    public void init() throws ServletException {
+
+        // Get auth provider instance
+        try {
+            String authProviderClassName = GuacamoleProperties.getProperty("auth-provider");
+            Object obj = Class.forName(authProviderClassName).getConstructor().newInstance();
+            if (!(obj instanceof AuthenticationProvider))
+                throw new ServletException("Specified authentication provider class is not a AuthenticationProvider.");
 
-        // Session must already exist from login
-        HttpSession httpSession = request.getSession(false);
+            authProvider = (AuthenticationProvider) obj;
+        }
+        catch (GuacamoleException e) {
+            throw new ServletException(e);
+        }
+        catch (ClassNotFoundException e) {
+            throw new ServletException("Authentication provider class not found", e);
+        }
+        catch (NoSuchMethodException e) {
+            throw new ServletException("Default constructor for authentication provider not present", e);
+        }
+        catch (SecurityException e) {
+            throw new ServletException("Creation of authentication provider disallowed; check your security settings", e);
+        }
+        catch (InstantiationException e) {
+            throw new ServletException("Unable to instantiate authentication provider", e);
+        }
+        catch (IllegalAccessException e) {
+            throw new ServletException("Unable to access default constructor of authentication provider", e);
+        }
+        catch (InvocationTargetException e) {
+            throw new ServletException("Internal error in constructor of authentication provider", e.getTargetException());
+        }
 
-        // Retrieve authorized config data from session
-        Configuration config = (Configuration) httpSession.getAttribute("BASIC-LOGIN-AUTH");
+    }
+
+    @Override
+    protected GuacamoleTunnel doConnect(HttpServletRequest request) throws GuacamoleException {
 
-        // If no data, not authorized
+        HttpSession httpSession = request.getSession(true);
+
+        // Retrieve username and password from parms
+        String username = request.getParameter("username");
+        String password = request.getParameter("password");
+
+        // Get authorized config
+        Configuration config = authProvider.getAuthorizedConfiguration(username, password);
         if (config == null)
-            throw new GuacamoleException("Unauthorized");
+            throw new GuacamoleException("Invalid login");
 
+        // Configure and connect client
         String hostname = GuacamoleProperties.getProperty("guacd-hostname");
         int port = GuacamoleProperties.getIntProperty("guacd-port", null);
 
         GuacamoleTCPClient client = new GuacamoleTCPClient(hostname, port);
         client.connect(config);
 
-        // Set client for session
+        // Associate client with tunnel
+        GuacamoleTunnel tunnel = new GuacamoleTunnel(client);
+
+        // Attach tunnel to session
         GuacamoleSession session = new GuacamoleSession(httpSession);
-        session.attachClient(client);
+        session.attachTunnel(tunnel);
+
+        return tunnel;
 
     }