diff --git a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/UserDirectory.java b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/UserDirectory.java index 4a432cf45..475a7f61c 100644 --- a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/UserDirectory.java +++ b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/UserDirectory.java @@ -48,18 +48,23 @@ import net.sourceforge.guacamole.GuacamoleClientException; import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.GuacamoleSecurityException; import net.sourceforge.guacamole.net.auth.Directory; +import net.sourceforge.guacamole.net.auth.mysql.dao.ConnectionGroupPermissionMapper; import net.sourceforge.guacamole.net.auth.mysql.dao.ConnectionPermissionMapper; import net.sourceforge.guacamole.net.auth.mysql.dao.SystemPermissionMapper; import net.sourceforge.guacamole.net.auth.mysql.dao.UserPermissionMapper; +import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionGroupPermissionExample; +import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionGroupPermissionKey; import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionPermissionExample; import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionPermissionKey; import net.sourceforge.guacamole.net.auth.mysql.model.SystemPermissionExample; import net.sourceforge.guacamole.net.auth.mysql.model.SystemPermissionKey; import net.sourceforge.guacamole.net.auth.mysql.model.UserPermissionExample; import net.sourceforge.guacamole.net.auth.mysql.model.UserPermissionKey; +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 net.sourceforge.guacamole.net.auth.mysql.service.UserService; +import net.sourceforge.guacamole.net.auth.permission.ConnectionGroupPermission; import net.sourceforge.guacamole.net.auth.permission.ConnectionPermission; import net.sourceforge.guacamole.net.auth.permission.Permission; import net.sourceforge.guacamole.net.auth.permission.SystemPermission; @@ -90,6 +95,12 @@ public class UserDirectory implements Directory newUserPermissions = new ArrayList(); List newConnectionPermissions = new ArrayList(); + List newConnectionGroupPermissions = new ArrayList(); List newSystemPermissions = new ArrayList(); for (Permission permission : permissions) { @@ -220,6 +238,9 @@ public class UserDirectory implements Directory removedUserPermissions = new ArrayList(); List removedConnectionPermissions = new ArrayList(); + List removedConnectionGroupPermissions = new ArrayList(); List removedSystemPermissions = new ArrayList(); for (Permission permission : permissions) { @@ -257,6 +280,9 @@ public class UserDirectory implements Directory permissions) + throws GuacamoleException { + + // If no permissions given, stop now + if(permissions.isEmpty()) + return; + + // Get list of administerable connection group IDs + List administerableConnectionGroupIDs = + permissionCheckService.retrieveConnectionGroupIDs(this.user_id, + MySQLConstants.CONNECTION_GROUP_ADMINISTER); + + // Get set of names corresponding to administerable connection groups + Map administerableConnectionGroups = + connectionGroupService.translateNames(administerableConnectionGroupIDs); + + // Insert all given permissions + for (ConnectionGroupPermission permission : permissions) { + + // Get original ID + Integer connection_group_id = + administerableConnectionGroups.get(permission.getObjectIdentifier()); + + // Throw exception if permission to administer this connection group + // is not granted + if (connection_group_id == null) + throw new GuacamoleSecurityException( + "User #" + this.user_id + + " does not have permission to administrate connection group" + + permission.getObjectIdentifier()); + + + // Create new permission + ConnectionGroupPermissionKey newPermission = new ConnectionGroupPermissionKey(); + newPermission.setUser_id(user_id); + newPermission.setPermission(MySQLConstants.getConnectionConstant(permission.getType())); + newPermission.setConnection_group_id(connection_group_id); + connectionGroupPermissionDAO.insert(newPermission); + + } + } + /** * Delete permissions having to do with connections for a given user. * @@ -478,6 +558,58 @@ public class UserDirectory implements Directory permissions) + throws GuacamoleException { + + // If no permissions given, stop now + if(permissions.isEmpty()) + return; + + // Get list of administerable connection group IDs + List administerableConnectionGroupIDs = + permissionCheckService.retrieveConnectionGroupIDs(this.user_id, + MySQLConstants.CONNECTION_GROUP_ADMINISTER); + + // Get set of names corresponding to administerable connection groups + Map administerableConnectionGroups = + connectionGroupService.translateNames(administerableConnectionGroupIDs); + + // Delete requested permissions + for (ConnectionGroupPermission permission : permissions) { + + // Get original ID + Integer connection_group_id = + administerableConnectionGroups.get(permission.getObjectIdentifier()); + + // Verify that the user actually has permission to administrate + // every one of these connection groups + if (connection_group_id == null) + throw new GuacamoleSecurityException( + "User #" + this.user_id + + " does not have permission to administrate connection group" + + permission.getObjectIdentifier()); + + ConnectionGroupPermissionExample connectionGroupPermissionExample = new ConnectionGroupPermissionExample(); + connectionGroupPermissionExample.createCriteria() + .andUser_idEqualTo(user_id) + .andPermissionEqualTo(MySQLConstants.getConnectionGroupConstant(permission.getType())) + .andConnection_group_idEqualTo(connection_group_id); + connectionGroupPermissionDAO.deleteByExample(connectionGroupPermissionExample); + + } + + } + /** * Create any new system permissions for a given user. All permissions in * the given list will be inserted.