mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 21:27:40 +00:00
GUACAMOLE-220: Use effective permissions to test user access to resources.
This commit is contained in:
@@ -35,6 +35,7 @@ import org.apache.guacamole.GuacamoleSecurityException;
|
|||||||
import org.apache.guacamole.net.auth.Connection;
|
import org.apache.guacamole.net.auth.Connection;
|
||||||
import org.apache.guacamole.net.auth.ConnectionRecord;
|
import org.apache.guacamole.net.auth.ConnectionRecord;
|
||||||
import org.apache.guacamole.net.auth.Directory;
|
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.rest.directory.DirectoryView;
|
||||||
import org.apache.guacamole.net.auth.SharingProfile;
|
import org.apache.guacamole.net.auth.SharingProfile;
|
||||||
import org.apache.guacamole.net.auth.User;
|
import org.apache.guacamole.net.auth.User;
|
||||||
@@ -119,11 +120,13 @@ public class ConnectionResource extends DirectoryObjectResource<Connection, APIC
|
|||||||
public Map<String, String> getConnectionParameters()
|
public Map<String, String> getConnectionParameters()
|
||||||
throws GuacamoleException {
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Pull effective permissions
|
||||||
User self = userContext.self();
|
User self = userContext.self();
|
||||||
|
Permissions effective = self.getEffectivePermissions();
|
||||||
|
|
||||||
// Retrieve permission sets
|
// Retrieve permission sets
|
||||||
SystemPermissionSet systemPermissions = self.getSystemPermissions();
|
SystemPermissionSet systemPermissions = effective.getSystemPermissions();
|
||||||
ObjectPermissionSet connectionPermissions = self.getConnectionPermissions();
|
ObjectPermissionSet connectionPermissions = effective.getConnectionPermissions();
|
||||||
|
|
||||||
// Deny access if adminstrative or update permission is missing
|
// Deny access if adminstrative or update permission is missing
|
||||||
String identifier = connection.getIdentifier();
|
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.Connection;
|
||||||
import org.apache.guacamole.net.auth.ConnectionGroup;
|
import org.apache.guacamole.net.auth.ConnectionGroup;
|
||||||
import org.apache.guacamole.net.auth.Directory;
|
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.SharingProfile;
|
||||||
import org.apache.guacamole.net.auth.User;
|
|
||||||
import org.apache.guacamole.net.auth.UserContext;
|
import org.apache.guacamole.net.auth.UserContext;
|
||||||
import org.apache.guacamole.net.auth.permission.ObjectPermission;
|
import org.apache.guacamole.net.auth.permission.ObjectPermission;
|
||||||
import org.apache.guacamole.net.auth.permission.ObjectPermissionSet;
|
import org.apache.guacamole.net.auth.permission.ObjectPermissionSet;
|
||||||
@@ -356,9 +356,9 @@ public class ConnectionGroupTree {
|
|||||||
retrievedGroups.put(root.getIdentifier(), this.rootAPIGroup);
|
retrievedGroups.put(root.getIdentifier(), this.rootAPIGroup);
|
||||||
|
|
||||||
// Store user's current permissions
|
// Store user's current permissions
|
||||||
User self = userContext.self();
|
Permissions effective = userContext.self().getEffectivePermissions();
|
||||||
this.connectionPermissions = self.getConnectionPermissions();
|
this.connectionPermissions = effective.getConnectionPermissions();
|
||||||
this.sharingProfilePermissions = self.getSharingProfilePermissions();
|
this.sharingProfilePermissions = effective.getSharingProfilePermissions();
|
||||||
|
|
||||||
// Store required directories
|
// Store required directories
|
||||||
this.connectionDirectory = userContext.getConnectionDirectory();
|
this.connectionDirectory = userContext.getConnectionDirectory();
|
||||||
|
@@ -37,6 +37,7 @@ import org.apache.guacamole.GuacamoleResourceNotFoundException;
|
|||||||
import org.apache.guacamole.GuacamoleUnsupportedException;
|
import org.apache.guacamole.GuacamoleUnsupportedException;
|
||||||
import org.apache.guacamole.net.auth.Directory;
|
import org.apache.guacamole.net.auth.Directory;
|
||||||
import org.apache.guacamole.net.auth.Identifiable;
|
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.User;
|
||||||
import org.apache.guacamole.net.auth.UserContext;
|
import org.apache.guacamole.net.auth.UserContext;
|
||||||
import org.apache.guacamole.net.auth.permission.ObjectPermission;
|
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
|
// An admin user has access to all objects
|
||||||
User self = userContext.self();
|
User self = userContext.self();
|
||||||
SystemPermissionSet systemPermissions = self.getSystemPermissions();
|
Permissions effective = self.getEffectivePermissions();
|
||||||
|
SystemPermissionSet systemPermissions = effective.getSystemPermissions();
|
||||||
boolean isAdmin = systemPermissions.hasPermission(SystemPermission.Type.ADMINISTER);
|
boolean isAdmin = systemPermissions.hasPermission(SystemPermission.Type.ADMINISTER);
|
||||||
|
|
||||||
// Filter objects, if requested
|
// Filter objects, if requested
|
||||||
Collection<String> identifiers = directory.getIdentifiers();
|
Collection<String> identifiers = directory.getIdentifiers();
|
||||||
if (!isAdmin && permissions != null && !permissions.isEmpty()) {
|
if (!isAdmin && permissions != null && !permissions.isEmpty()) {
|
||||||
ObjectPermissionSet objectPermissions = self.getUserPermissions();
|
ObjectPermissionSet objectPermissions = effective.getUserPermissions();
|
||||||
identifiers = objectPermissions.getAccessibleObjects(permissions, identifiers);
|
identifiers = objectPermissions.getAccessibleObjects(permissions, identifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -24,20 +24,20 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import org.apache.guacamole.GuacamoleException;
|
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.ObjectPermission;
|
||||||
import org.apache.guacamole.net.auth.permission.ObjectPermissionSet;
|
import org.apache.guacamole.net.auth.permission.ObjectPermissionSet;
|
||||||
import org.apache.guacamole.net.auth.permission.SystemPermission;
|
import org.apache.guacamole.net.auth.permission.SystemPermission;
|
||||||
import org.apache.guacamole.net.auth.permission.SystemPermissionSet;
|
import org.apache.guacamole.net.auth.permission.SystemPermissionSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The set of permissions which are granted to a specific user, organized by
|
* The set of permissions which are granted to a specific user or user group,
|
||||||
* object type and, if applicable, identifier. This object can be constructed
|
* organized by object type and, if applicable, identifier. This object can be
|
||||||
* with arbitrary permissions present, or manipulated after creation through
|
* constructed with arbitrary permissions present, or manipulated after creation
|
||||||
* the manipulation or replacement of its collections of permissions, but is
|
* through the manipulation or replacement of its collections of permissions,
|
||||||
* otherwise not intended for internal use as a data structure for permissions.
|
* but is otherwise not intended for internal use as a data structure for
|
||||||
* Its primary purpose is as a hierarchical format for exchanging granted
|
* permissions. Its primary purpose is as a hierarchical format for exchanging
|
||||||
* permissions with REST clients.
|
* granted permissions with REST clients.
|
||||||
*/
|
*/
|
||||||
public class APIPermissionSet {
|
public class APIPermissionSet {
|
||||||
|
|
||||||
@@ -146,24 +146,23 @@ public class APIPermissionSet {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new permission set containing all permissions currently
|
* Creates a new permission set containing all permissions currently
|
||||||
* granted to the given user.
|
* granted within the given Permissions object.
|
||||||
*
|
*
|
||||||
* @param user
|
* @param permissions
|
||||||
* The user whose permissions should be stored within this permission
|
* The permissions that should be stored within this permission set.
|
||||||
* set.
|
|
||||||
*
|
*
|
||||||
* @throws GuacamoleException
|
* @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
|
// Add all permissions from the provided user
|
||||||
addSystemPermissions(systemPermissions, user.getSystemPermissions());
|
addSystemPermissions(systemPermissions, permissions.getSystemPermissions());
|
||||||
addObjectPermissions(connectionPermissions, user.getConnectionPermissions());
|
addObjectPermissions(connectionPermissions, permissions.getConnectionPermissions());
|
||||||
addObjectPermissions(connectionGroupPermissions, user.getConnectionGroupPermissions());
|
addObjectPermissions(connectionGroupPermissions, permissions.getConnectionGroupPermissions());
|
||||||
addObjectPermissions(sharingProfilePermissions, user.getSharingProfilePermissions());
|
addObjectPermissions(sharingProfilePermissions, permissions.getSharingProfilePermissions());
|
||||||
addObjectPermissions(activeConnectionPermissions, user.getActiveConnectionPermissions());
|
addObjectPermissions(activeConnectionPermissions, permissions.getActiveConnectionPermissions());
|
||||||
addObjectPermissions(userPermissions, user.getUserPermissions());
|
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
|
* 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
|
* 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.
|
* 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.GuacamoleException;
|
||||||
import org.apache.guacamole.GuacamoleSecurityException;
|
import org.apache.guacamole.GuacamoleSecurityException;
|
||||||
import org.apache.guacamole.net.auth.Directory;
|
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.SharingProfile;
|
||||||
import org.apache.guacamole.net.auth.User;
|
import org.apache.guacamole.net.auth.User;
|
||||||
import org.apache.guacamole.net.auth.UserContext;
|
import org.apache.guacamole.net.auth.UserContext;
|
||||||
@@ -103,11 +104,13 @@ public class SharingProfileResource
|
|||||||
public Map<String, String> getParameters()
|
public Map<String, String> getParameters()
|
||||||
throws GuacamoleException {
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Pull effective permissions
|
||||||
User self = userContext.self();
|
User self = userContext.self();
|
||||||
|
Permissions effective = self.getEffectivePermissions();
|
||||||
|
|
||||||
// Retrieve permission sets
|
// Retrieve permission sets
|
||||||
SystemPermissionSet systemPermissions = self.getSystemPermissions();
|
SystemPermissionSet systemPermissions = effective.getSystemPermissions();
|
||||||
ObjectPermissionSet sharingProfilePermissions = self.getSharingProfilePermissions();
|
ObjectPermissionSet sharingProfilePermissions = effective.getSharingProfilePermissions();
|
||||||
|
|
||||||
// Deny access if adminstrative or update permission is missing
|
// Deny access if adminstrative or update permission is missing
|
||||||
String identifier = sharingProfile.getIdentifier();
|
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.DirectoryObjectResource;
|
||||||
import org.apache.guacamole.rest.directory.DirectoryObjectTranslator;
|
import org.apache.guacamole.rest.directory.DirectoryObjectTranslator;
|
||||||
import org.apache.guacamole.rest.history.APIActivityRecord;
|
import org.apache.guacamole.rest.history.APIActivityRecord;
|
||||||
|
import org.apache.guacamole.rest.permission.APIPermissionSet;
|
||||||
import org.apache.guacamole.rest.permission.PermissionSetResource;
|
import org.apache.guacamole.rest.permission.PermissionSetResource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -181,7 +182,8 @@ public class UserResource
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a resource which abstracts operations available on the overall
|
* 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
|
* @return
|
||||||
* A resource which representing the permissions granted to the User
|
* A resource which representing the permissions granted to the User
|
||||||
@@ -192,4 +194,21 @@ public class UserResource
|
|||||||
return new PermissionSetResource(user);
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -199,7 +199,7 @@ angular.module('manage').controller('manageConnectionController', ['$scope', '$i
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Query the user's permissions for the current connection
|
// Query the user's permissions for the current connection
|
||||||
permissionService.getPermissions($scope.selectedDataSource, authenticationService.getCurrentUsername())
|
permissionService.getEffectivePermissions($scope.selectedDataSource, authenticationService.getCurrentUsername())
|
||||||
.success(function permissionsReceived(permissions) {
|
.success(function permissionsReceived(permissions) {
|
||||||
|
|
||||||
$scope.permissions = permissions;
|
$scope.permissions = permissions;
|
||||||
|
@@ -134,7 +134,7 @@ angular.module('manage').controller('manageConnectionGroupController', ['$scope'
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Query the user's permissions for the current connection group
|
// Query the user's permissions for the current connection group
|
||||||
permissionService.getPermissions($scope.selectedDataSource, authenticationService.getCurrentUsername())
|
permissionService.getEffectivePermissions($scope.selectedDataSource, authenticationService.getCurrentUsername())
|
||||||
.success(function permissionsReceived(permissions) {
|
.success(function permissionsReceived(permissions) {
|
||||||
|
|
||||||
$scope.permissions = permissions;
|
$scope.permissions = permissions;
|
||||||
|
@@ -175,7 +175,7 @@ angular.module('manage').controller('manageSharingProfileController', ['$scope',
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Query the user's permissions for the current sharing profile
|
// Query the user's permissions for the current sharing profile
|
||||||
permissionService.getPermissions($scope.selectedDataSource, authenticationService.getCurrentUsername())
|
permissionService.getEffectivePermissions($scope.selectedDataSource, authenticationService.getCurrentUsername())
|
||||||
.success(function permissionsReceived(permissions) {
|
.success(function permissionsReceived(permissions) {
|
||||||
|
|
||||||
$scope.permissions = permissions;
|
$scope.permissions = permissions;
|
||||||
|
@@ -680,7 +680,7 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto
|
|||||||
|
|
||||||
// Query the user's permissions for the current user
|
// Query the user's permissions for the current user
|
||||||
dataSourceService.apply(
|
dataSourceService.apply(
|
||||||
permissionService.getPermissions,
|
permissionService.getEffectivePermissions,
|
||||||
dataSources,
|
dataSources,
|
||||||
currentUsername
|
currentUsername
|
||||||
)
|
)
|
||||||
|
@@ -329,7 +329,7 @@ angular.module('navigation').factory('userPageService', ['$injector',
|
|||||||
|
|
||||||
// Retrieve current permissions
|
// Retrieve current permissions
|
||||||
dataSourceService.apply(
|
dataSourceService.apply(
|
||||||
permissionService.getPermissions,
|
permissionService.getEffectivePermissions,
|
||||||
authenticationService.getAvailableDataSources(),
|
authenticationService.getAvailableDataSources(),
|
||||||
authenticationService.getCurrentUsername()
|
authenticationService.getCurrentUsername()
|
||||||
)
|
)
|
||||||
@@ -422,7 +422,7 @@ angular.module('navigation').factory('userPageService', ['$injector',
|
|||||||
|
|
||||||
// Retrieve current permissions
|
// Retrieve current permissions
|
||||||
dataSourceService.apply(
|
dataSourceService.apply(
|
||||||
permissionService.getPermissions,
|
permissionService.getEffectivePermissions,
|
||||||
authenticationService.getAvailableDataSources(),
|
authenticationService.getAvailableDataSources(),
|
||||||
authenticationService.getCurrentUsername()
|
authenticationService.getCurrentUsername()
|
||||||
)
|
)
|
||||||
|
@@ -36,8 +36,11 @@ angular.module('rest').factory('permissionService', ['$injector',
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the URL for the REST resource most appropriate for accessing
|
* Returns the URL for the REST resource most appropriate for accessing
|
||||||
* the permissions of the user having the given username.
|
* the effective permissions of the user having the given username.
|
||||||
*
|
* Effective permissions differ from the permissions returned via
|
||||||
|
* getPermissions() in that permissions which are not directly granted to
|
||||||
|
* the user are included.
|
||||||
|
*
|
||||||
* It is important to note that a particular data source can authenticate
|
* It is important to note that a particular data source can authenticate
|
||||||
* and provide permissions for a user, even if that user does not exist
|
* and provide permissions for a user, even if that user does not exist
|
||||||
* within that data source (and thus cannot be found beneath
|
* within that data source (and thus cannot be found beneath
|
||||||
@@ -56,7 +59,7 @@ angular.module('rest').factory('permissionService', ['$injector',
|
|||||||
* The URL for the REST resource representing the user having the given
|
* The URL for the REST resource representing the user having the given
|
||||||
* username.
|
* username.
|
||||||
*/
|
*/
|
||||||
var getPermissionsResourceURL = function getPermissionsResourceURL(dataSource, username) {
|
var getEffectivePermissionsResourceURL = function getEffectivePermissionsResourceURL(dataSource, username) {
|
||||||
|
|
||||||
// Create base URL for data source
|
// Create base URL for data source
|
||||||
var base = 'api/session/data/' + encodeURIComponent(dataSource);
|
var base = 'api/session/data/' + encodeURIComponent(dataSource);
|
||||||
@@ -65,19 +68,21 @@ angular.module('rest').factory('permissionService', ['$injector',
|
|||||||
// user actually existing (they may not). Access their permissions via
|
// user actually existing (they may not). Access their permissions via
|
||||||
// "self" rather than the collection of defined users.
|
// "self" rather than the collection of defined users.
|
||||||
if (username === authenticationService.getCurrentUsername())
|
if (username === authenticationService.getCurrentUsername())
|
||||||
return base + '/self/permissions';
|
return base + '/self/effectivePermissions';
|
||||||
|
|
||||||
// Otherwise, the user must exist for their permissions to be
|
// Otherwise, the user must exist for their permissions to be
|
||||||
// accessible. Use the collection of defined users.
|
// accessible. Use the collection of defined users.
|
||||||
return base + '/users/' + encodeURIComponent(username) + '/permissions';
|
return base + '/users/' + encodeURIComponent(username) + '/effectivePermissions';
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes a request to the REST API to get the list of permissions for a
|
* Makes a request to the REST API to get the list of effective permissions
|
||||||
* given user, returning a promise that provides an array of
|
* for a given user, returning a promise that provides an array of
|
||||||
* @link{Permission} objects if successful.
|
* @link{Permission} objects if successful. Effective permissions differ
|
||||||
*
|
* from the permissions returned via getPermissions() in that permissions
|
||||||
|
* which are not directly granted to the user are included.
|
||||||
|
*
|
||||||
* @param {String} dataSource
|
* @param {String} dataSource
|
||||||
* The unique identifier of the data source containing the user whose
|
* The unique identifier of the data source containing the user whose
|
||||||
* permissions should be retrieved. This identifier corresponds to an
|
* permissions should be retrieved. This identifier corresponds to an
|
||||||
@@ -85,12 +90,12 @@ angular.module('rest').factory('permissionService', ['$injector',
|
|||||||
*
|
*
|
||||||
* @param {String} userID
|
* @param {String} userID
|
||||||
* The ID of the user to retrieve the permissions for.
|
* The ID of the user to retrieve the permissions for.
|
||||||
*
|
*
|
||||||
* @returns {Promise.<PermissionSet>}
|
* @returns {Promise.<PermissionSet>}
|
||||||
* A promise which will resolve with a @link{PermissionSet} upon
|
* A promise which will resolve with a @link{PermissionSet} upon
|
||||||
* success.
|
* success.
|
||||||
*/
|
*/
|
||||||
service.getPermissions = function getPermissions(dataSource, userID) {
|
service.getEffectivePermissions = function getEffectivePermissions(dataSource, userID) {
|
||||||
|
|
||||||
// Build HTTP parameters set
|
// Build HTTP parameters set
|
||||||
var httpParameters = {
|
var httpParameters = {
|
||||||
@@ -101,58 +106,89 @@ angular.module('rest').factory('permissionService', ['$injector',
|
|||||||
return $http({
|
return $http({
|
||||||
cache : cacheService.users,
|
cache : cacheService.users,
|
||||||
method : 'GET',
|
method : 'GET',
|
||||||
url : getPermissionsResourceURL(dataSource, userID),
|
url : getEffectivePermissionsResourceURL(dataSource, userID),
|
||||||
params : httpParameters
|
params : httpParameters
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes a request to the REST API to add permissions for a given user,
|
* Returns the URL for the REST resource most appropriate for accessing
|
||||||
* returning a promise that can be used for processing the results of the
|
* the permissions of the user having the given identifier. The permissions
|
||||||
* call.
|
* retrieved differ from effective permissions (those returned by
|
||||||
|
* getEffectivePermissions()) in that only permissions which are directly
|
||||||
|
* granted to the user are included.
|
||||||
*
|
*
|
||||||
|
* It is important to note that a particular data source can authenticate
|
||||||
|
* and provide permissions for a user, even if that user does not exist
|
||||||
|
* within that data source (and thus cannot be found beneath
|
||||||
|
* "api/session/data/{dataSource}/users")
|
||||||
|
*
|
||||||
* @param {String} dataSource
|
* @param {String} dataSource
|
||||||
* The unique identifier of the data source containing the user whose
|
* The unique identifier of the data source containing the user whose
|
||||||
* permissions should be modified. This identifier corresponds to an
|
* permissions should be retrieved. This identifier corresponds to an
|
||||||
* AuthenticationProvider within the Guacamole web application.
|
* AuthenticationProvider within the Guacamole web application.
|
||||||
*
|
*
|
||||||
* @param {String} userID
|
* @param {String} identifier
|
||||||
* The ID of the user to modify the permissions of.
|
* The identifier of the user for which the URL of the proper REST
|
||||||
*
|
* resource should be derived.
|
||||||
* @param {PermissionSet} permissions
|
*
|
||||||
* The set of permissions to add.
|
* @returns {String}
|
||||||
*
|
* The URL for the REST resource representing the user having the given
|
||||||
* @returns {Promise}
|
* identifier.
|
||||||
* A promise for the HTTP call which will succeed if and only if the
|
|
||||||
* add operation is successful.
|
|
||||||
*/
|
*/
|
||||||
service.addPermissions = function addPermissions(dataSource, userID, permissions) {
|
var getPermissionsResourceURL = function getPermissionsResourceURL(dataSource, identifier) {
|
||||||
return service.patchPermissions(dataSource, userID, permissions, null);
|
|
||||||
|
// Create base URL for data source
|
||||||
|
var base = 'api/session/data/' + encodeURIComponent(dataSource);
|
||||||
|
|
||||||
|
// If the username is that of the current user, do not rely on the
|
||||||
|
// user actually existing (they may not). Access their permissions via
|
||||||
|
// "self" rather than the collection of defined users.
|
||||||
|
if (identifier === authenticationService.getCurrentUsername())
|
||||||
|
return base + '/self/permissions';
|
||||||
|
|
||||||
|
// Otherwise, the user must exist for their permissions to be
|
||||||
|
// accessible. Use the collection of defined users.
|
||||||
|
return base + '/users/' + encodeURIComponent(identifier) + '/permissions';
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes a request to the REST API to remove permissions for a given user,
|
* Makes a request to the REST API to get the list of permissions for a
|
||||||
* returning a promise that can be used for processing the results of the
|
* given user, returning a promise that provides an array of
|
||||||
* call.
|
* @link{Permission} objects if successful. The permissions retrieved
|
||||||
|
* differ from effective permissions (those returned by
|
||||||
|
* getEffectivePermissions()) in that only permissions which are directly
|
||||||
|
* granted to the user included.
|
||||||
*
|
*
|
||||||
* @param {String} dataSource
|
* @param {String} dataSource
|
||||||
* The unique identifier of the data source containing the user whose
|
* The unique identifier of the data source containing the user whose
|
||||||
* permissions should be modified. This identifier corresponds to an
|
* permissions should be retrieved. This identifier corresponds to an
|
||||||
* AuthenticationProvider within the Guacamole web application.
|
* AuthenticationProvider within the Guacamole web application.
|
||||||
*
|
*
|
||||||
* @param {String} userID
|
* @param {String} identifier
|
||||||
* The ID of the user to modify the permissions of.
|
* The identifier of the user to retrieve the permissions for.
|
||||||
*
|
*
|
||||||
* @param {PermissionSet} permissions
|
* @returns {Promise.<PermissionSet>}
|
||||||
* The set of permissions to remove.
|
* A promise which will resolve with a @link{PermissionSet} upon
|
||||||
*
|
* success.
|
||||||
* @returns {Promise}
|
|
||||||
* A promise for the HTTP call which will succeed if and only if the
|
|
||||||
* remove operation is successful.
|
|
||||||
*/
|
*/
|
||||||
service.removePermissions = function removePermissions(dataSource, userID, permissions) {
|
service.getPermissions = function getPermissions(dataSource, identifier) {
|
||||||
return service.patchPermissions(dataSource, userID, null, permissions);
|
|
||||||
|
// Build HTTP parameters set
|
||||||
|
var httpParameters = {
|
||||||
|
token : authenticationService.getCurrentToken()
|
||||||
|
};
|
||||||
|
|
||||||
|
// Retrieve user permissions
|
||||||
|
return $http({
|
||||||
|
cache : cacheService.users,
|
||||||
|
method : 'GET',
|
||||||
|
url : getPermissionsResourceURL(dataSource, identifier),
|
||||||
|
params : httpParameters
|
||||||
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -240,27 +276,30 @@ angular.module('rest').factory('permissionService', ['$injector',
|
|||||||
/**
|
/**
|
||||||
* Makes a request to the REST API to modify the permissions for a given
|
* Makes a request to the REST API to modify the permissions for a given
|
||||||
* user, returning a promise that can be used for processing the results of
|
* user, returning a promise that can be used for processing the results of
|
||||||
* the call.
|
* the call. This request affects only the permissions directly granted to
|
||||||
|
* the user, and may not affect permissions inherited through other means
|
||||||
|
* (effective permissions).
|
||||||
*
|
*
|
||||||
* @param {String} dataSource
|
* @param {String} dataSource
|
||||||
* The unique identifier of the data source containing the user whose
|
* The unique identifier of the data source containing the user whose
|
||||||
* permissions should be modified. This identifier corresponds to an
|
* permissions should be modified. This identifier corresponds to an
|
||||||
* AuthenticationProvider within the Guacamole web application.
|
* AuthenticationProvider within the Guacamole web application.
|
||||||
*
|
*
|
||||||
* @param {String} userID
|
* @param {String} identifier
|
||||||
* The ID of the user to modify the permissions of.
|
* The identifier of the user to modify the permissions of.
|
||||||
*
|
*
|
||||||
* @param {PermissionSet} [permissionsToAdd]
|
* @param {PermissionSet} [permissionsToAdd]
|
||||||
* The set of permissions to add, if any.
|
* The set of permissions to add, if any.
|
||||||
*
|
*
|
||||||
* @param {PermissionSet} [permissionsToRemove]
|
* @param {PermissionSet} [permissionsToRemove]
|
||||||
* The set of permissions to remove, if any.
|
* The set of permissions to remove, if any.
|
||||||
*
|
*
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
* A promise for the HTTP call which will succeed if and only if the
|
* A promise for the HTTP call which will succeed if and only if the
|
||||||
* patch operation is successful.
|
* patch operation is successful.
|
||||||
*/
|
*/
|
||||||
service.patchPermissions = function patchPermissions(dataSource, userID, permissionsToAdd, permissionsToRemove) {
|
service.patchPermissions = function patchPermissions(dataSource, identifier,
|
||||||
|
permissionsToAdd, permissionsToRemove) {
|
||||||
|
|
||||||
var permissionPatch = [];
|
var permissionPatch = [];
|
||||||
|
|
||||||
@@ -278,7 +317,7 @@ angular.module('rest').factory('permissionService', ['$injector',
|
|||||||
// Patch user permissions
|
// Patch user permissions
|
||||||
return $http({
|
return $http({
|
||||||
method : 'PATCH',
|
method : 'PATCH',
|
||||||
url : getPermissionsResourceURL(dataSource, userID),
|
url : getPermissionsResourceURL(dataSource, identifier),
|
||||||
params : httpParameters,
|
params : httpParameters,
|
||||||
data : permissionPatch
|
data : permissionPatch
|
||||||
})
|
})
|
||||||
|
@@ -404,7 +404,7 @@ angular.module('settings').directive('guacSettingsConnections', [function guacSe
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Retrieve current permissions
|
// Retrieve current permissions
|
||||||
permissionService.getPermissions($scope.dataSource, currentUsername)
|
permissionService.getEffectivePermissions($scope.dataSource, currentUsername)
|
||||||
.success(function permissionsRetrieved(permissions) {
|
.success(function permissionsRetrieved(permissions) {
|
||||||
|
|
||||||
// Store retrieved permissions
|
// Store retrieved permissions
|
||||||
|
@@ -185,7 +185,7 @@ angular.module('settings').directive('guacSettingsPreferences', [function guacSe
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Retrieve current permissions
|
// Retrieve current permissions
|
||||||
permissionService.getPermissions(dataSource, username)
|
permissionService.getEffectivePermissions(dataSource, username)
|
||||||
.success(function permissionsRetrieved(permissions) {
|
.success(function permissionsRetrieved(permissions) {
|
||||||
|
|
||||||
// Add action for changing password if permission is granted
|
// Add action for changing password if permission is granted
|
||||||
|
@@ -232,7 +232,7 @@ angular.module('settings').directive('guacSettingsUsers', [function guacSettings
|
|||||||
|
|
||||||
// Retrieve current permissions
|
// Retrieve current permissions
|
||||||
dataSourceService.apply(
|
dataSourceService.apply(
|
||||||
permissionService.getPermissions,
|
permissionService.getEffectivePermissions,
|
||||||
dataSources,
|
dataSources,
|
||||||
currentUsername
|
currentUsername
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user