GUACAMOLE-220: Detect cycles within recursive query. SQL Server cannot deal with cycles on its own.
Project: http://git-wip-us.apache.org/repos/asf/guacamole-client/repo Commit: http://git-wip-us.apache.org/repos/asf/guacamole-client/commit/8399b252 Tree: http://git-wip-us.apache.org/repos/asf/guacamole-client/tree/8399b252 Diff: http://git-wip-us.apache.org/repos/asf/guacamole-client/diff/8399b252 Branch: refs/heads/master Commit: 8399b252cd335d4d0e4b977cd8613e0fe2ed4a4a Parents: ee35620 Author: Michael Jumper <mjum...@apache.org> Authored: Sun Sep 16 22:33:12 2018 -0700 Committer: Michael Jumper <mjum...@apache.org> Committed: Wed Sep 19 23:56:53 2018 -0700 ---------------------------------------------------------------------- .../apache/guacamole/auth/jdbc/base/EntityMapper.xml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/8399b252/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml ---------------------------------------------------------------------- diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml index f61463a..a13279e 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-sqlserver/src/main/resources/org/apache/guacamole/auth/jdbc/base/EntityMapper.xml @@ -65,9 +65,10 @@ <!-- Select names of all effective groups (including inherited) --> <select id="selectEffectiveGroupIdentifiers" resultType="string"> - WITH [related_entity] ([entity_id]) AS ( + WITH [related_entity] ([entity_id], [path]) AS ( SELECT - [guacamole_user_group].entity_id + [guacamole_user_group].entity_id, + '{' + CAST([guacamole_user_group].entity_id AS VARCHAR(MAX)) + '}' FROM [guacamole_user_group] JOIN [guacamole_user_group_member] ON [guacamole_user_group].user_group_id = [guacamole_user_group_member].user_group_id WHERE @@ -76,7 +77,8 @@ <if test="!effectiveGroups.isEmpty()"> UNION ALL SELECT - [guacamole_entity].entity_id + [guacamole_entity].entity_id, + '{' + CAST([guacamole_entity].entity_id AS VARCHAR(MAX)) + '}' FROM [guacamole_entity] JOIN [guacamole_user_group] ON [guacamole_user_group].entity_id = [guacamole_entity].entity_id WHERE @@ -90,12 +92,14 @@ </if> UNION ALL SELECT - [guacamole_user_group].entity_id + [guacamole_user_group].entity_id, + [related_entity].path + '{' + CAST([guacamole_user_group].entity_id AS VARCHAR(MAX)) + '}' 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 WHERE [guacamole_user_group].disabled = 0 + AND [related_entity].path NOT LIKE '%{' + CAST([guacamole_user_group].entity_id AS VARCHAR(MAX)) + '}%' ) SELECT DISTINCT name FROM [related_entity]