From 0db2f6d394df2e97583b4a8e82bcbecafcfb7187 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 2 Mar 2013 17:53:39 -0800 Subject: [PATCH] Improve error handling with universal, proper HTTP codes. --- .../net/basic/AuthenticatingHttpServlet.java | 76 ++++++++++- .../basic/BasicGuacamoleTunnelServlet.java | 19 ++- .../guacamole/net/basic/BasicLogin.java | 4 +- .../net/basic/crud/connections/Create.java | 59 ++++---- .../net/basic/crud/connections/Delete.java | 20 +-- .../net/basic/crud/connections/List.java | 25 ++-- .../net/basic/crud/connections/Update.java | 55 ++++---- .../net/basic/crud/permissions/List.java | 23 ++-- .../net/basic/crud/users/Create.java | 30 ++-- .../net/basic/crud/users/Delete.java | 19 +-- .../guacamole/net/basic/crud/users/List.java | 20 +-- .../net/basic/crud/users/Update.java | 128 ++++++++---------- 12 files changed, 242 insertions(+), 236 deletions(-) diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/AuthenticatingHttpServlet.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/AuthenticatingHttpServlet.java index 3b31eee54..5394837ef 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/AuthenticatingHttpServlet.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/AuthenticatingHttpServlet.java @@ -26,7 +26,10 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import net.sourceforge.guacamole.GuacamoleClientException; import net.sourceforge.guacamole.GuacamoleException; +import net.sourceforge.guacamole.GuacamoleResourceNotFoundException; +import net.sourceforge.guacamole.GuacamoleSecurityException; import net.sourceforge.guacamole.net.auth.AuthenticationProvider; import net.sourceforge.guacamole.net.auth.Credentials; import net.sourceforge.guacamole.net.auth.UserContext; @@ -166,6 +169,40 @@ public abstract class AuthenticatingHttpServlet extends HttpServlet { response.sendError(HttpServletResponse.SC_FORBIDDEN); } + /** + * Sends an error on the given HTTP response with the given integer error + * code. + * + * @param response The HTTP response to use to send the error. + * @param code The HTTP status code of the error. + * @param message A human-readable message that can be presented to the + * user. + * @throws ServletException If an error prevents sending of the error + * code. + */ + private void sendError(HttpServletResponse response, int code, + String message) throws ServletException { + + try { + + // If response not committed, send error code + if (!response.isCommitted()) { + response.sendError(code); + response.addHeader("Guacamole-Error-Message", message); + } + + } + catch (IOException ioe) { + + // If unable to send error at all due to I/O problems, + // rethrow as servlet exception + throw new ServletException(ioe); + + } + + } + + /** * Returns the credentials associated with the given session. * @@ -281,8 +318,35 @@ public abstract class AuthenticatingHttpServlet extends HttpServlet { } - // Allow servlet to run now that authentication has been validated - authenticatedService(context, request, response); + try { + + // Allow servlet to run now that authentication has been validated + authenticatedService(context, request, response); + + } + + // Catch any thrown guacamole exception and attempt to pass within the + // HTTP response, logging each error appropriately. + catch (GuacamoleSecurityException e) { + logger.warn("Permission denied: {}", e.getMessage()); + sendError(response, HttpServletResponse.SC_FORBIDDEN, + "Permission denied."); + } + catch (GuacamoleResourceNotFoundException e) { + logger.debug("Resource not found: {}", e.getMessage()); + sendError(response, HttpServletResponse.SC_NOT_FOUND, + e.getMessage()); + } + catch (GuacamoleClientException e) { + logger.warn("Error in client request: {}", e.getMessage()); + sendError(response, HttpServletResponse.SC_BAD_REQUEST, + e.getMessage()); + } + catch (GuacamoleException e) { + logger.error("Internal server error.", e); + sendError(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + "Internal server error."); + } } @@ -296,14 +360,12 @@ public abstract class AuthenticatingHttpServlet extends HttpServlet { * @param response An HttpServletResponse which controls the HTTP response * of this servlet. * - * @throws ServletException If an error occurs that interferes with the - * normal operation of this servlet. - * @throws IOException If an error occurs that prevents this servlet from - * communicating. + * @throws GuacamoleException If an error occurs that interferes with the + * normal operation of this servlet. */ protected abstract void authenticatedService( UserContext context, HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException; + throws GuacamoleException; } diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/BasicGuacamoleTunnelServlet.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/BasicGuacamoleTunnelServlet.java index 47d0c5352..f61a8bf1b 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/BasicGuacamoleTunnelServlet.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/BasicGuacamoleTunnelServlet.java @@ -60,10 +60,23 @@ public class BasicGuacamoleTunnelServlet extends AuthenticatingHttpServlet { protected void authenticatedService( UserContext context, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + throws GuacamoleException { - // If authenticated, respond as tunnel - tunnelServlet.service(request, response); + try { + + // If authenticated, respond as tunnel + tunnelServlet.service(request, response); + } + + catch (ServletException e) { + logger.info("Error from tunnel (see previous log messages): {}", + e.getMessage()); + } + + catch (IOException e) { + logger.info("I/O error from tunnel (see previous log messages): {}", + e.getMessage()); + } } diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/BasicLogin.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/BasicLogin.java index cd1d11cc6..f2a56de9d 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/BasicLogin.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/BasicLogin.java @@ -18,7 +18,6 @@ package net.sourceforge.guacamole.net.basic; * along with this program. If not, see . */ -import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sourceforge.guacamole.net.auth.UserContext; @@ -41,8 +40,7 @@ public class BasicLogin extends AuthenticatingHttpServlet { @Override protected void authenticatedService( UserContext context, - HttpServletRequest request, HttpServletResponse response) - throws IOException { + HttpServletRequest request, HttpServletResponse response) { logger.info("Login was successful."); } diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/Create.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/Create.java index e1603adb0..7a588c8f9 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/Create.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/Create.java @@ -18,9 +18,7 @@ package net.sourceforge.guacamole.net.basic.crud.connections; * along with this program. If not, see . */ -import java.io.IOException; import java.util.Enumeration; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sourceforge.guacamole.GuacamoleException; @@ -47,48 +45,41 @@ public class Create extends AuthenticatingHttpServlet { protected void authenticatedService( UserContext context, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + throws GuacamoleException { // Get ID and protocol String identifier = request.getParameter("id"); String protocol = request.getParameter("protocol"); - try { + // Attempt to get connection directory + Directory directory = + context.getConnectionDirectory(); - // Attempt to get connection directory - Directory directory = - context.getConnectionDirectory(); + // Create config + GuacamoleConfiguration config = new GuacamoleConfiguration(); + config.setProtocol(protocol); - // Create config - GuacamoleConfiguration config = new GuacamoleConfiguration(); - config.setProtocol(protocol); + // Load parameters into config + Enumeration params = request.getParameterNames(); + while (params.hasMoreElements()) { - // Load parameters into config - Enumeration params = request.getParameterNames(); - while (params.hasMoreElements()) { - - // If parameter starts with prefix, load corresponding parameter - // value into config - String param = params.nextElement(); - if (param.startsWith(PARAMETER_PREFIX)) - config.setParameter( - param.substring(PARAMETER_PREFIX.length()), - request.getParameter(param)); - - } - - // Create connection skeleton - Connection connection = new DummyConnection(); - connection.setIdentifier(identifier); - connection.setConfiguration(config); - - // Add connection - directory.add(connection); + // If parameter starts with prefix, load corresponding parameter + // value into config + String param = params.nextElement(); + if (param.startsWith(PARAMETER_PREFIX)) + config.setParameter( + param.substring(PARAMETER_PREFIX.length()), + request.getParameter(param)); } - catch (GuacamoleException e) { - throw new ServletException("Unable to create connection.", e); - } + + // Create connection skeleton + Connection connection = new DummyConnection(); + connection.setIdentifier(identifier); + connection.setConfiguration(config); + + // Add connection + directory.add(connection); } diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/Delete.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/Delete.java index c526f27d8..52ca4e214 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/Delete.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/Delete.java @@ -18,8 +18,6 @@ package net.sourceforge.guacamole.net.basic.crud.connections; * along with this program. If not, see . */ -import java.io.IOException; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sourceforge.guacamole.GuacamoleException; @@ -39,24 +37,18 @@ public class Delete extends AuthenticatingHttpServlet { protected void authenticatedService( UserContext context, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + throws GuacamoleException { // Get ID String identifier = request.getParameter("id"); - try { + // Attempt to get connection directory + Directory directory = + context.getConnectionDirectory(); - // Attempt to get connection directory - Directory directory = - context.getConnectionDirectory(); + // Remove connection + directory.remove(identifier); - // Remove connection - directory.remove(identifier); - - } - catch (GuacamoleException e) { - throw new ServletException("Unable to remove connection.", e); - } } diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/List.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/List.java index 77750adc7..72485988f 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/List.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/List.java @@ -19,7 +19,6 @@ package net.sourceforge.guacamole.net.basic.crud.connections; */ import java.io.IOException; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.stream.XMLOutputFactory; @@ -27,6 +26,7 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.GuacamoleSecurityException; +import net.sourceforge.guacamole.GuacamoleServerException; import net.sourceforge.guacamole.net.auth.Connection; import net.sourceforge.guacamole.net.auth.ConnectionRecord; import net.sourceforge.guacamole.net.auth.Directory; @@ -84,7 +84,7 @@ public class List extends AuthenticatingHttpServlet { protected void authenticatedService( UserContext context, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + throws GuacamoleException { // Do not cache response.setHeader("Cache-Control", "no-cache"); @@ -92,17 +92,8 @@ public class List extends AuthenticatingHttpServlet { // Write XML content type response.setHeader("Content-Type", "text/xml"); - // Attempt to get connections - Directory directory; - try { - - // Get connection directory - directory = context.getConnectionDirectory(); - - } - catch (GuacamoleException e) { - throw new ServletException("Unable to retrieve connections.", e); - } + // Get connection directory + Directory directory = context.getConnectionDirectory(); // Write actual XML try { @@ -180,10 +171,12 @@ public class List extends AuthenticatingHttpServlet { } catch (XMLStreamException e) { - throw new IOException("Unable to write configuration list XML.", e); + throw new GuacamoleServerException( + "Unable to write configuration list XML.", e); } - catch (GuacamoleException e) { - throw new ServletException("Unable to read configurations.", e); + catch (IOException e) { + throw new GuacamoleServerException( + "I/O error writing configuration list XML.", e); } } diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/Update.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/Update.java index a25b1d502..6aa58b9e3 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/Update.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/connections/Update.java @@ -47,47 +47,40 @@ public class Update extends AuthenticatingHttpServlet { protected void authenticatedService( UserContext context, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + throws GuacamoleException { // Get ID and protocol String identifier = request.getParameter("id"); String protocol = request.getParameter("protocol"); - try { + // Attempt to get connection directory + Directory directory = + context.getConnectionDirectory(); - // Attempt to get connection directory - Directory directory = - context.getConnectionDirectory(); + // Create config + GuacamoleConfiguration config = new GuacamoleConfiguration(); + config.setProtocol(protocol); - // Create config - GuacamoleConfiguration config = new GuacamoleConfiguration(); - config.setProtocol(protocol); + // Load parameters into config + Enumeration params = request.getParameterNames(); + while (params.hasMoreElements()) { - // Load parameters into config - Enumeration params = request.getParameterNames(); - while (params.hasMoreElements()) { - - // If parameter starts with prefix, load corresponding parameter - // value into config - String param = params.nextElement(); - if (param.startsWith(PARAMETER_PREFIX)) - config.setParameter( - param.substring(PARAMETER_PREFIX.length()), - request.getParameter(param)); - - } - - // Create connection skeleton - Connection connection = directory.get(identifier); - connection.setConfiguration(config); - - // Update connection - directory.update(connection); + // If parameter starts with prefix, load corresponding parameter + // value into config + String param = params.nextElement(); + if (param.startsWith(PARAMETER_PREFIX)) + config.setParameter( + param.substring(PARAMETER_PREFIX.length()), + request.getParameter(param)); } - catch (GuacamoleException e) { - throw new ServletException("Unable to update connection.", e); - } + + // Create connection skeleton + Connection connection = directory.get(identifier); + connection.setConfiguration(config); + + // Update connection + directory.update(connection); } diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/permissions/List.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/permissions/List.java index ade180e01..15328436d 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/permissions/List.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/permissions/List.java @@ -19,14 +19,15 @@ package net.sourceforge.guacamole.net.basic.crud.permissions; */ import java.io.IOException; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; +import net.sourceforge.guacamole.GuacamoleClientException; import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.GuacamoleSecurityException; +import net.sourceforge.guacamole.GuacamoleServerException; import net.sourceforge.guacamole.net.auth.Directory; import net.sourceforge.guacamole.net.auth.User; import net.sourceforge.guacamole.net.auth.UserContext; @@ -96,7 +97,7 @@ public class List extends AuthenticatingHttpServlet { protected void authenticatedService( UserContext context, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + throws GuacamoleException { // Do not cache response.setHeader("Cache-Control", "no-cache"); @@ -176,7 +177,8 @@ public class List extends AuthenticatingHttpServlet { } else - throw new ServletException("Unsupported permission type."); + throw new GuacamoleClientException( + "Unsupported permission type."); } @@ -186,17 +188,12 @@ public class List extends AuthenticatingHttpServlet { } catch (XMLStreamException e) { - throw new IOException("Unable to write permission list XML.", e); + throw new GuacamoleServerException( + "Unable to write permission list XML.", e); } - catch (GuacamoleSecurityException e) { - - // If cannot read permissions, return error - response.sendError(HttpServletResponse.SC_FORBIDDEN, - "Permission denied."); - - } - catch (GuacamoleException e) { - throw new ServletException("Unable to read permissions.", e); + catch (IOException e) { + throw new GuacamoleServerException( + "I/O error writing permission list XML.", e); } } diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/Create.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/Create.java index 68a39199c..0d930b72b 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/Create.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/Create.java @@ -18,9 +18,7 @@ package net.sourceforge.guacamole.net.basic.crud.users; * along with this program. If not, see . */ -import java.io.IOException; import java.util.UUID; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sourceforge.guacamole.GuacamoleException; @@ -40,30 +38,22 @@ public class Create extends AuthenticatingHttpServlet { protected void authenticatedService( UserContext context, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + throws GuacamoleException { // Create user as specified String username = request.getParameter("name"); - try { + // Attempt to get user directory + Directory directory = + context.getUserDirectory(); - // Attempt to get user directory - Directory directory = - context.getUserDirectory(); - - // Create user skeleton - User user = new DummyUser(); - user.setUsername(username); - user.setPassword(UUID.randomUUID().toString()); - - // Add user - directory.add(user); - - } - catch (GuacamoleException e) { - throw new ServletException("Unable to create user.", e); - } + // Create user skeleton + User user = new DummyUser(); + user.setUsername(username); + user.setPassword(UUID.randomUUID().toString()); + // Add user + directory.add(user); } diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/Delete.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/Delete.java index 860b04598..c71faf902 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/Delete.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/Delete.java @@ -18,8 +18,6 @@ package net.sourceforge.guacamole.net.basic.crud.users; * along with this program. If not, see . */ -import java.io.IOException; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sourceforge.guacamole.GuacamoleException; @@ -39,23 +37,16 @@ public class Delete extends AuthenticatingHttpServlet { protected void authenticatedService( UserContext context, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + throws GuacamoleException { // Get username String username = request.getParameter("name"); - try { + // Attempt to get user directory + Directory directory = context.getUserDirectory(); - // Attempt to get user directory - Directory directory = context.getUserDirectory(); - - // Remove user - directory.remove(username); - - } - catch (GuacamoleException e) { - throw new ServletException("Unable to remove user.", e); - } + // Remove user + directory.remove(username); } diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/List.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/List.java index 7b2fc580f..d0b39b081 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/List.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/List.java @@ -20,14 +20,13 @@ package net.sourceforge.guacamole.net.basic.crud.users; import java.io.IOException; import java.util.Set; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import net.sourceforge.guacamole.GuacamoleException; -import net.sourceforge.guacamole.GuacamoleSecurityException; +import net.sourceforge.guacamole.GuacamoleServerException; import net.sourceforge.guacamole.net.auth.Directory; import net.sourceforge.guacamole.net.auth.User; import net.sourceforge.guacamole.net.auth.UserContext; @@ -44,7 +43,7 @@ public class List extends AuthenticatingHttpServlet { protected void authenticatedService( UserContext context, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + throws GuacamoleException { // Do not cache response.setHeader("Cache-Control", "no-cache"); @@ -86,17 +85,12 @@ public class List extends AuthenticatingHttpServlet { } catch (XMLStreamException e) { - throw new IOException("Unable to write user list XML.", e); + throw new GuacamoleServerException( + "Unable to write configuration list XML.", e); } - catch (GuacamoleSecurityException e) { - - // If cannot read permissions, return error - response.sendError(HttpServletResponse.SC_FORBIDDEN, - "Permission denied."); - - } - catch (GuacamoleException e) { - throw new ServletException("Unable to read users.", e); + catch (IOException e) { + throw new GuacamoleServerException( + "I/O error writing configuration list XML.", e); } } diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/Update.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/Update.java index 35b4507e9..ac9b1cba4 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/Update.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/crud/users/Update.java @@ -18,10 +18,9 @@ package net.sourceforge.guacamole.net.basic.crud.users; * along with this program. If not, see . */ -import java.io.IOException; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import net.sourceforge.guacamole.GuacamoleClientException; import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.net.auth.Directory; import net.sourceforge.guacamole.net.auth.User; @@ -166,7 +165,7 @@ public class Update extends AuthenticatingHttpServlet { return new ConnectionPermission(ObjectPermission.Type.ADMINISTER, str.substring(ADMIN_PREFIX.length())); - throw new GuacamoleException("Invalid permission string."); + throw new GuacamoleClientException("Invalid permission string."); } @@ -174,82 +173,75 @@ public class Update extends AuthenticatingHttpServlet { protected void authenticatedService( UserContext context, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + throws GuacamoleException { // Create user as specified String username = request.getParameter("name"); String password = request.getParameter("password"); - try { + // Attempt to get user directory + Directory directory = + context.getUserDirectory(); - // Attempt to get user directory - Directory directory = - context.getUserDirectory(); + // Get user data, setting password if given + User user = directory.get(username); + user.setUsername(username); + if (password != null) + user.setPassword(password); - // Get user data, setting password if given - User user = directory.get(username); - user.setUsername(username); - if (password != null) - user.setPassword(password); - - /* - * NEW PERMISSIONS - */ - - // Set added system permissions - String[] add_sys_permission = request.getParameterValues("+sys"); - if (add_sys_permission != null) { - for (String str : add_sys_permission) - user.addPermission(parseSystemPermission(str)); - } - - // Set added user permissions - String[] add_user_permission = request.getParameterValues("+user"); - if (add_user_permission != null) { - for (String str : add_user_permission) - user.addPermission(parseUserPermission(str)); - } - - // Set added connection permissions - String[] add_connection_permission = request.getParameterValues("+connection"); - if (add_connection_permission != null) { - for (String str : add_connection_permission) - user.addPermission(parseConnectionPermission(str)); - } - - /* - * REMOVED PERMISSIONS - */ - - // Unset removed system permissions - String[] remove_sys_permission = request.getParameterValues("-sys"); - if (remove_sys_permission != null) { - for (String str : remove_sys_permission) - user.removePermission(parseSystemPermission(str)); - } - - // Unset removed user permissions - String[] remove_user_permission = request.getParameterValues("-user"); - if (remove_user_permission != null) { - for (String str : remove_user_permission) - user.removePermission(parseUserPermission(str)); - } - - // Unset removed connection permissions - String[] remove_connection_permission = request.getParameterValues("-connection"); - if (remove_connection_permission != null) { - for (String str : remove_connection_permission) - user.removePermission(parseConnectionPermission(str)); - } - - // Update user - directory.update(user); + /* + * NEW PERMISSIONS + */ + // Set added system permissions + String[] add_sys_permission = request.getParameterValues("+sys"); + if (add_sys_permission != null) { + for (String str : add_sys_permission) + user.addPermission(parseSystemPermission(str)); } - catch (GuacamoleException e) { - throw new ServletException("Unable to update user.", e); + + // Set added user permissions + String[] add_user_permission = request.getParameterValues("+user"); + if (add_user_permission != null) { + for (String str : add_user_permission) + user.addPermission(parseUserPermission(str)); } + // Set added connection permissions + String[] add_connection_permission = request.getParameterValues("+connection"); + if (add_connection_permission != null) { + for (String str : add_connection_permission) + user.addPermission(parseConnectionPermission(str)); + } + + /* + * REMOVED PERMISSIONS + */ + + // Unset removed system permissions + String[] remove_sys_permission = request.getParameterValues("-sys"); + if (remove_sys_permission != null) { + for (String str : remove_sys_permission) + user.removePermission(parseSystemPermission(str)); + } + + // Unset removed user permissions + String[] remove_user_permission = request.getParameterValues("-user"); + if (remove_user_permission != null) { + for (String str : remove_user_permission) + user.removePermission(parseUserPermission(str)); + } + + // Unset removed connection permissions + String[] remove_connection_permission = request.getParameterValues("-connection"); + if (remove_connection_permission != null) { + for (String str : remove_connection_permission) + user.removePermission(parseConnectionPermission(str)); + } + + // Update user + directory.update(user); + } }