From 14d10fb42abb59515bd58ce04245bd655be3b056 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Fri, 6 Apr 2018 14:10:52 -0700 Subject: [PATCH] GUACAMOLE-220: Inherit from groups even if not determined by database. --- .../ActiveConnectionPermissionService.java | 18 +++-- .../base/ModeledDirectoryObjectMapper.java | 14 +++- .../base/ModeledDirectoryObjectService.java | 6 +- .../jdbc/connection/ConnectionMapper.java | 10 ++- .../connection/ConnectionRecordMapper.java | 9 ++- .../jdbc/connection/ConnectionService.java | 9 ++- .../ConnectionGroupMapper.java | 10 ++- .../ConnectionGroupService.java | 4 +- .../ConnectionGroupPermissionService.java | 6 +- .../ConnectionPermissionService.java | 6 +- .../ModeledObjectPermissionService.java | 15 ++-- .../permission/ModeledPermissionService.java | 5 +- .../permission/ObjectPermissionMapper.java | 22 +++--- .../permission/ObjectPermissionService.java | 23 +++--- .../jdbc/permission/ObjectPermissionSet.java | 25 +++---- .../jdbc/permission/PermissionMapper.java | 11 +-- .../jdbc/permission/PermissionService.java | 24 ++++--- .../SharingProfilePermissionService.java | 6 +- .../permission/SystemPermissionMapper.java | 12 ++-- .../permission/SystemPermissionService.java | 18 ++--- .../jdbc/permission/SystemPermissionSet.java | 23 +++--- .../permission/UserPermissionService.java | 6 +- .../AbstractGuacamoleTunnelService.java | 4 +- .../guacamole/auth/jdbc/user/ModeledUser.java | 52 +++++++++----- .../guacamole/auth/jdbc/user/UserMapper.java | 24 ++++++- .../auth/jdbc/user/UserRecordMapper.java | 9 ++- .../guacamole/auth/jdbc/user/UserService.java | 29 +++++++- .../guacamole/auth/jdbc/base/EntityMapper.xml | 49 +++++++++---- .../auth/jdbc/connection/ConnectionMapper.xml | 55 +++++++------- .../connection/ConnectionRecordMapper.xml | 22 +++--- .../connectiongroup/ConnectionGroupMapper.xml | 66 ++++++++--------- .../ConnectionGroupPermissionMapper.xml | 33 ++++----- .../permission/ConnectionPermissionMapper.xml | 33 ++++----- .../SharingProfilePermissionMapper.xml | 34 ++++----- .../permission/SystemPermissionMapper.xml | 22 +++--- .../jdbc/permission/UserPermissionMapper.xml | 33 ++++----- .../sharingprofile/SharingProfileMapper.xml | 33 ++++----- .../guacamole/auth/jdbc/user/UserMapper.xml | 71 ++++++++++++++----- .../auth/jdbc/user/UserRecordMapper.xml | 11 ++- 39 files changed, 514 insertions(+), 348 deletions(-) diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionPermissionService.java index 405b23761..a0511b8f8 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionPermissionService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionPermissionService.java @@ -59,10 +59,11 @@ public class ActiveConnectionPermissionService @Override public boolean hasPermission(ModeledAuthenticatedUser user, ModeledUser targetUser, ObjectPermission.Type type, - String identifier, boolean inherit) throws GuacamoleException { + String identifier, Set effectiveGroups) throws GuacamoleException { // Retrieve permissions - Set permissions = retrievePermissions(user, targetUser, inherit); + Set permissions = retrievePermissions(user, + targetUser, effectiveGroups); // Permission is granted if retrieved permissions contains the // requested permission @@ -73,7 +74,8 @@ public class ActiveConnectionPermissionService @Override public Set retrievePermissions(ModeledAuthenticatedUser user, - ModeledUser targetUser, boolean inherit) throws GuacamoleException { + ModeledUser targetUser, Set effectiveGroups) + throws GuacamoleException { // Retrieve permissions only if allowed if (canReadPermissions(user, targetUser)) { @@ -109,9 +111,10 @@ public class ActiveConnectionPermissionService @Override public Collection retrieveAccessibleIdentifiers(ModeledAuthenticatedUser user, ModeledUser targetUser, Collection permissionTypes, - Collection identifiers, boolean inherit) throws GuacamoleException { + Collection identifiers, Set effectiveGroups) + throws GuacamoleException { - Set permissions = retrievePermissions(user, targetUser, inherit); + Set permissions = retrievePermissions(user, targetUser, effectiveGroups); Collection accessibleObjects = new ArrayList(permissions.size()); // For each identifier/permission combination @@ -134,11 +137,12 @@ public class ActiveConnectionPermissionService @Override public ObjectPermissionSet getPermissionSet(ModeledAuthenticatedUser user, - ModeledUser targetUser, boolean inherit) throws GuacamoleException { + ModeledUser targetUser, Set effectiveGroups) + throws GuacamoleException { // Create permission set for requested user ActiveConnectionPermissionSet permissionSet = activeConnectionPermissionSetProvider.get(); - permissionSet.init(user, targetUser, inherit); + permissionSet.init(user, targetUser, effectiveGroups); return permissionSet; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectMapper.java index 4431e8f42..8ff0cc1c7 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectMapper.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectMapper.java @@ -57,10 +57,15 @@ public interface ModeledDirectoryObjectMapper { * The user whose permissions should determine whether an identifier * is returned. * + * @param effectiveGroups + * The identifiers of any known effective groups that should be taken + * into account, such as those defined externally to the database. + * * @return * A Set containing all identifiers of all readable objects. */ - Set selectReadableIdentifiers(@Param("user") UserModel user); + Set selectReadableIdentifiers(@Param("user") UserModel user, + @Param("effectiveGroups") Collection effectiveGroups); /** * Selects all objects which have the given identifiers. If an identifier @@ -91,11 +96,16 @@ public interface ModeledDirectoryObjectMapper { * @param identifiers * The identifiers of the objects to return. * + * @param effectiveGroups + * The identifiers of any known effective groups that should be taken + * into account, such as those defined externally to the database. + * * @return * A Collection of all objects having the given identifiers. */ Collection selectReadable(@Param("user") UserModel user, - @Param("identifiers") Collection identifiers); + @Param("identifiers") Collection identifiers, + @Param("effectiveGroups") Collection effectiveGroups); /** * Inserts the given object into the database. If the object already diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectService.java index e87d6649f..edbb67e3e 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectService.java @@ -401,7 +401,8 @@ public abstract class ModeledDirectoryObjectService selectReadableIdentifiersWithin(@Param("user") UserModel user, - @Param("parentIdentifier") String parentIdentifier); + @Param("parentIdentifier") String parentIdentifier, + @Param("effectiveGroups") Collection effectiveGroups); /** * Selects the connection within the given parent group and having the diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.java index 637fd0fed..7380b213b 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.java @@ -102,12 +102,19 @@ public interface ConnectionRecordMapper { * @param limit * The maximum number of records that should be returned. * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. + * * @return * The results of the search performed with the given parameters. */ List searchReadable(@Param("user") UserModel user, @Param("terms") Collection terms, @Param("sortPredicates") List sortPredicates, - @Param("limit") int limit); + @Param("limit") int limit, + @Param("effectiveGroups") Collection effectiveGroups); } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionService.java index 11e37923a..8dcf6f59a 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionService.java @@ -303,7 +303,9 @@ public class ConnectionService extends ModeledChildDirectoryObjectService selectReadableIdentifiersWithin(@Param("user") UserModel user, - @Param("parentIdentifier") String parentIdentifier); + @Param("parentIdentifier") String parentIdentifier, + @Param("effectiveGroups") Collection effectiveGroups); /** * Selects the connection group within the given parent group and having diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupService.java index 34d039cca..01119b92e 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupService.java @@ -223,7 +223,9 @@ public class ConnectionGroupService extends ModeledChildDirectoryObjectService effectiveGroups) + throws GuacamoleException { // Create permission set for requested user ObjectPermissionSet permissionSet = connectionGroupPermissionSetProvider.get(); - permissionSet.init(user, targetUser, inherit); + permissionSet.init(user, targetUser, effectiveGroups); return permissionSet; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionService.java index 19c30c0be..0cc69df17 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionService.java @@ -21,6 +21,7 @@ package org.apache.guacamole.auth.jdbc.permission; import com.google.inject.Inject; import com.google.inject.Provider; +import java.util.Set; import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.auth.jdbc.user.ModeledUser; @@ -51,11 +52,12 @@ public class ConnectionPermissionService extends ModeledObjectPermissionService @Override public ObjectPermissionSet getPermissionSet(ModeledAuthenticatedUser user, - ModeledUser targetUser, boolean inherit) throws GuacamoleException { + ModeledUser targetUser, Set effectiveGroups) + throws GuacamoleException { // Create permission set for requested user ObjectPermissionSet permissionSet = connectionPermissionSetProvider.get(); - permissionSet.init(user, targetUser, inherit); + permissionSet.init(user, targetUser, effectiveGroups); return permissionSet; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledObjectPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledObjectPermissionService.java index b1229ae04..f1105ed60 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledObjectPermissionService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledObjectPermissionService.java @@ -22,6 +22,7 @@ package org.apache.guacamole.auth.jdbc.permission; import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.Set; import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; import org.apache.guacamole.auth.jdbc.user.ModeledUser; import org.apache.guacamole.GuacamoleException; @@ -106,7 +107,7 @@ public abstract class ModeledObjectPermissionService affectedIdentifiers.add(permission.getObjectIdentifier()); // Determine subset of affected identifiers that we have admin access to - ObjectPermissionSet affectedPermissionSet = getPermissionSet(user, user.getUser(), true); + ObjectPermissionSet affectedPermissionSet = getPermissionSet(user, user.getUser(), user.getEffectiveUserGroups()); Collection allowedSubset = affectedPermissionSet.getAccessibleObjects( Collections.singleton(ObjectPermission.Type.ADMINISTER), affectedIdentifiers @@ -157,11 +158,13 @@ public abstract class ModeledObjectPermissionService @Override public boolean hasPermission(ModeledAuthenticatedUser user, ModeledUser targetUser, ObjectPermission.Type type, - String identifier, boolean inherit) throws GuacamoleException { + String identifier, Set effectiveGroups) + throws GuacamoleException { // Retrieve permissions only if allowed if (canReadPermissions(user, targetUser)) - return getPermissionMapper().selectOne(targetUser.getModel(), type, identifier, inherit) != null; + return getPermissionMapper().selectOne(targetUser.getModel(), type, + identifier, effectiveGroups) != null; // User cannot read this user's permissions throw new GuacamoleSecurityException("Permission denied."); @@ -171,7 +174,7 @@ public abstract class ModeledObjectPermissionService @Override public Collection retrieveAccessibleIdentifiers(ModeledAuthenticatedUser user, ModeledUser targetUser, Collection permissions, - Collection identifiers, boolean inherit) + Collection identifiers, Set effectiveGroups) throws GuacamoleException { // Nothing is always accessible @@ -186,7 +189,9 @@ public abstract class ModeledObjectPermissionService return identifiers; // Otherwise, return explicitly-retrievable identifiers - return getPermissionMapper().selectAccessibleIdentifiers(targetUser.getModel(), permissions, identifiers, inherit); + return getPermissionMapper().selectAccessibleIdentifiers( + targetUser.getModel(), permissions, identifiers, + effectiveGroups); } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledPermissionService.java index 4d0fcf61f..dadaea619 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledPermissionService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ModeledPermissionService.java @@ -140,11 +140,12 @@ public abstract class ModeledPermissionService retrievePermissions(ModeledAuthenticatedUser user, - ModeledUser targetUser, boolean inherit) throws GuacamoleException { + ModeledUser targetUser, Set effectiveGroups) + throws GuacamoleException { // Retrieve permissions only if allowed if (canReadPermissions(user, targetUser)) - return getPermissionInstances(getPermissionMapper().select(targetUser.getModel(), inherit)); + return getPermissionInstances(getPermissionMapper().select(targetUser.getModel(), effectiveGroups)); // User cannot read this user's permissions throw new GuacamoleSecurityException("Permission denied."); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionMapper.java index e5efad09c..b6f9801d2 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionMapper.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionMapper.java @@ -43,10 +43,11 @@ public interface ObjectPermissionMapper extends PermissionMapper effectiveGroups); /** * Retrieves the subset of the given identifiers for which the given entity @@ -73,10 +74,11 @@ public interface ObjectPermissionMapper extends PermissionMapper selectAccessibleIdentifiers(@Param("entity") EntityModel entity, @Param("permissions") Collection permissions, @Param("identifiers") Collection identifiers, - @Param("inherit") boolean inherit); + @Param("effectiveGroups") Collection effectiveGroups); } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionService.java index fa1ee2d76..3f39881cb 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionService.java @@ -20,6 +20,7 @@ package org.apache.guacamole.auth.jdbc.permission; import java.util.Collection; +import java.util.Set; import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; import org.apache.guacamole.auth.jdbc.user.ModeledUser; import org.apache.guacamole.GuacamoleException; @@ -50,10 +51,11 @@ public interface ObjectPermissionService * @param identifier * The identifier of the object affected by the permission to return. * - * @param inherit - * Whether permissions inherited through user groups should be taken - * into account. If false, only permissions granted directly will be - * included. + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. * * @return * true if permission of the given type and associated with the given @@ -64,7 +66,7 @@ public interface ObjectPermissionService */ boolean hasPermission(ModeledAuthenticatedUser user, ModeledUser targetUser, ObjectPermission.Type type, - String identifier, boolean inherit) throws GuacamoleException; + String identifier, Set effectiveGroups) throws GuacamoleException; /** * Retrieves the subset of the given identifiers for which the given user @@ -85,10 +87,11 @@ public interface ObjectPermissionService * The identifiers of the objects affected by the permissions being * checked. * - * @param inherit - * Whether permissions inherited through user groups should be taken - * into account. If false, only permissions granted directly will be - * included. + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. * * @return * A collection containing the subset of identifiers for which at least @@ -99,7 +102,7 @@ public interface ObjectPermissionService */ Collection retrieveAccessibleIdentifiers(ModeledAuthenticatedUser user, ModeledUser targetUser, Collection permissions, - Collection identifiers, boolean inherit) + Collection identifiers, Set effectiveGroups) throws GuacamoleException; } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionSet.java index cedb45dd3..c15b1af5b 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionSet.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/ObjectPermissionSet.java @@ -42,11 +42,7 @@ public abstract class ObjectPermissionSet extends RestrictedObject */ private ModeledUser user; - /** - * Whether permissions inherited through user groups should be taken into - * account. If false, only permissions granted directly will be included. - */ - boolean inherit; + private Set effectiveGroups; /** * Creates a new ObjectPermissionSet. The resulting permission set @@ -67,16 +63,17 @@ public abstract class ObjectPermissionSet extends RestrictedObject * @param user * The user to whom the permissions in this set are granted. * - * @param inherit - * Whether permissions inherited through user groups should be taken - * into account. If false, only permissions granted directly will be - * included. + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. */ public void init(ModeledAuthenticatedUser currentUser, ModeledUser user, - boolean inherit) { + Set effectiveGroups) { super.init(currentUser); this.user = user; - this.inherit = inherit; + this.effectiveGroups = effectiveGroups; } /** @@ -91,13 +88,13 @@ public abstract class ObjectPermissionSet extends RestrictedObject @Override public Set getPermissions() throws GuacamoleException { - return getObjectPermissionService().retrievePermissions(getCurrentUser(), user, inherit); + return getObjectPermissionService().retrievePermissions(getCurrentUser(), user, effectiveGroups); } @Override public boolean hasPermission(ObjectPermission.Type permission, String identifier) throws GuacamoleException { - return getObjectPermissionService().hasPermission(getCurrentUser(), user, permission, identifier, inherit); + return getObjectPermissionService().hasPermission(getCurrentUser(), user, permission, identifier, effectiveGroups); } @Override @@ -115,7 +112,7 @@ public abstract class ObjectPermissionSet extends RestrictedObject @Override public Collection getAccessibleObjects(Collection permissions, Collection identifiers) throws GuacamoleException { - return getObjectPermissionService().retrieveAccessibleIdentifiers(getCurrentUser(), user, permissions, identifiers, inherit); + return getObjectPermissionService().retrieveAccessibleIdentifiers(getCurrentUser(), user, permissions, identifiers, effectiveGroups); } @Override diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionMapper.java index 1c2d23b76..edd66f494 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionMapper.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionMapper.java @@ -38,16 +38,17 @@ public interface PermissionMapper { * @param entity * The entity to retrieve permissions for. * - * @param inherit - * Whether permissions inherited through user groups should be taken - * into account. If false, only permissions granted directly will be - * included. + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. * * @return * All permissions associated with the given entity. */ Collection select(@Param("entity") EntityModel entity, - @Param("inherit") boolean inherit); + @Param("effectiveGroups") Collection effectiveGroups); /** * Inserts the given permissions into the database. If any permissions diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionService.java index 6e596346e..3caa5874c 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/PermissionService.java @@ -54,10 +54,11 @@ public interface PermissionService effectiveGroups) + throws GuacamoleException; /** * Retrieves all permissions associated with the given user. @@ -80,10 +82,11 @@ public interface PermissionService retrievePermissions(ModeledAuthenticatedUser user, - ModeledUser targetUser, boolean inherit) throws GuacamoleException; + ModeledUser targetUser, Set effectiveGroups) + throws GuacamoleException; /** * Creates the given permissions within the database. If any permissions diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionService.java index 3cdf9d160..3018b290d 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionService.java @@ -21,6 +21,7 @@ package org.apache.guacamole.auth.jdbc.permission; import com.google.inject.Inject; import com.google.inject.Provider; +import java.util.Set; import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.auth.jdbc.user.ModeledUser; @@ -51,11 +52,12 @@ public class SharingProfilePermissionService extends ModeledObjectPermissionServ @Override public ObjectPermissionSet getPermissionSet(ModeledAuthenticatedUser user, - ModeledUser targetUser, boolean inherit) throws GuacamoleException { + ModeledUser targetUser, Set effectiveGroups) + throws GuacamoleException { // Create permission set for requested user ObjectPermissionSet permissionSet = sharingProfilePermissionSetProvider.get(); - permissionSet.init(user, targetUser, inherit); + permissionSet.init(user, targetUser, effectiveGroups); return permissionSet; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.java index c05f4053a..c676b72b1 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.java @@ -19,6 +19,7 @@ package org.apache.guacamole.auth.jdbc.permission; +import java.util.Collection; import org.apache.guacamole.auth.jdbc.base.EntityModel; import org.apache.ibatis.annotations.Param; import org.apache.guacamole.net.auth.permission.SystemPermission; @@ -38,10 +39,11 @@ public interface SystemPermissionMapper extends PermissionMapper effectiveGroups); } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionService.java index 59095690f..b534ad3fa 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionService.java @@ -22,6 +22,7 @@ package org.apache.guacamole.auth.jdbc.permission; import com.google.inject.Inject; import com.google.inject.Provider; import java.util.Collection; +import java.util.Set; import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; import org.apache.guacamole.auth.jdbc.user.ModeledUser; import org.apache.guacamole.GuacamoleException; @@ -75,11 +76,11 @@ public class SystemPermissionService @Override public SystemPermissionSet getPermissionSet(ModeledAuthenticatedUser user, - ModeledUser targetUser, boolean inherit) throws GuacamoleException { + ModeledUser targetUser, Set effectiveGroups) throws GuacamoleException { // Create permission set for requested user SystemPermissionSet permissionSet = systemPermissionSetProvider.get(); - permissionSet.init(user, targetUser, inherit); + permissionSet.init(user, targetUser, effectiveGroups); return permissionSet; @@ -136,10 +137,11 @@ public class SystemPermissionService * @param type * The type of permission to retrieve. * - * @param inherit - * Whether permissions inherited through user groups should be taken - * into account. If false, only permissions granted directly will be - * included. + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. * * @return * true if permission of the given type has been granted to the given @@ -150,11 +152,11 @@ public class SystemPermissionService */ public boolean hasPermission(ModeledAuthenticatedUser user, ModeledUser targetUser, SystemPermission.Type type, - boolean inherit) throws GuacamoleException { + Set effectiveGroups) throws GuacamoleException { // Retrieve permissions only if allowed if (canReadPermissions(user, targetUser)) - return getPermissionMapper().selectOne(targetUser.getModel(), type, inherit) != null; + return getPermissionMapper().selectOne(targetUser.getModel(), type, effectiveGroups) != null; // User cannot read this user's permissions throw new GuacamoleSecurityException("Permission denied."); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionSet.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionSet.java index bb5af1185..dd8887901 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionSet.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/SystemPermissionSet.java @@ -42,11 +42,7 @@ public class SystemPermissionSet extends RestrictedObject */ private ModeledUser user; - /** - * Whether permissions inherited through user groups should be taken into - * account. If false, only permissions granted directly will be included. - */ - private boolean inherit; + private Set effectiveGroups; /** * Service for reading and manipulating system permissions. @@ -73,27 +69,28 @@ public class SystemPermissionSet extends RestrictedObject * @param user * The user to whom the permissions in this set are granted. * - * @param inherit - * Whether permissions inherited through user groups should be taken - * into account. If false, only permissions granted directly will be - * included. + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. */ public void init(ModeledAuthenticatedUser currentUser, ModeledUser user, - boolean inherit) { + Set effectiveGroups) { super.init(currentUser); this.user = user; - this.inherit = inherit; + this.effectiveGroups = effectiveGroups; } @Override public Set getPermissions() throws GuacamoleException { - return systemPermissionService.retrievePermissions(getCurrentUser(), user, inherit); + return systemPermissionService.retrievePermissions(getCurrentUser(), user, effectiveGroups); } @Override public boolean hasPermission(SystemPermission.Type permission) throws GuacamoleException { - return systemPermissionService.hasPermission(getCurrentUser(), user, permission, inherit); + return systemPermissionService.hasPermission(getCurrentUser(), user, permission, effectiveGroups); } @Override diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionService.java index 8e6586257..fabbf72fd 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/permission/UserPermissionService.java @@ -21,6 +21,7 @@ package org.apache.guacamole.auth.jdbc.permission; import com.google.inject.Inject; import com.google.inject.Provider; +import java.util.Set; import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.auth.jdbc.user.ModeledUser; @@ -51,11 +52,12 @@ public class UserPermissionService extends ModeledObjectPermissionService { @Override public ObjectPermissionSet getPermissionSet(ModeledAuthenticatedUser user, - ModeledUser targetUser, boolean inherit) throws GuacamoleException { + ModeledUser targetUser, Set effectiveGroups) + throws GuacamoleException { // Create permission set for requested user ObjectPermissionSet permissionSet = userPermissionSetProvider.get(); - permissionSet.init(user, targetUser, inherit); + permissionSet.init(user, targetUser, effectiveGroups); return permissionSet; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/AbstractGuacamoleTunnelService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/AbstractGuacamoleTunnelService.java index fe3a45b2f..5f7fc1ba3 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/AbstractGuacamoleTunnelService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/tunnel/AbstractGuacamoleTunnelService.java @@ -628,7 +628,9 @@ public abstract class AbstractGuacamoleTunnelService implements GuacamoleTunnelS identifiers.add(record.getConnection().getIdentifier()); // Produce collection of readable connection identifiers - Collection connections = connectionMapper.selectReadable(user.getUser().getModel(), identifiers); + Collection connections = + connectionMapper.selectReadable(user.getUser().getModel(), + identifiers, user.getEffectiveUserGroups()); // Ensure set contains only identifiers of readable connections identifiers.clear(); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java index 0628d7499..0bb199e23 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java @@ -351,37 +351,43 @@ public class ModeledUser extends ModeledDirectoryObject implements Us @Override public SystemPermissionSet getSystemPermissions() throws GuacamoleException { - return systemPermissionService.getPermissionSet(getCurrentUser(), this, false); + return systemPermissionService.getPermissionSet(getCurrentUser(), this, + Collections.emptySet()); } @Override public ObjectPermissionSet getConnectionPermissions() throws GuacamoleException { - return connectionPermissionService.getPermissionSet(getCurrentUser(), this, false); + return connectionPermissionService.getPermissionSet(getCurrentUser(), + this, Collections.emptySet()); } @Override public ObjectPermissionSet getConnectionGroupPermissions() throws GuacamoleException { - return connectionGroupPermissionService.getPermissionSet(getCurrentUser(), this, false); + return connectionGroupPermissionService.getPermissionSet( + getCurrentUser(), this, Collections.emptySet()); } @Override public ObjectPermissionSet getSharingProfilePermissions() throws GuacamoleException { - return sharingProfilePermissionService.getPermissionSet(getCurrentUser(), this, false); + return sharingProfilePermissionService.getPermissionSet( + getCurrentUser(), this, Collections.emptySet()); } @Override public ObjectPermissionSet getActiveConnectionPermissions() throws GuacamoleException { - return activeConnectionPermissionService.getPermissionSet(getCurrentUser(), this, false); + return activeConnectionPermissionService.getPermissionSet( + getCurrentUser(), this, Collections.emptySet()); } @Override public ObjectPermissionSet getUserPermissions() throws GuacamoleException { - return userPermissionService.getPermissionSet(getCurrentUser(), this, false); + return userPermissionService.getPermissionSet(getCurrentUser(), this, + Collections.emptySet()); } @Override @@ -864,50 +870,64 @@ public class ModeledUser extends ModeledDirectoryObject implements Us * apply to this user. */ public Set getEffectiveUserGroups() { - - // FIXME: STUB - return /*retrieveEffectiveIdentifiers(this, */Collections.emptySet()/*)*/; - + return userService.retrieveEffectiveGroups(this, + Collections.emptySet()); } @Override public Permissions getEffectivePermissions() throws GuacamoleException { + + final ModeledAuthenticatedUser authenticatedUser = getCurrentUser(); + final Set effectiveGroups; + + // If this user is the currently-authenticated user, include any + // additional effective groups declared by the authentication system + if (authenticatedUser.getIdentifier().equals(getIdentifier())) + effectiveGroups = userService.retrieveEffectiveGroups(this, + authenticatedUser.getEffectiveUserGroups()); + + // Otherwise, just include effective groups from the database + else + effectiveGroups = getEffectiveUserGroups(); + + // Return a permissions object which describes all effective + // permissions, including any permissions inherited via user groups return new Permissions() { @Override public ObjectPermissionSet getActiveConnectionPermissions() throws GuacamoleException { - return activeConnectionPermissionService.getPermissionSet(getCurrentUser(), ModeledUser.this, true); + return activeConnectionPermissionService.getPermissionSet(authenticatedUser, ModeledUser.this, effectiveGroups); } @Override public ObjectPermissionSet getConnectionGroupPermissions() throws GuacamoleException { - return connectionGroupPermissionService.getPermissionSet(getCurrentUser(), ModeledUser.this, true); + return connectionGroupPermissionService.getPermissionSet(authenticatedUser, ModeledUser.this, effectiveGroups); } @Override public ObjectPermissionSet getConnectionPermissions() throws GuacamoleException { - return connectionPermissionService.getPermissionSet(getCurrentUser(), ModeledUser.this, true); + return connectionPermissionService.getPermissionSet(authenticatedUser, ModeledUser.this, effectiveGroups); } @Override public ObjectPermissionSet getSharingProfilePermissions() throws GuacamoleException { - return sharingProfilePermissionService.getPermissionSet(getCurrentUser(), ModeledUser.this, true); + return sharingProfilePermissionService.getPermissionSet(authenticatedUser, ModeledUser.this, effectiveGroups); } @Override public SystemPermissionSet getSystemPermissions() throws GuacamoleException { - return systemPermissionService.getPermissionSet(getCurrentUser(), ModeledUser.this, true); + return systemPermissionService.getPermissionSet(authenticatedUser, ModeledUser.this, effectiveGroups); } @Override public ObjectPermissionSet getUserPermissions() throws GuacamoleException { - return userPermissionService.getPermissionSet(getCurrentUser(), ModeledUser.this, true); + return userPermissionService.getPermissionSet(authenticatedUser, ModeledUser.this, effectiveGroups); } @Override diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserMapper.java index 251445b62..6b5110560 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserMapper.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserMapper.java @@ -19,6 +19,8 @@ package org.apache.guacamole.auth.jdbc.user; +import java.util.Collection; +import java.util.Set; import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; import org.apache.ibatis.annotations.Param; @@ -38,5 +40,25 @@ public interface UserMapper extends ModeledDirectoryObjectMapper { * The user having the given username, or null if no such user exists. */ UserModel selectOne(@Param("username") String username); - + + /** + * Returns the set of all group identifiers of which the given user is a + * member, taking into account the given collection of known group + * memberships which are not necessarily defined within the database. + * + * @param user + * The user whose effective groups should be returned. + * + * @param effectiveGroups + * The identifiers of any known effective groups that should be taken + * into account, such as those defined externally to the database. + * + * @return + * The set of identifiers of all groups that the given user is a + * member of, including those where membership is inherited through + * membership in other groups. + */ + Set selectEffectiveGroupIdentifiers(@Param("user") UserModel user, + @Param("effectiveGroups") Collection effectiveGroups); + } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.java index b2177bf1f..92501ab0b 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.java @@ -113,12 +113,19 @@ public interface UserRecordMapper { * @param limit * The maximum number of records that should be returned. * + * @param effectiveGroups + * The identifiers of all groups that should be taken into account + * when determining the permissions effectively granted to the user. If + * no groups are given, only permissions directly granted to the user + * will be used. + * * @return * The results of the search performed with the given parameters. */ List searchReadable(@Param("user") UserModel user, @Param("terms") Collection terms, @Param("sortPredicates") List sortPredicates, - @Param("limit") int limit); + @Param("limit") int limit, + @Param("effectiveGroups") Collection effectiveGroups); } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserService.java index 2c70e2201..6d89125a9 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/UserService.java @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.apache.guacamole.net.auth.Credentials; import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper; @@ -591,11 +592,37 @@ public class UserService extends ModeledDirectoryObjectService retrieveEffectiveGroups(ModeledUser user, + Collection effectiveGroups) { + return userMapper.selectEffectiveGroupIdentifiers(user.getModel(), effectiveGroups); + } } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml index dd262d1e9..01830d759 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml @@ -23,21 +23,40 @@ - - - ${entityID} - - WITH RECURSIVE related_entity(entity_id) AS ( - VALUES (${entityID}) - UNION - SELECT guacamole_user_group.entity_id - FROM related_entity - JOIN guacamole_user_group_member ON related_entity.entity_id = guacamole_user_group_member.member_entity_id - JOIN guacamole_user_group ON guacamole_user_group.user_group_id = guacamole_user_group_member.user_group_id - ) - SELECT entity_id FROM related_entity - + + + ( + ${column} = ${entityID} + + OR ${column} IN ( + SELECT entity_id + FROM guacamole_entity + WHERE + type = 'USER_GROUP'::guacamole_entity_type + AND name IN + + #{effectiveGroup,jdbcType=VARCHAR} + + ) + + ) diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml index 94855e168..859cec53e 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml @@ -68,12 +68,11 @@ SELECT connection_id FROM guacamole_connection_permission WHERE - entity_id IN ( - - - - - ) + + + + + AND permission = 'READ' @@ -94,12 +93,11 @@ WHERE parent_id = #{parentIdentifier,jdbcType=INTEGER}::integer parent_id IS NULL - AND entity_id IN ( - - - - - ) + AND + + + + AND permission = 'READ' @@ -175,12 +173,11 @@ open="(" separator="," close=")"> #{identifier,jdbcType=INTEGER}::integer - AND guacamole_connection_permission.entity_id IN ( - - - - - ) + AND + + + + AND permission = 'READ' GROUP BY guacamole_connection.connection_id; @@ -192,12 +189,11 @@ open="(" separator="," close=")"> #{identifier,jdbcType=INTEGER}::integer - AND entity_id IN ( - - - - - ) + AND + + + + AND permission = 'READ'; SELECT @@ -211,12 +207,11 @@ open="(" separator="," close=")"> #{identifier,jdbcType=INTEGER}::integer - AND entity_id IN ( - - - - - ) + AND + + + + AND permission = 'READ'; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml index b04c9ca6f..e8e88764b 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml @@ -166,23 +166,21 @@ JOIN guacamole_connection_permission ON guacamole_connection_history.connection_id = guacamole_connection_permission.connection_id - AND guacamole_connection_permission.entity_id IN ( - - - - - ) + AND + + + + AND guacamole_connection_permission.permission = 'READ' JOIN guacamole_user_permission ON guacamole_connection_history.user_id = guacamole_user_permission.affected_user_id - AND guacamole_user_permission.entity_id IN ( - - - - - ) + AND + + + + AND guacamole_user_permission.permission = 'READ' diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml index ffca72d25..37841dee2 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml @@ -69,12 +69,11 @@ SELECT connection_group_id FROM guacamole_connection_group_permission WHERE - entity_id IN ( - - - - - ) + + + + + AND permission = 'READ' @@ -95,12 +94,11 @@ WHERE parent_id = #{parentIdentifier,jdbcType=INTEGER}::integer parent_id IS NULL - AND entity_id IN ( - - - - - ) + AND + + + + AND permission = 'READ' @@ -171,12 +169,11 @@ open="(" separator="," close=")"> #{identifier,jdbcType=INTEGER}::integer - AND entity_id IN ( - - - - - ) + AND + + + + AND permission = 'READ'; SELECT parent_id, guacamole_connection_group.connection_group_id @@ -187,12 +184,11 @@ open="(" separator="," close=")"> #{identifier,jdbcType=INTEGER}::integer - AND entity_id IN ( - - - - - ) + AND + + + + AND permission = 'READ'; SELECT parent_id, guacamole_connection.connection_id @@ -203,12 +199,11 @@ open="(" separator="," close=")"> #{identifier,jdbcType=INTEGER}::integer - AND entity_id IN ( - - - - - ) + AND + + + + AND permission = 'READ'; SELECT @@ -222,12 +217,11 @@ open="(" separator="," close=")"> #{identifier,jdbcType=INTEGER}::integer - AND entity_id IN ( - - - - - ) + AND + + + + AND permission = 'READ'; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml index a21b7d5b7..4ce168d4d 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml @@ -40,12 +40,11 @@ connection_group_id FROM guacamole_connection_group_permission WHERE - entity_id IN ( - - - - - ) + + + + + @@ -58,12 +57,11 @@ connection_group_id FROM guacamole_connection_group_permission WHERE - entity_id IN ( - - - - - ) + + + + + AND permission = #{type,jdbcType=VARCHAR}::guacamole_object_permission_type AND connection_group_id = #{identifier,jdbcType=INTEGER}::integer @@ -75,12 +73,11 @@ SELECT DISTINCT connection_group_id FROM guacamole_connection_group_permission WHERE - entity_id IN ( - - - - - ) + + + + + AND connection_group_id IN diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml index 5d911de4e..68968d744 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionPermissionMapper.xml @@ -40,12 +40,11 @@ connection_id FROM guacamole_connection_permission WHERE - entity_id IN ( - - - - - ) + + + + + @@ -58,12 +57,11 @@ connection_id FROM guacamole_connection_permission WHERE - entity_id IN ( - - - - - ) + + + + + AND permission = #{type,jdbcType=VARCHAR}::guacamole_object_permission_type AND connection_id = #{identifier,jdbcType=INTEGER}::integer @@ -75,12 +73,11 @@ SELECT DISTINCT connection_id FROM guacamole_connection_permission WHERE - entity_id IN ( - - - - - ) + + + + + AND connection_id IN diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml index 68b3032f7..4594c05eb 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml @@ -40,13 +40,11 @@ sharing_profile_id FROM guacamole_sharing_profile_permission WHERE - entity_id IN ( - - - - - ) - + + + + + @@ -59,12 +57,11 @@ sharing_profile_id FROM guacamole_sharing_profile_permission WHERE - entity_id IN ( - - - - - ) + + + + + AND permission = #{type,jdbcType=VARCHAR}::guacamole_object_permission_type AND sharing_profile_id = #{identifier,jdbcType=INTEGER}::integer @@ -76,12 +73,11 @@ SELECT DISTINCT sharing_profile_id FROM guacamole_sharing_profile_permission WHERE - entity_id IN ( - - - - - ) + + + + + AND sharing_profile_id IN diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml index 25ebf97ff..ae86302ed 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SystemPermissionMapper.xml @@ -38,12 +38,11 @@ permission FROM guacamole_system_permission WHERE - entity_id IN ( - - - - - ) + + + + + @@ -55,12 +54,11 @@ permission FROM guacamole_system_permission WHERE - entity_id IN ( - - - - - ) + + + + + AND permission = #{type,jdbcType=VARCHAR}::guacamole_system_permission_type diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml index e5a844afb..bd3ff934e 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml @@ -42,12 +42,11 @@ JOIN guacamole_user affected_user ON guacamole_user_permission.affected_user_id = affected_user.user_id JOIN guacamole_entity affected_entity ON affected_user.entity_id = affected_entity.entity_id WHERE - guacamole_user_permission.entity_id IN ( - - - - - ) + + + + + AND affected_entity.type = 'USER'::guacamole_entity_type @@ -63,12 +62,11 @@ JOIN guacamole_user affected_user ON guacamole_user_permission.affected_user_id = affected_user.user_id JOIN guacamole_entity affected_entity ON affected_user.entity_id = affected_entity.entity_id WHERE - guacamole_user_permission.entity_id IN ( - - - - - ) + + + + + AND permission = #{type,jdbcType=VARCHAR}::guacamole_object_permission_type AND affected_entity.name = #{identifier,jdbcType=VARCHAR} AND affected_entity.type = 'USER'::guacamole_entity_type @@ -83,12 +81,11 @@ JOIN guacamole_user affected_user ON guacamole_user_permission.affected_user_id = affected_user.user_id JOIN guacamole_entity affected_entity ON affected_user.entity_id = affected_entity.entity_id WHERE - guacamole_user_permission.entity_id IN ( - - - - - ) + + + + + AND affected_entity.name IN diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml index febf54078..62548d7ce 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/sharingprofile/SharingProfileMapper.xml @@ -52,12 +52,11 @@ SELECT sharing_profile_id FROM guacamole_sharing_profile_permission WHERE - entity_id IN ( - - - - - ) + + + + + AND permission = 'READ' @@ -104,12 +103,11 @@ open="(" separator="," close=")"> #{identifier,jdbcType=INTEGER}::integer - AND entity_id IN ( - - - - - ) + AND + + + + AND permission = 'READ'; SELECT @@ -123,12 +121,11 @@ open="(" separator="," close=")"> #{identifier,jdbcType=INTEGER}::integer - AND entity_id IN ( - - - - - ) + AND + + + + AND permission = 'READ'; diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml index 654351fe5..25d7659a2 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml @@ -70,16 +70,53 @@ JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id JOIN guacamole_user_permission ON affected_user_id = guacamole_user.user_id WHERE - guacamole_user_permission.entity_id IN ( - - - - - ) + + + + + AND guacamole_entity.type = 'USER'::guacamole_entity_type AND permission = 'READ' + + + diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml index 862e2d719..6311a2546 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml @@ -156,12 +156,11 @@ JOIN guacamole_user_permission ON guacamole_user_history.user_id = guacamole_user_permission.affected_user_id - AND guacamole_user_permission.entity_id IN ( - - - - - ) + AND + + + + AND guacamole_user_permission.permission = 'READ'