mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 00:53:21 +00:00 
			
		
		
		
	GUAC-932: Add permission filtering to recursive connection group query.
This commit is contained in:
		| @@ -42,7 +42,10 @@ import org.glyptodon.guacamole.GuacamoleResourceNotFoundException; | |||||||
| import org.glyptodon.guacamole.net.auth.Connection; | import org.glyptodon.guacamole.net.auth.Connection; | ||||||
| import org.glyptodon.guacamole.net.auth.ConnectionGroup; | import org.glyptodon.guacamole.net.auth.ConnectionGroup; | ||||||
| import org.glyptodon.guacamole.net.auth.Directory; | import org.glyptodon.guacamole.net.auth.Directory; | ||||||
|  | import org.glyptodon.guacamole.net.auth.User; | ||||||
| import org.glyptodon.guacamole.net.auth.UserContext; | import org.glyptodon.guacamole.net.auth.UserContext; | ||||||
|  | import org.glyptodon.guacamole.net.auth.permission.ConnectionPermission; | ||||||
|  | import org.glyptodon.guacamole.net.auth.permission.ObjectPermission; | ||||||
| import org.glyptodon.guacamole.net.basic.rest.AuthProviderRESTExposure; | import org.glyptodon.guacamole.net.basic.rest.AuthProviderRESTExposure; | ||||||
| import org.glyptodon.guacamole.net.basic.rest.HTTPException; | import org.glyptodon.guacamole.net.basic.rest.HTTPException; | ||||||
| import org.glyptodon.guacamole.net.basic.rest.auth.AuthenticationService; | import org.glyptodon.guacamole.net.basic.rest.auth.AuthenticationService; | ||||||
| @@ -85,6 +88,11 @@ public class ConnectionGroupRESTService { | |||||||
|      *     Whether the descendant connections and groups of the given |      *     Whether the descendant connections and groups of the given | ||||||
|      *     connection group should also be retrieved. |      *     connection group should also be retrieved. | ||||||
|      *  |      *  | ||||||
|  |      * @param permission | ||||||
|  |      *     The permission the current user must have for a connection or | ||||||
|  |      *     connection group to be returned in the results, if any. If null | ||||||
|  |      *     is specified, no filtering by permission will be performed. | ||||||
|  |      * | ||||||
|      * @return |      * @return | ||||||
|      *     The requested connection group, or null if no such connection group |      *     The requested connection group, or null if no such connection group | ||||||
|      *     exists. |      *     exists. | ||||||
| @@ -94,9 +102,10 @@ public class ConnectionGroupRESTService { | |||||||
|      *     or any of its descendants. |      *     or any of its descendants. | ||||||
|      */ |      */ | ||||||
|     private APIConnectionGroup retrieveConnectionGroup(UserContext userContext, |     private APIConnectionGroup retrieveConnectionGroup(UserContext userContext, | ||||||
|             String identifier, boolean includeDescendants) |             String identifier, boolean includeDescendants, ObjectPermission.Type permission) | ||||||
|             throws GuacamoleException { |             throws GuacamoleException { | ||||||
|  |  | ||||||
|  |         User self = userContext.self(); | ||||||
|         ConnectionGroup rootGroup = userContext.getRootConnectionGroup(); |         ConnectionGroup rootGroup = userContext.getRootConnectionGroup(); | ||||||
|          |          | ||||||
|         ConnectionGroup connectionGroup; |         ConnectionGroup connectionGroup; | ||||||
| @@ -135,7 +144,9 @@ public class ConnectionGroupRESTService { | |||||||
|                 if (childConnection == null) |                 if (childConnection == null) | ||||||
|                     continue; |                     continue; | ||||||
|  |  | ||||||
|                 apiConnections.add(new APIConnection(childConnection)); |                 // Filter based on permission, if requested | ||||||
|  |                 if (permission == null || self.hasPermission(new ConnectionPermission(permission, childIdentifier))) | ||||||
|  |                     apiConnections.add(new APIConnection(childConnection)); | ||||||
|  |  | ||||||
|             } |             } | ||||||
|              |              | ||||||
| @@ -149,7 +160,7 @@ public class ConnectionGroupRESTService { | |||||||
|             for (String childIdentifier : groupDirectory.getIdentifiers()) { |             for (String childIdentifier : groupDirectory.getIdentifiers()) { | ||||||
|  |  | ||||||
|                 // Pull current connection group - silently ignore if connection group was removed prior to read |                 // Pull current connection group - silently ignore if connection group was removed prior to read | ||||||
|                 APIConnectionGroup childConnectionGroup = retrieveConnectionGroup(userContext, childIdentifier, true); |                 APIConnectionGroup childConnectionGroup = retrieveConnectionGroup(userContext, childIdentifier, true, permission); | ||||||
|                 if (childConnectionGroup == null) |                 if (childConnectionGroup == null) | ||||||
|                     continue; |                     continue; | ||||||
|  |  | ||||||
| @@ -170,11 +181,18 @@ public class ConnectionGroupRESTService { | |||||||
|     /** |     /** | ||||||
|      * Gets an individual connection group. |      * Gets an individual connection group. | ||||||
|      *  |      *  | ||||||
|      * @param authToken The authentication token that is used to authenticate |      * @param authToken | ||||||
|      *                  the user performing the operation. |      *     The authentication token that is used to authenticate the user | ||||||
|      * @param connectionGroupID The ID of the ConnectionGroup. |      *     performing the operation. | ||||||
|      * @return The connection group. |      *  | ||||||
|      * @throws GuacamoleException If a problem is encountered while retrieving the connection group. |      * @param connectionGroupID | ||||||
|  |      *     The ID of the connection group to retrieve. | ||||||
|  |      *  | ||||||
|  |      * @return | ||||||
|  |      *     The connection group, without any descendants. | ||||||
|  |      * | ||||||
|  |      * @throws GuacamoleException | ||||||
|  |      *     If a problem is encountered while retrieving the connection group. | ||||||
|      */ |      */ | ||||||
|     @GET |     @GET | ||||||
|     @Path("/{connectionGroupID}") |     @Path("/{connectionGroupID}") | ||||||
| @@ -185,7 +203,7 @@ public class ConnectionGroupRESTService { | |||||||
|         UserContext userContext = authenticationService.getUserContext(authToken); |         UserContext userContext = authenticationService.getUserContext(authToken); | ||||||
|  |  | ||||||
|         // Retrieve requested connection group only |         // Retrieve requested connection group only | ||||||
|         APIConnectionGroup connectionGroup = retrieveConnectionGroup(userContext, connectionGroupID, false); |         APIConnectionGroup connectionGroup = retrieveConnectionGroup(userContext, connectionGroupID, false, null); | ||||||
|         if (connectionGroup == null) |         if (connectionGroup == null) | ||||||
|             throw new GuacamoleResourceNotFoundException("No such connection group: \"" + connectionGroupID + "\""); |             throw new GuacamoleResourceNotFoundException("No such connection group: \"" + connectionGroupID + "\""); | ||||||
|  |  | ||||||
| @@ -201,10 +219,16 @@ public class ConnectionGroupRESTService { | |||||||
|      *     performing the operation. |      *     performing the operation. | ||||||
|      * |      * | ||||||
|      * @param connectionGroupID |      * @param connectionGroupID | ||||||
|      *     The ID of the ConnectionGroup. |      *     The ID of the connection group to retrieve. | ||||||
|  |      * | ||||||
|  |      * @param permission | ||||||
|  |      *     If specified, limit the returned list to only those connections and | ||||||
|  |      *     connection groups for which the current user has the given | ||||||
|  |      *     permission. Otherwise, all visible connections and connection groups | ||||||
|  |      *     are returned. | ||||||
|      *  |      *  | ||||||
|      * @return |      * @return | ||||||
|      *     The connection group. |      *     The requested connection group, including all descendants. | ||||||
|      * |      * | ||||||
|      * @throws GuacamoleException |      * @throws GuacamoleException | ||||||
|      *     If a problem is encountered while retrieving the connection group or |      *     If a problem is encountered while retrieving the connection group or | ||||||
| @@ -214,12 +238,14 @@ public class ConnectionGroupRESTService { | |||||||
|     @Path("/{connectionGroupID}/tree") |     @Path("/{connectionGroupID}/tree") | ||||||
|     @AuthProviderRESTExposure |     @AuthProviderRESTExposure | ||||||
|     public APIConnectionGroup getConnectionGroupTree(@QueryParam("token") String authToken,  |     public APIConnectionGroup getConnectionGroupTree(@QueryParam("token") String authToken,  | ||||||
|             @PathParam("connectionGroupID") String connectionGroupID) throws GuacamoleException { |             @PathParam("connectionGroupID") String connectionGroupID, | ||||||
|  |             @QueryParam("permission") ObjectPermission.Type permission) | ||||||
|  |             throws GuacamoleException { | ||||||
|  |  | ||||||
|         UserContext userContext = authenticationService.getUserContext(authToken); |         UserContext userContext = authenticationService.getUserContext(authToken); | ||||||
|  |  | ||||||
|         // Retrieve requested connection group and all descendants |         // Retrieve requested connection group and all descendants | ||||||
|         APIConnectionGroup connectionGroup = retrieveConnectionGroup(userContext, connectionGroupID, true); |         APIConnectionGroup connectionGroup = retrieveConnectionGroup(userContext, connectionGroupID, true, permission); | ||||||
|         if (connectionGroup == null) |         if (connectionGroup == null) | ||||||
|             throw new GuacamoleResourceNotFoundException("No such connection group: \"" + connectionGroupID + "\""); |             throw new GuacamoleResourceNotFoundException("No such connection group: \"" + connectionGroupID + "\""); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -32,22 +32,43 @@ angular.module('rest').factory('connectionGroupService', ['$http', 'authenticati | |||||||
|      * Makes a request to the REST API to get an individual connection group |      * Makes a request to the REST API to get an individual connection group | ||||||
|      * and all descendants, returning a promise that provides the corresponding |      * and all descendants, returning a promise that provides the corresponding | ||||||
|      * @link{ConnectionGroup} if successful. Descendant groups and connections |      * @link{ConnectionGroup} if successful. Descendant groups and connections | ||||||
|      * will be stored as children of that connection group. |      * will be stored as children of that connection group. If a permission | ||||||
|  |      * type is specified, the result will be filtering by that permission. | ||||||
|      *  |      *  | ||||||
|      * @param {String} [connectionGroupID=ConnectionGroup.ROOT_IDENTIFIER] |      * @param {String} [connectionGroupID=ConnectionGroup.ROOT_IDENTIFIER] | ||||||
|      *     The ID of the connection group to retrieve. If not provided, the |      *     The ID of the connection group to retrieve. If not provided, the | ||||||
|      *     root connection group will be retrieved by default. |      *     root connection group will be retrieved by default. | ||||||
|      *      |      *      | ||||||
|  |      * @param {String} [permissionType] | ||||||
|  |      *     The permission type string of the permission that the current user | ||||||
|  |      *     must have for a given connection or connection group to appear | ||||||
|  |      *     within the result. Valid values are listed within | ||||||
|  |      *     PermissionSet.ObjectType. | ||||||
|  |      * | ||||||
|      * @returns {Promise.ConnectionGroup} |      * @returns {Promise.ConnectionGroup} | ||||||
|      *     A promise which will resolve with a @link{ConnectionGroup} upon |      *     A promise which will resolve with a @link{ConnectionGroup} upon | ||||||
|      *     success. |      *     success. | ||||||
|      */ |      */ | ||||||
|     service.getConnectionGroupTree = function getConnectionGroupTree(connectionGroupID) { |     service.getConnectionGroupTree = function getConnectionGroupTree(connectionGroupID, permissionType) { | ||||||
|          |          | ||||||
|         // Use the root connection group ID if no ID is passed in |         // Use the root connection group ID if no ID is passed in | ||||||
|         connectionGroupID = connectionGroupID || ConnectionGroup.ROOT_IDENTIFIER; |         connectionGroupID = connectionGroupID || ConnectionGroup.ROOT_IDENTIFIER; | ||||||
|  |  | ||||||
|         return $http.get("api/connectionGroup/" + connectionGroupID + "/tree?token=" + authenticationService.getCurrentToken()); |         // Build HTTP parameters set | ||||||
|  |         var httpParameters = { | ||||||
|  |             token : authenticationService.getCurrentToken() | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |         // Add permission filter if specified | ||||||
|  |         if (permissionType) | ||||||
|  |             httpParameters.permission = permissionType; | ||||||
|  |  | ||||||
|  |         // Retrieve connection group  | ||||||
|  |         return $http({ | ||||||
|  |             method  : 'GET', | ||||||
|  |             url     : 'api/connectionGroup/' + encodeURIComponent(connectionGroupID) + '/tree', | ||||||
|  |             params  : httpParameters | ||||||
|  |         }); | ||||||
|         |         | ||||||
|     }; |     }; | ||||||
|      |      | ||||||
| @@ -69,7 +90,17 @@ angular.module('rest').factory('connectionGroupService', ['$http', 'authenticati | |||||||
|         // Use the root connection group ID if no ID is passed in |         // Use the root connection group ID if no ID is passed in | ||||||
|         connectionGroupID = connectionGroupID || ConnectionGroup.ROOT_IDENTIFIER; |         connectionGroupID = connectionGroupID || ConnectionGroup.ROOT_IDENTIFIER; | ||||||
|          |          | ||||||
|         return $http.get("api/connectionGroup/" + connectionGroupID + "?token=" + authenticationService.getCurrentToken()); |         // Build HTTP parameters set | ||||||
|  |         var httpParameters = { | ||||||
|  |             token : authenticationService.getCurrentToken() | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |         // Retrieve connection group | ||||||
|  |         return $http({ | ||||||
|  |             method  : 'GET', | ||||||
|  |             url     : 'api/connectionGroup/' + encodeURIComponent(connectionGroupID), | ||||||
|  |             params  : httpParameters | ||||||
|  |         }); | ||||||
|  |  | ||||||
|     }; |     }; | ||||||
|      |      | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user