mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-10-30 00:23:21 +00:00
GUAC-995 Improve permission checking around connections and groups.
This commit is contained in:
@@ -25,6 +25,7 @@ package org.glyptodon.guacamole.net.basic.rest.connectiongroup;
|
||||
import com.google.inject.Inject;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.DELETE;
|
||||
import javax.ws.rs.GET;
|
||||
@@ -80,6 +81,40 @@ public class ConnectionGroupRESTService {
|
||||
@Inject
|
||||
private ObjectRetrievalService retrievalService;
|
||||
|
||||
/**
|
||||
* Determines whether the given user has at least one of the given
|
||||
* permissions for the connection having the given identifier.
|
||||
*
|
||||
* @param user
|
||||
* The user to check permissions for.
|
||||
*
|
||||
* @param identifier
|
||||
* The identifier of the connection to check permissions for.
|
||||
*
|
||||
* @param permissions
|
||||
* The permissions to check. The given user must have one or more of
|
||||
* these permissions for this function to return true.
|
||||
*
|
||||
* @return
|
||||
* true if the user has at least one of the given permissions.
|
||||
*/
|
||||
private boolean hasConnectionPermission(User user, String identifier,
|
||||
List<ObjectPermission.Type> permissions) throws GuacamoleException {
|
||||
|
||||
// Determine whether user has at least one of the given permissions
|
||||
for (ObjectPermission.Type permission : permissions) {
|
||||
|
||||
ConnectionPermission connectionPermission = new ConnectionPermission(permission, identifier);
|
||||
if (user.hasPermission(connectionPermission))
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
// None of the given permissions were present
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the given connection group from the user context, including
|
||||
* all descendant connections and groups if requested.
|
||||
@@ -94,10 +129,10 @@ public class ConnectionGroupRESTService {
|
||||
* Whether the descendant connections and groups of the given
|
||||
* 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.
|
||||
* @param permissions
|
||||
* The set of permissions to filter with. A user must have one or more
|
||||
* of these permissions for a connection to appear in the result.
|
||||
* If null, no filtering will be performed.
|
||||
*
|
||||
* @return
|
||||
* The requested connection group, or null if no such connection group
|
||||
@@ -108,7 +143,7 @@ public class ConnectionGroupRESTService {
|
||||
* or any of its descendants.
|
||||
*/
|
||||
private APIConnectionGroup retrieveConnectionGroup(UserContext userContext,
|
||||
String identifier, boolean includeDescendants, ObjectPermission.Type permission)
|
||||
String identifier, boolean includeDescendants, List<ObjectPermission.Type> permissions)
|
||||
throws GuacamoleException {
|
||||
|
||||
User self = userContext.self();
|
||||
@@ -143,7 +178,7 @@ public class ConnectionGroupRESTService {
|
||||
continue;
|
||||
|
||||
// Filter based on permission, if requested
|
||||
if (isAdmin || permission == null || self.hasPermission(new ConnectionPermission(permission, childIdentifier)))
|
||||
if (isAdmin || permissions == null || hasConnectionPermission(self, childIdentifier, permissions))
|
||||
apiConnections.add(new APIConnection(childConnection));
|
||||
|
||||
}
|
||||
@@ -158,7 +193,7 @@ public class ConnectionGroupRESTService {
|
||||
for (String childIdentifier : groupDirectory.getIdentifiers()) {
|
||||
|
||||
// Pull current connection group - silently ignore if connection group was removed prior to read
|
||||
APIConnectionGroup childConnectionGroup = retrieveConnectionGroup(userContext, childIdentifier, true, permission);
|
||||
APIConnectionGroup childConnectionGroup = retrieveConnectionGroup(userContext, childIdentifier, true, permissions);
|
||||
if (childConnectionGroup == null)
|
||||
continue;
|
||||
|
||||
@@ -219,11 +254,11 @@ public class ConnectionGroupRESTService {
|
||||
* @param connectionGroupID
|
||||
* The ID of the connection group to retrieve.
|
||||
*
|
||||
* @param permission
|
||||
* @param permissions
|
||||
* If specified, limit the returned list to only those connections for
|
||||
* which the current user has the given permission. Otherwise, all
|
||||
* visible connections are returned. Connection groups are unaffected
|
||||
* by this parameter.
|
||||
* which the current user has any of the given permissions. Otherwise,
|
||||
* all visible connections are returned. Connection groups are
|
||||
* unaffected by this parameter.
|
||||
*
|
||||
* @return
|
||||
* The requested connection group, including all descendants.
|
||||
@@ -237,13 +272,13 @@ public class ConnectionGroupRESTService {
|
||||
@AuthProviderRESTExposure
|
||||
public APIConnectionGroup getConnectionGroupTree(@QueryParam("token") String authToken,
|
||||
@PathParam("connectionGroupID") String connectionGroupID,
|
||||
@QueryParam("permission") ObjectPermission.Type permission)
|
||||
@QueryParam("permission") List<ObjectPermission.Type> permissions)
|
||||
throws GuacamoleException {
|
||||
|
||||
UserContext userContext = authenticationService.getUserContext(authToken);
|
||||
|
||||
// Retrieve requested connection group and all descendants
|
||||
APIConnectionGroup connectionGroup = retrieveConnectionGroup(userContext, connectionGroupID, true, permission);
|
||||
APIConnectionGroup connectionGroup = retrieveConnectionGroup(userContext, connectionGroupID, true, permissions);
|
||||
if (connectionGroup == null)
|
||||
throw new GuacamoleResourceNotFoundException("No such connection group: \"" + connectionGroupID + "\"");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user