From 349fc361090e6e3fd2e80d5ac477a3c0e3039dd1 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 26 Oct 2020 23:54:58 -0700 Subject: [PATCH] GUACAMOLE-1021: Refactor MySQL queries to NOT duplicate results across related entities. Previous versions of the MySQL queries relied on permission for each object being granted from exactly one location, thus allowing queries to be narrowed by permission using a simple JOIN. This is no longer the case, as permissions may be inherited from multiple locations (groups). --- .../auth/jdbc/connection/ConnectionMapper.xml | 83 +++++++++------- .../connection/ConnectionRecordMapper.xml | 38 ++++---- .../connectiongroup/ConnectionGroupMapper.xml | 96 +++++++++++-------- .../ConnectionGroupPermissionMapper.xml | 2 +- .../permission/ConnectionPermissionMapper.xml | 2 +- .../SharingProfilePermissionMapper.xml | 2 +- .../permission/UserGroupPermissionMapper.xml | 2 +- .../jdbc/permission/UserPermissionMapper.xml | 2 +- .../sharingprofile/SharingProfileMapper.xml | 57 +++++++---- .../guacamole/auth/jdbc/user/UserMapper.xml | 65 +++++++++---- .../jdbc/user/UserParentUserGroupMapper.xml | 13 ++- .../auth/jdbc/user/UserRecordMapper.xml | 20 ++-- .../auth/jdbc/usergroup/UserGroupMapper.xml | 65 +++++++++---- .../UserGroupMemberUserGroupMapper.xml | 13 ++- .../usergroup/UserGroupMemberUserMapper.xml | 13 ++- .../UserGroupParentUserGroupMapper.xml | 13 ++- 16 files changed, 287 insertions(+), 199 deletions(-) diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml index 391e90d30..d42b47a1f 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionMapper.xml @@ -63,17 +63,38 @@ FROM guacamole_connection - - + + + + @@ -89,16 +110,15 @@ @@ -166,53 +186,50 @@ failover_only, MAX(start_date) AS last_active FROM guacamole_connection - JOIN guacamole_connection_permission ON guacamole_connection_permission.connection_id = guacamole_connection.connection_id LEFT JOIN guacamole_connection_history ON guacamole_connection_history.connection_id = guacamole_connection.connection_id WHERE guacamole_connection.connection_id IN #{identifier,jdbcType=VARCHAR} - AND - - - - - AND permission = 'READ' + AND guacamole_connection.connection_id IN ( + + + + + ) GROUP BY guacamole_connection.connection_id; SELECT primary_connection_id, guacamole_sharing_profile.sharing_profile_id FROM guacamole_sharing_profile - JOIN guacamole_sharing_profile_permission ON guacamole_sharing_profile_permission.sharing_profile_id = guacamole_sharing_profile.sharing_profile_id WHERE primary_connection_id IN #{identifier,jdbcType=VARCHAR} - AND - - - - - AND permission = 'READ'; + AND guacamole_sharing_profile.sharing_profile_id IN ( + + + + + ); SELECT guacamole_connection_attribute.connection_id, attribute_name, attribute_value FROM guacamole_connection_attribute - JOIN guacamole_connection_permission ON guacamole_connection_permission.connection_id = guacamole_connection_attribute.connection_id WHERE guacamole_connection_attribute.connection_id IN #{identifier,jdbcType=VARCHAR} - AND - - - - - AND permission = 'READ'; + AND guacamole_connection_attribute.connection_id IN ( + + + + + ); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml index daeec396f..022ec97b3 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connection/ConnectionRecordMapper.xml @@ -172,31 +172,27 @@ LEFT JOIN guacamole_connection ON guacamole_connection_history.connection_id = guacamole_connection.connection_id LEFT JOIN guacamole_user ON guacamole_connection_history.user_id = guacamole_user.user_id - - JOIN guacamole_connection_permission ON - guacamole_connection_history.connection_id = guacamole_connection_permission.connection_id - AND - - - - - AND guacamole_connection_permission.permission = 'READ' - - - JOIN guacamole_user_permission ON - guacamole_connection_history.user_id = guacamole_user_permission.affected_user_id - AND - - - - - AND guacamole_user_permission.permission = 'READ' - + + guacamole_connection_history.connection_id IN ( + + + + + ) + + + AND guacamole_connection_history.user_id IN ( + + + + + ) + - guacamole_connection_history.connection_id = #{identifier,jdbcType=VARCHAR} + AND guacamole_connection_history.connection_id = #{identifier,jdbcType=VARCHAR} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml index 9addd3c10..7274f79ae 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml @@ -64,17 +64,38 @@ FROM guacamole_connection_group - - + + + + @@ -90,16 +111,15 @@ @@ -163,66 +183,62 @@ max_connections_per_user, enable_session_affinity FROM guacamole_connection_group - JOIN guacamole_connection_group_permission ON guacamole_connection_group_permission.connection_group_id = guacamole_connection_group.connection_group_id WHERE guacamole_connection_group.connection_group_id IN #{identifier,jdbcType=VARCHAR} - AND - - - - - AND permission = 'READ'; + AND guacamole_connection_group.connection_group_id IN ( + + + + + ); SELECT parent_id, guacamole_connection_group.connection_group_id FROM guacamole_connection_group - JOIN guacamole_connection_group_permission ON guacamole_connection_group_permission.connection_group_id = guacamole_connection_group.connection_group_id WHERE parent_id IN #{identifier,jdbcType=VARCHAR} - AND - - - - - AND permission = 'READ'; + AND guacamole_connection_group.connection_group_id IN ( + + + + + ); SELECT parent_id, guacamole_connection.connection_id FROM guacamole_connection - JOIN guacamole_connection_permission ON guacamole_connection_permission.connection_id = guacamole_connection.connection_id WHERE parent_id IN #{identifier,jdbcType=VARCHAR} - AND - - - - - AND permission = 'READ'; + AND guacamole_connection.connection_id IN ( + + + + + ); SELECT guacamole_connection_group_attribute.connection_group_id, attribute_name, attribute_value FROM guacamole_connection_group_attribute - JOIN guacamole_connection_group_permission ON guacamole_connection_group_permission.connection_group_id = guacamole_connection_group_attribute.connection_group_id WHERE guacamole_connection_group_attribute.connection_group_id IN #{identifier,jdbcType=VARCHAR} - AND - - - - - AND permission = 'READ'; + AND guacamole_connection_group_attribute.connection_group_id IN ( + + + + + ); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml index 455f31f14..ad8076c85 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/ConnectionGroupPermissionMapper.xml @@ -34,7 +34,7 @@ - SELECT + SELECT DISTINCT #{entity.entityID,jdbcType=INTEGER} AS entity_id, permission, connection_id diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml index bf8706e36..072e644f4 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/SharingProfilePermissionMapper.xml @@ -34,7 +34,7 @@ - SELECT + SELECT DISTINCT #{entity.entityID,jdbcType=INTEGER} AS entity_id, permission, affected_entity.name AS affected_name diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml index 52c83e3dc..58fba1430 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/permission/UserPermissionMapper.xml @@ -34,7 +34,7 @@ - - + + + + @@ -97,36 +118,34 @@ guacamole_sharing_profile.sharing_profile_name, primary_connection_id FROM guacamole_sharing_profile - JOIN guacamole_sharing_profile_permission ON guacamole_sharing_profile_permission.sharing_profile_id = guacamole_sharing_profile.sharing_profile_id WHERE guacamole_sharing_profile.sharing_profile_id IN #{identifier,jdbcType=VARCHAR} - AND - - - - - AND permission = 'READ'; + AND guacamole_sharing_profile.sharing_profile_id IN ( + + + + + ); SELECT guacamole_sharing_profile_attribute.sharing_profile_id, attribute_name, attribute_value FROM guacamole_sharing_profile_attribute - JOIN guacamole_sharing_profile_permission ON guacamole_sharing_profile_permission.sharing_profile_id = guacamole_sharing_profile_attribute.sharing_profile_id WHERE guacamole_sharing_profile_attribute.sharing_profile_id IN #{identifier,jdbcType=VARCHAR} - AND - - - - - AND permission = 'READ'; + AND guacamole_sharing_profile_attribute.sharing_profile_id IN ( + + + + + ); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml index a27ff1b59..0dcfa2efc 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserMapper.xml @@ -63,20 +63,45 @@ WHERE guacamole_entity.type = 'USER' + + + SELECT DISTINCT guacamole_user_permission.affected_user_id + FROM guacamole_user_permission + WHERE + + + + + + AND permission = 'READ' + + @@ -154,7 +179,6 @@ MAX(start_date) AS last_active FROM guacamole_user JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id - JOIN guacamole_user_permission ON affected_user_id = guacamole_user.user_id LEFT JOIN guacamole_user_history ON guacamole_user_history.user_id = guacamole_user.user_id WHERE guacamole_entity.name IN AND guacamole_entity.type = 'USER' - AND - - - - - AND permission = 'READ' + AND guacamole_user.user_id IN ( + + + + + ) GROUP BY guacamole_user.user_id, guacamole_entity.entity_id; SELECT @@ -177,19 +201,18 @@ FROM guacamole_user_attribute JOIN guacamole_user ON guacamole_user.user_id = guacamole_user_attribute.user_id 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_entity.name IN #{identifier,jdbcType=VARCHAR} AND guacamole_entity.type = 'USER' - AND - - - - - AND permission = 'READ'; + AND guacamole_user.user_id IN ( + + + + + ); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml index 1b0ec4e3b..764213e6d 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserParentUserGroupMapper.xml @@ -40,16 +40,15 @@ FROM guacamole_user_group_member JOIN guacamole_user_group ON guacamole_user_group_member.user_group_id = guacamole_user_group.user_group_id JOIN guacamole_entity ON guacamole_entity.entity_id = guacamole_user_group.entity_id - JOIN guacamole_user_group_permission ON affected_user_group_id = guacamole_user_group.user_group_id WHERE - - - - - + guacamole_user_group.user_group_id IN ( + + + + + ) AND guacamole_user_group_member.member_entity_id = #{parent.entityID,jdbcType=INTEGER} AND guacamole_entity.type = 'USER_GROUP' - AND permission = 'READ' diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml index 46edb96cd..447321a24 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/user/UserRecordMapper.xml @@ -160,21 +160,19 @@ guacamole_user_history.end_date FROM guacamole_user_history - - JOIN guacamole_user_permission ON - guacamole_user_history.user_id = guacamole_user_permission.affected_user_id - AND - - - - - AND guacamole_user_permission.permission = 'READ' - + + + guacamole_connection_history.user_id IN ( + + + + + ) - guacamole_entity.name = #{username,jdbcType=VARCHAR} + AND guacamole_entity.name = #{username,jdbcType=VARCHAR} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml index 37092b4f6..4d68da754 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMapper.xml @@ -49,20 +49,45 @@ WHERE guacamole_entity.type = 'USER_GROUP' + + + SELECT DISTINCT guacamole_user_group_permission.affected_user_group_id + FROM guacamole_user_group_permission + WHERE + + + + + + AND permission = 'READ' + + @@ -110,19 +135,18 @@ disabled FROM guacamole_user_group JOIN guacamole_entity ON guacamole_user_group.entity_id = guacamole_entity.entity_id - JOIN guacamole_user_group_permission ON affected_user_group_id = guacamole_user_group.user_group_id WHERE guacamole_entity.name IN #{identifier,jdbcType=VARCHAR} AND guacamole_entity.type = 'USER_GROUP' - AND - - - - - AND permission = 'READ'; + AND guacamole_user_group.user_group_id IN ( + + + + + ); SELECT guacamole_user_group_attribute.user_group_id, @@ -131,19 +155,18 @@ FROM guacamole_user_group_attribute JOIN guacamole_user_group ON guacamole_user_group.user_group_id = guacamole_user_group_attribute.user_group_id JOIN guacamole_entity ON guacamole_user_group.entity_id = guacamole_entity.entity_id - JOIN guacamole_user_group_permission ON affected_user_group_id = guacamole_user_group.user_group_id WHERE guacamole_entity.name IN #{identifier,jdbcType=VARCHAR} AND guacamole_entity.type = 'USER_GROUP' - AND - - - - - AND permission = 'READ'; + AND guacamole_user_group.user_group_id IN ( + + + + + ); diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml index aedc956c5..bfcd6c647 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserGroupMapper.xml @@ -39,16 +39,15 @@ FROM guacamole_user_group_member JOIN guacamole_entity ON guacamole_entity.entity_id = guacamole_user_group_member.member_entity_id JOIN guacamole_user_group ON guacamole_user_group.entity_id = guacamole_entity.entity_id - JOIN guacamole_user_group_permission ON affected_user_group_id = guacamole_user_group.user_group_id WHERE - - - - - + guacamole_user_group.user_group_id IN ( + + + + + ) AND guacamole_user_group_member.user_group_id = #{parent.objectID,jdbcType=INTEGER} AND guacamole_entity.type = 'USER_GROUP' - AND permission = 'READ' diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml index 9e0820392..609d907f5 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupMemberUserMapper.xml @@ -39,16 +39,15 @@ FROM guacamole_user_group_member JOIN guacamole_entity ON guacamole_entity.entity_id = guacamole_user_group_member.member_entity_id JOIN guacamole_user ON guacamole_user.entity_id = guacamole_entity.entity_id - JOIN guacamole_user_permission ON affected_user_id = guacamole_user.user_id WHERE - - - - - + guacamole_user.user_id IN ( + + + + + ) AND guacamole_user_group_member.user_group_id = #{parent.objectID,jdbcType=INTEGER} AND guacamole_entity.type = 'USER' - AND permission = 'READ' diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml index 4ef3c72ba..9fa81b91e 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/org/apache/guacamole/auth/jdbc/usergroup/UserGroupParentUserGroupMapper.xml @@ -40,16 +40,15 @@ FROM guacamole_user_group_member JOIN guacamole_user_group ON guacamole_user_group_member.user_group_id = guacamole_user_group.user_group_id JOIN guacamole_entity ON guacamole_entity.entity_id = guacamole_user_group.entity_id - JOIN guacamole_user_group_permission ON affected_user_group_id = guacamole_user_group.user_group_id WHERE - - - - - + guacamole_user_group.user_group_id IN ( + + + + + ) AND guacamole_user_group_member.member_entity_id = #{parent.entityID,jdbcType=INTEGER} AND guacamole_entity.type = 'USER_GROUP' - AND permission = 'READ'