GUACAMOLE-220: Use effective permissions to test user access to resources.

This commit is contained in:
Michael Jumper committed 2018-04-19 15:29:11 -07:00
1 parent dfb07edf29
commit 393e1ab647
15 files changed
+155 -90

No files matched your search

@@ -35,6 +35,7 @@ import org.apache.guacamole.GuacamoleSecurityException;
import org.apache.guacamole.net.auth.Connection;
import org.apache.guacamole.net.auth.ConnectionRecord;
import org.apache.guacamole.net.auth.Directory;
import org.apache.guacamole.net.auth.Permissions;
import org.apache.guacamole.rest.directory.DirectoryView;
import org.apache.guacamole.net.auth.SharingProfile;
import org.apache.guacamole.net.auth.User;
@@ -119,11 +120,13 @@ public class ConnectionResource extends DirectoryObjectResource<Connection, APIC
public Map<String, String> getConnectionParameters()
throws GuacamoleException {
// Pull effective permissions
User self = userContext.self();
Permissions effective = self.getEffectivePermissions();
// Retrieve permission sets
SystemPermissionSet systemPermissions = self.getSystemPermissions();
ObjectPermissionSet connectionPermissions = self.getConnectionPermissions();
SystemPermissionSet systemPermissions = effective.getSystemPermissions();
ObjectPermissionSet connectionPermissions = effective.getConnectionPermissions();
// Deny access if adminstrative or update permission is missing
String identifier = connection.getIdentifier();
@@ -29,8 +29,8 @@ import org.apache.guacamole.GuacamoleException;
import org.apache.guacamole.net.auth.Connection;
import org.apache.guacamole.net.auth.ConnectionGroup;
import org.apache.guacamole.net.auth.Directory;
import org.apache.guacamole.net.auth.Permissions;
import org.apache.guacamole.net.auth.SharingProfile;
import org.apache.guacamole.net.auth.User;
import org.apache.guacamole.net.auth.UserContext;
import org.apache.guacamole.net.auth.permission.ObjectPermission;
import org.apache.guacamole.net.auth.permission.ObjectPermissionSet;
@@ -356,9 +356,9 @@ public class ConnectionGroupTree {
retrievedGroups.put(root.getIdentifier(), this.rootAPIGroup);
// Store user's current permissions
User self = userContext.self();
this.connectionPermissions = self.getConnectionPermissions();
this.sharingProfilePermissions = self.getSharingProfilePermissions();
Permissions effective = userContext.self().getEffectivePermissions();
this.connectionPermissions = effective.getConnectionPermissions();
this.sharingProfilePermissions = effective.getSharingProfilePermissions();
// Store required directories
this.connectionDirectory = userContext.getConnectionDirectory();
@@ -37,6 +37,7 @@ import org.apache.guacamole.GuacamoleResourceNotFoundException;
import org.apache.guacamole.GuacamoleUnsupportedException;
import org.apache.guacamole.net.auth.Directory;
import org.apache.guacamole.net.auth.Identifiable;
import org.apache.guacamole.net.auth.Permissions;
import org.apache.guacamole.net.auth.User;
import org.apache.guacamole.net.auth.UserContext;
import org.apache.guacamole.net.auth.permission.ObjectPermission;
@@ -143,13 +144,14 @@ public abstract class DirectoryResource<InternalType extends Identifiable, Exter
// An admin user has access to all objects
User self = userContext.self();
SystemPermissionSet systemPermissions = self.getSystemPermissions();
Permissions effective = self.getEffectivePermissions();
SystemPermissionSet systemPermissions = effective.getSystemPermissions();
boolean isAdmin = systemPermissions.hasPermission(SystemPermission.Type.ADMINISTER);
// Filter objects, if requested
Collection<String> identifiers = directory.getIdentifiers();
if (!isAdmin && permissions != null && !permissions.isEmpty()) {
ObjectPermissionSet objectPermissions = self.getUserPermissions();
ObjectPermissionSet objectPermissions = effective.getUserPermissions();
identifiers = objectPermissions.getAccessibleObjects(permissions, identifiers);
}
@@ -24,20 +24,20 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.guacamole.GuacamoleException;
import org.apache.guacamole.net.auth.User;
import org.apache.guacamole.net.auth.Permissions;
import org.apache.guacamole.net.auth.permission.ObjectPermission;
import org.apache.guacamole.net.auth.permission.ObjectPermissionSet;
import org.apache.guacamole.net.auth.permission.SystemPermission;
import org.apache.guacamole.net.auth.permission.SystemPermissionSet;
/**
* The set of permissions which are granted to a specific user, organized by
* object type and, if applicable, identifier. This object can be constructed
* with arbitrary permissions present, or manipulated after creation through
* the manipulation or replacement of its collections of permissions, but is
* otherwise not intended for internal use as a data structure for permissions.
* Its primary purpose is as a hierarchical format for exchanging granted
* permissions with REST clients.
* The set of permissions which are granted to a specific user or user group,
* organized by object type and, if applicable, identifier. This object can be
* constructed with arbitrary permissions present, or manipulated after creation
* through the manipulation or replacement of its collections of permissions,
* but is otherwise not intended for internal use as a data structure for
* permissions. Its primary purpose is as a hierarchical format for exchanging
* granted permissions with REST clients.
*/
public class APIPermissionSet {
@@ -146,24 +146,23 @@ public class APIPermissionSet {
/**
* Creates a new permission set containing all permissions currently
* granted to the given user.
* granted within the given Permissions object.
*
* @param user
* The user whose permissions should be stored within this permission
* set.
* @param permissions
* The permissions that should be stored within this permission set.
*
* @throws GuacamoleException
* If an error occurs while retrieving the user's permissions.
* If an error occurs while retrieving the permissions.
*/
public APIPermissionSet(User user) throws GuacamoleException {
public APIPermissionSet(Permissions permissions) throws GuacamoleException {
// Add all permissions from the provided user
addSystemPermissions(systemPermissions, user.getSystemPermissions());
addObjectPermissions(connectionPermissions, user.getConnectionPermissions());
addObjectPermissions(connectionGroupPermissions, user.getConnectionGroupPermissions());
addObjectPermissions(sharingProfilePermissions, user.getSharingProfilePermissions());
addObjectPermissions(activeConnectionPermissions, user.getActiveConnectionPermissions());
addObjectPermissions(userPermissions, user.getUserPermissions());
addSystemPermissions(systemPermissions, permissions.getSystemPermissions());
addObjectPermissions(connectionPermissions, permissions.getConnectionPermissions());
addObjectPermissions(connectionGroupPermissions, permissions.getConnectionGroupPermissions());
addObjectPermissions(sharingProfilePermissions, permissions.getSharingProfilePermissions());
addObjectPermissions(activeConnectionPermissions, permissions.getActiveConnectionPermissions());
addObjectPermissions(userPermissions, permissions.getUserPermissions());
}
@@ -229,7 +228,7 @@ public class APIPermissionSet {
/**
* Returns a map of user IDs to the set of permissions granted for that
* user. If no permissions are granted to a particular user, its ID will
* user. If no permissions are granted for a particular user, its ID will
* not be present as a key in the map. This map is mutable, and changes to
* to this map will affect the permission set directly.
*
@@ -30,6 +30,7 @@ import javax.ws.rs.core.MediaType;
import org.apache.guacamole.GuacamoleException;
import org.apache.guacamole.GuacamoleSecurityException;
import org.apache.guacamole.net.auth.Directory;
import org.apache.guacamole.net.auth.Permissions;
import org.apache.guacamole.net.auth.SharingProfile;
import org.apache.guacamole.net.auth.User;
import org.apache.guacamole.net.auth.UserContext;
@@ -103,11 +104,13 @@ public class SharingProfileResource
public Map<String, String> getParameters()
throws GuacamoleException {
// Pull effective permissions
User self = userContext.self();
Permissions effective = self.getEffectivePermissions();
// Retrieve permission sets
SystemPermissionSet systemPermissions = self.getSystemPermissions();
ObjectPermissionSet sharingProfilePermissions = self.getSharingProfilePermissions();
SystemPermissionSet systemPermissions = effective.getSystemPermissions();
ObjectPermissionSet sharingProfilePermissions = effective.getSharingProfilePermissions();
// Deny access if adminstrative or update permission is missing
String identifier = sharingProfile.getIdentifier();
@@ -43,6 +43,7 @@ import org.apache.guacamole.net.auth.credentials.GuacamoleCredentialsException;
import org.apache.guacamole.rest.directory.DirectoryObjectResource;
import org.apache.guacamole.rest.directory.DirectoryObjectTranslator;
import org.apache.guacamole.rest.history.APIActivityRecord;
import org.apache.guacamole.rest.permission.APIPermissionSet;
import org.apache.guacamole.rest.permission.PermissionSetResource;
/**
@@ -181,7 +182,8 @@ public class UserResource
/**
* Returns a resource which abstracts operations available on the overall
* permissions granted to the User represented by this UserResource.
* permissions granted directly to the User represented by this
* UserResource.
*
* @return
* A resource which representing the permissions granted to the User
@@ -192,4 +194,21 @@ public class UserResource
return new PermissionSetResource(user);
}
/**
* Returns a read-only view of the permissions effectively granted to this
* user, including permissions which may be inherited or implied.
*
* @return
* A read-only view of the permissions effectively granted to this
* user.
*
* @throws GuacamoleException
* If the effective permissions for this user cannot be retrieved.
*/
@GET
@Path("effectivePermissions")
public APIPermissionSet getEffectivePermissions() throws GuacamoleException {
return new APIPermissionSet(user.getEffectivePermissions());
}
}