* 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;
*
* @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;
+
+ }
+
+ };
}
* 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.");
}
}
*
* @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");
out.print(config.getProtocol());
out.println("\"/>");
-
}
out.println("</configs>");