--- /dev/null
+
+package net.sourceforge.guacamole.net.basic;
+
+import net.sourceforge.guacamole.GuacamoleException;
+import net.sourceforge.guacamole.net.Configuration;
+
+public interface AuthenticationProvider {
+
+ public Configuration getAuthorizedConfiguration(String username, String password) throws GuacamoleException;
+
+}
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
-public class BasicFileAuthenticationProvider implements BasicLogin.AuthenticationProvider {
+public class BasicFileAuthenticationProvider implements AuthenticationProvider {
private long mappingTime;
private Map<String, AuthInfo> mapping;
* 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;
}
+++ /dev/null
-
-package net.sourceforge.guacamole.net.basic;
-
-/*
- * Guacamole - Clientless Remote Desktop
- * Copyright (C) 2010 Michael Jumper
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-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.Configuration;
-import net.sourceforge.guacamole.net.GuacamoleProperties;
-
-public class BasicLogin extends HttpServlet {
-
- private AuthenticationProvider authProvider;
-
- @Override
- 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.");
-
- 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());
- }
-
- }
-
- public static interface AuthenticationProvider {
- public Configuration getAuthorizedConfiguration(String username, String password) throws GuacamoleException;
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-
- // Retrieve username and password from parms
- String username = req.getParameter("username");
- String password = req.getParameter("password");
-
- // Validate username and password
- try {
-
- Configuration config = authProvider.getAuthorizedConfiguration(username, password);
- if (config != null) {
-
- // Store authorized configuration
- HttpSession session = req.getSession(true);
- session.setAttribute(
- "BASIC-LOGIN-AUTH",
- config
- );
-
- // Success
- return;
-
- }
-
- // Report "forbidden" on any failure
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Login invalid");
- }
- catch (GuacamoleException e) {
- throw new ServletException("Error validating credentials", e);
- }
-
- }
-
-
-}
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+
<!-- Basic config -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<url-pattern>/tunnel</url-pattern>
</servlet-mapping>
- <!-- Basic Login Servlet -->
- <servlet>
- <servlet-name>BasicLogin</servlet-name>
- <servlet-class>net.sourceforge.guacamole.net.basic.BasicLogin</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>BasicLogin</servlet-name>
- <url-pattern>/login</url-pattern>
- </servlet-mapping>
-
</web-app>
<p id="login-error"></p>
- <form id="login-form" action="login" method="post">
+ <form id="login-form" action="#" method="post">
<table id="login-fields">
<tr>
<th>Username</th>
var loginForm = document.getElementById("login-form");
var loginUI = document.getElementById("login-ui");
+ var display = document.getElementById("display");
loginForm.onsubmit = function() {
"username=" + encodeURIComponent(username.value)
+ "&password=" + encodeURIComponent(password.value)
- var xmlhttprequest = new XMLHttpRequest();
- xmlhttprequest.open("POST", "login", false);
- xmlhttprequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
- xmlhttprequest.setRequestHeader("Content-length", data.length);
- xmlhttprequest.send(data);
+ // Instantiate client
+ var guac = new GuacamoleClient(
+ display,
+ new GuacamoleHTTPTunnel("tunnel")
+ );
+
+ try {
+
+ // Connect client
+ guac.connect(data);
- if (xmlhttprequest.status == 200) {
- loginUI.style.display = "none";
- startGuacamole();
}
- else {
+ catch (e) {
var loginError = document.getElementById("login-error");
// Display error, reset and refocus password field
- loginError.textContent = "Invalid login. Please try again.";
+ loginError.textContent = e.message;
password.value = "";
password.focus();
+ return false;
+
}
+ // On success, display UI
+ startGuacamole(guac);
return false;
}
// Shows guacamole interface and initiates connection to guacamole
- function startGuacamole() {
+ function startGuacamole(guac) {
+ loginUI.style.display = "none";
document.getElementById("main-guacamole-ui").style.display = "block";
var menu = document.getElementById("menu");
- var display = document.getElementById("display");
var logo = document.getElementById("logo");
var errorDialog = document.getElementById("errorDialog");
window.onresize();
- // Instantiate client
- var guac = new GuacamoleClient(
- display,
- new GuacamoleHTTPTunnel("tunnel")
- );
-
var state = document.getElementById("state");
guac.setOnStateChangeHandler(function(clientState) {
window.location.reload();
};
- // Connect
- guac.connect();
-
// Disconnect on close
window.onunload = function() {
guac.disconnect();