From 73641925fce4063edb5aaa59e5f2a79eed8245a8 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 25 Feb 2013 02:37:43 -0800 Subject: [PATCH] Ticket #269: Partial fix of the most immediately apparent (upon login) query errors. Need to rework queries. --- .../mysql/utility/PermissionCheckUtility.java | 140 +++++++++++------- 1 file changed, 85 insertions(+), 55 deletions(-) diff --git a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/utility/PermissionCheckUtility.java b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/utility/PermissionCheckUtility.java index 9731bc489..1a1c5434c 100644 --- a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/utility/PermissionCheckUtility.java +++ b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/utility/PermissionCheckUtility.java @@ -39,6 +39,7 @@ import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Provider; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -684,18 +685,30 @@ public class PermissionCheckUtility { * @return the list of all connections this user has access to */ private Set getConnections(int userID, String permissionType) { + + // If connections available, query them Set affectedConnectionIDs = getConnectionIDs(userID, permissionType); - ConnectionExample example = new ConnectionExample(); - example.createCriteria().andConnection_idIn(Lists.newArrayList(affectedConnectionIDs)); - List connectionDBOjects = connectionDAO.selectByExample(example); - Set affectedConnections = new HashSet(); - for(Connection affectedConnection : connectionDBOjects) { - MySQLConnection mySQLConnection = mySQLConnectionProvider.get(); - mySQLConnection.init(affectedConnection); - affectedConnections.add(mySQLConnection); + if (!affectedConnectionIDs.isEmpty()) { + + // Query available connections + ConnectionExample example = new ConnectionExample(); + example.createCriteria().andConnection_idIn(Lists.newArrayList(affectedConnectionIDs)); + List connectionDBOjects = connectionDAO.selectByExample(example); + + // Add connections to final set + Set affectedConnections = new HashSet(); + for(Connection affectedConnection : connectionDBOjects) { + MySQLConnection mySQLConnection = mySQLConnectionProvider.get(); + mySQLConnection.init(affectedConnection); + affectedConnections.add(mySQLConnection); + } + + return affectedConnections; } - return affectedConnections; + // Otherwise, no connections available + return Collections.EMPTY_SET; + } /** @@ -795,62 +808,79 @@ public class PermissionCheckUtility { public Set getAllPermissions(int userID) { Set allPermissions = new HashSet(); - // first, user permissions + // First, user permissions UserPermissionExample userPermissionExample = new UserPermissionExample(); userPermissionExample.createCriteria().andUser_idEqualTo(userID); - List userPermissions = userPermissionDAO.selectByExample(userPermissionExample); - List affectedUserIDs = new ArrayList(); - for(UserPermissionKey userPermission : userPermissions) { - affectedUserIDs.add(userPermission.getAffected_user_id()); + List userPermissions = + userPermissionDAO.selectByExample(userPermissionExample); + + // If user permissions present, add permissions + if (!userPermissions.isEmpty()) { + + // Get list of affected user IDs + List affectedUserIDs = new ArrayList(); + for(UserPermissionKey userPermission : userPermissions) + affectedUserIDs.add(userPermission.getAffected_user_id()); + + // Query all affected users, store in map indexed by user ID + UserExample userExample = new UserExample(); + userExample.createCriteria().andUser_idIn(affectedUserIDs); + List users = userDAO.selectByExample(userExample); + Map userMap = new HashMap(); + for(User user : users) + userMap.put(user.getUser_id(), user); + + // Add user permissions + for(UserPermissionKey userPermission : userPermissions) { + User affectedUser = userMap.get(userPermission.getAffected_user_id()); + UserPermission newPermission = new UserPermission( + UserPermission.Type.valueOf(userPermission.getPermission()), + affectedUser.getUsername() + ); + allPermissions.add(newPermission); + } + } - UserExample userExample = new UserExample(); - userExample.createCriteria().andUser_idIn(affectedUserIDs); - List users = userDAO.selectByExample(userExample); - Map userMap = new HashMap(); - for(User user : users) { - userMap.put(user.getUser_id(), user); - } - - for(UserPermissionKey userPermission : userPermissions) { - User affectedUser = userMap.get(userPermission.getAffected_user_id()); - UserPermission newPermission = new UserPermission( - UserPermission.Type.valueOf(userPermission.getPermission()), - affectedUser.getUsername() - ); - allPermissions.add(newPermission); - } - - //secondly, connection permissions + // Secondly, connection permissions ConnectionPermissionExample connectionPermissionExample = new ConnectionPermissionExample(); connectionPermissionExample.createCriteria().andUser_idEqualTo(userID); - List connectionPermissions = connectionPermissionDAO.selectByExample(connectionPermissionExample); - List affectedConnectionIDs = new ArrayList(); - for(ConnectionPermissionKey connectionPermission : connectionPermissions) { - affectedConnectionIDs.add(connectionPermission.getConnection_id()); + List connectionPermissions = + connectionPermissionDAO.selectByExample(connectionPermissionExample); + + // If connection permissions present, add permissions + if (!connectionPermissions.isEmpty()) { + + // Get list of affected connection IDs + List affectedConnectionIDs = new ArrayList(); + for(ConnectionPermissionKey connectionPermission : connectionPermissions) + affectedConnectionIDs.add(connectionPermission.getConnection_id()); + + // Query connections, store in map indexed by connection ID + ConnectionExample connectionExample = new ConnectionExample(); + connectionExample.createCriteria().andConnection_idIn(affectedConnectionIDs); + List connections = connectionDAO.selectByExample(connectionExample); + Map connectionMap = new HashMap(); + for(Connection connection : connections) + connectionMap.put(connection.getConnection_id(), connection); + + // Add connection permissions + for(ConnectionPermissionKey connectionPermission : connectionPermissions) { + Connection affectedConnection = connectionMap.get(connectionPermission.getConnection_id()); + ConnectionPermission newPermission = new ConnectionPermission( + ConnectionPermission.Type.valueOf(connectionPermission.getPermission()), + affectedConnection.getConnection_name() + ); + allPermissions.add(newPermission); + } + } - ConnectionExample connectionExample = new ConnectionExample(); - connectionExample.createCriteria().andConnection_idIn(affectedConnectionIDs); - List connections = connectionDAO.selectByExample(connectionExample); - Map connectionMap = new HashMap(); - for(Connection connection : connections) { - connectionMap.put(connection.getConnection_id(), connection); - } - - for(ConnectionPermissionKey connectionPermission : connectionPermissions) { - Connection affectedConnection = connectionMap.get(connectionPermission.getConnection_id()); - ConnectionPermission newPermission = new ConnectionPermission( - ConnectionPermission.Type.valueOf(connectionPermission.getPermission()), - affectedConnection.getConnection_name() - ); - allPermissions.add(newPermission); - } - - //and finally, system permissions + // And finally, system permissions SystemPermissionExample systemPermissionExample = new SystemPermissionExample(); systemPermissionExample.createCriteria().andUser_idEqualTo(userID); - List systemPermissions = systemPermissionDAO.selectByExample(systemPermissionExample); + List systemPermissions = + systemPermissionDAO.selectByExample(systemPermissionExample); for(SystemPermissionKey systemPermission : systemPermissions) { SystemPermission newPermission = null; if(systemPermission.getPermission().equals(MySQLConstants.SYSTEM_USER_CREATE))