From 78f7eb415dc03cee12345ab2df0cb3ff26a5ed3d Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Tue, 18 Mar 2014 22:27:20 -0700 Subject: [PATCH] GUAC-550: Use appropriate exceptions for error cases. Report when resources cannot be used because they are locked, exhausted, etc. --- .../net/auth/mysql/ActiveConnectionMap.java | 5 +++-- .../net/auth/mysql/ConnectionDirectory.java | 10 ++++++---- .../net/auth/mysql/ConnectionGroupDirectory.java | 14 ++++++++------ .../guacamole/net/auth/mysql/UserDirectory.java | 7 ++++--- .../auth/mysql/service/ConnectionGroupService.java | 12 +++++++----- .../net/auth/mysql/service/ConnectionService.java | 7 ++++--- 6 files changed, 32 insertions(+), 23 deletions(-) diff --git a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/ActiveConnectionMap.java b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/ActiveConnectionMap.java index 4f470b7e2..544a2f32d 100644 --- a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/ActiveConnectionMap.java +++ b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/ActiveConnectionMap.java @@ -31,6 +31,7 @@ import java.util.Map; import org.glyptodon.guacamole.GuacamoleException; import net.sourceforge.guacamole.net.auth.mysql.dao.ConnectionHistoryMapper; import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionHistory; +import org.glyptodon.guacamole.GuacamoleResourceNotFoundException; /** * Represents the map of currently active Connections to the count of the number @@ -396,7 +397,7 @@ public class ActiveConnectionMap { Connection connection = activeConnectionMap.get(connectionID); if(connection == null) - throw new GuacamoleException + throw new GuacamoleResourceNotFoundException ("Connection to decrement does not exist."); // Decrement the current user count @@ -478,7 +479,7 @@ public class ActiveConnectionMap { connectionHistoryDAO.selectByPrimaryKey(historyID); if(connectionHistory == null) - throw new GuacamoleException("History record not found."); + throw new GuacamoleResourceNotFoundException("History record not found."); // Get the connection and user IDs int connectionID = connectionHistory.getConnection_id(); diff --git a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/ConnectionDirectory.java b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/ConnectionDirectory.java index f23940956..9f91b776e 100644 --- a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/ConnectionDirectory.java +++ b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/ConnectionDirectory.java @@ -37,6 +37,8 @@ import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionPermissionKey; import net.sourceforge.guacamole.net.auth.mysql.service.ConnectionGroupService; import net.sourceforge.guacamole.net.auth.mysql.service.ConnectionService; import net.sourceforge.guacamole.net.auth.mysql.service.PermissionCheckService; +import org.glyptodon.guacamole.GuacamoleResourceNotFoundException; +import org.glyptodon.guacamole.GuacamoleUnsupportedException; import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; import org.mybatis.guice.transactional.Transactional; @@ -231,7 +233,7 @@ public class ConnectionDirectory implements Directory{ // If connection not actually from this auth provider, we can't handle // the update if (!(object instanceof MySQLConnection)) - throw new GuacamoleException("Connection not from database."); + throw new GuacamoleUnsupportedException("Connection not from database."); MySQLConnection mySQLConnection = (MySQLConnection) object; @@ -263,7 +265,7 @@ public class ConnectionDirectory implements Directory{ connectionService.retrieveConnection(identifier, user_id); if(mySQLConnection == null) - throw new GuacamoleException("Connection not found."); + throw new GuacamoleResourceNotFoundException("Connection not found."); // Verify permission to use the parent connection group for organizational purposes permissionCheckService.verifyConnectionGroupUsageAccess @@ -284,7 +286,7 @@ public class ConnectionDirectory implements Directory{ throws GuacamoleException { if(!(directory instanceof ConnectionDirectory)) - throw new GuacamoleClientException("Directory not from database"); + throw new GuacamoleUnsupportedException("Directory not from database"); Integer toConnectionGroupID = ((ConnectionDirectory)directory).parentID; @@ -293,7 +295,7 @@ public class ConnectionDirectory implements Directory{ connectionService.retrieveConnection(identifier, user_id); if(mySQLConnection == null) - throw new GuacamoleClientException("Connection not found."); + throw new GuacamoleResourceNotFoundException("Connection not found."); // Verify permission to update the connection permissionCheckService.verifyConnectionAccess(this.user_id, diff --git a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/ConnectionGroupDirectory.java b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/ConnectionGroupDirectory.java index 67f7d3cac..a8353d8ea 100644 --- a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/ConnectionGroupDirectory.java +++ b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/ConnectionGroupDirectory.java @@ -34,6 +34,8 @@ import net.sourceforge.guacamole.net.auth.mysql.dao.ConnectionGroupPermissionMap import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionGroupPermissionKey; import net.sourceforge.guacamole.net.auth.mysql.service.ConnectionGroupService; import net.sourceforge.guacamole.net.auth.mysql.service.PermissionCheckService; +import org.glyptodon.guacamole.GuacamoleResourceNotFoundException; +import org.glyptodon.guacamole.GuacamoleUnsupportedException; import org.mybatis.guice.transactional.Transactional; /** @@ -189,7 +191,7 @@ public class ConnectionGroupDirectory implements Directory { // Prevent self-de-adminifying if (user_id == this.user_id) - throw new GuacamoleClientException("Removing your own administrative permissions is not allowed."); + throw new GuacamoleUnsupportedException("Removing your own administrative permissions is not allowed."); // Build list of requested system permissions List systemPermissionTypes = new ArrayList(); @@ -654,7 +655,7 @@ public class UserDirectory implements Directory { // If user not actually from this auth provider, we can't handle updated // permissions. if (!(object instanceof MySQLUser)) - throw new GuacamoleException("User not from database."); + throw new GuacamoleUnsupportedException("User not from database."); MySQLUser mySQLUser = (MySQLUser) object; @@ -685,7 +686,7 @@ public class UserDirectory implements Directory { // Prevent self-deletion if (user.getUserID() == this.user_id) - throw new GuacamoleClientException("Deleting your own user is not allowed."); + throw new GuacamoleUnsupportedException("Deleting your own user is not allowed."); // Validate current user has permission to remove the specified user permissionCheckService.verifyUserAccess(this.user_id, diff --git a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/service/ConnectionGroupService.java b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/service/ConnectionGroupService.java index 4a60c0fed..4640091e9 100644 --- a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/service/ConnectionGroupService.java +++ b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/service/ConnectionGroupService.java @@ -28,7 +28,6 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import org.glyptodon.guacamole.GuacamoleClientException; import org.glyptodon.guacamole.GuacamoleException; import org.glyptodon.guacamole.net.GuacamoleSocket; import net.sourceforge.guacamole.net.auth.mysql.ActiveConnectionMap; @@ -40,6 +39,9 @@ import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionGroup; import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionGroupExample; import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionGroupExample.Criteria; import net.sourceforge.guacamole.net.auth.mysql.properties.MySQLGuacamoleProperties; +import org.glyptodon.guacamole.GuacamoleClientTooManyException; +import org.glyptodon.guacamole.GuacamoleResourceNotFoundException; +import org.glyptodon.guacamole.GuacamoleServerBusyException; import org.glyptodon.guacamole.properties.GuacamoleProperties; import org.glyptodon.guacamole.protocol.GuacamoleClientInformation; @@ -130,7 +132,7 @@ public class ConnectionGroupService { try { connectionGroupID = Integer.parseInt(uniqueIdentifier); } catch(NumberFormatException e) { - throw new GuacamoleException("Invalid connection group ID."); + throw new GuacamoleResourceNotFoundException("Invalid connection group ID."); } } @@ -194,18 +196,18 @@ public class ConnectionGroupService { activeConnectionMap.getLeastUsedConnection(connectionIDs); if(leastUsedConnectionID == null) - throw new GuacamoleException("No connections found in group."); + throw new GuacamoleResourceNotFoundException("No connections found in group."); if(GuacamoleProperties.getProperty( MySQLGuacamoleProperties.MYSQL_DISALLOW_SIMULTANEOUS_CONNECTIONS, false) && activeConnectionMap.isActive(leastUsedConnectionID)) - throw new GuacamoleClientException + throw new GuacamoleServerBusyException ("Cannot connect. All connections are in use."); if(GuacamoleProperties.getProperty( MySQLGuacamoleProperties.MYSQL_DISALLOW_DUPLICATE_CONNECTIONS, true) && activeConnectionMap.isConnectionGroupUserActive(group.getConnectionGroupID(), userID)) - throw new GuacamoleClientException + throw new GuacamoleClientTooManyException ("Cannot connect. Connection group already in use by this user."); // Get the connection diff --git a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/service/ConnectionService.java b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/service/ConnectionService.java index 0146da1d9..ad402570f 100644 --- a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/service/ConnectionService.java +++ b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/service/ConnectionService.java @@ -30,7 +30,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import org.glyptodon.guacamole.GuacamoleClientException; import org.glyptodon.guacamole.GuacamoleException; import org.glyptodon.guacamole.net.GuacamoleSocket; import org.glyptodon.guacamole.net.InetGuacamoleSocket; @@ -55,6 +54,8 @@ import org.glyptodon.guacamole.protocol.ConfiguredGuacamoleSocket; import org.glyptodon.guacamole.protocol.GuacamoleClientInformation; import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; import org.apache.ibatis.session.RowBounds; +import org.glyptodon.guacamole.GuacamoleClientTooManyException; +import org.glyptodon.guacamole.GuacamoleResourceConflictException; /** * Service which provides convenience methods for creating, retrieving, and @@ -326,12 +327,12 @@ public class ConnectionService { if(GuacamoleProperties.getProperty( MySQLGuacamoleProperties.MYSQL_DISALLOW_SIMULTANEOUS_CONNECTIONS, false) && activeConnectionMap.isActive(connection.getConnectionID())) - throw new GuacamoleClientException("Cannot connect. This connection is in use."); + throw new GuacamoleResourceConflictException("Cannot connect. This connection is in use."); if(GuacamoleProperties.getProperty( MySQLGuacamoleProperties.MYSQL_DISALLOW_DUPLICATE_CONNECTIONS, true) && activeConnectionMap.isConnectionUserActive(connection.getConnectionID(), userID)) - throw new GuacamoleClientException + throw new GuacamoleClientTooManyException ("Cannot connect. Connection already in use by this user."); // Get guacd connection information