mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-07 13:41:21 +00:00
GUACAMOLE-1239: Update JDBC queries to handle case-sensitivity.
This commit is contained in:
@@ -402,11 +402,14 @@ public class PostgreSQLEnvironment extends JDBCEnvironment {
|
||||
@Override
|
||||
public boolean getCaseSensitiveUsernames() throws GuacamoleException {
|
||||
|
||||
// By default, PostgreSQL does use case-sensitive string searches, so
|
||||
// we will honor case-sensitive usernames.
|
||||
// By default, PostgreSQL does perform case-sensitive string comparisons.
|
||||
// Even though usernames are generally not case-sensitive across
|
||||
// most authenticaiton systems, we've elected to maintain case-
|
||||
// sensitivity in this module in order to avoid surprising anyone who
|
||||
// may be relying upon it.
|
||||
return getProperty(
|
||||
PostgreSQLGuacamoleProperties.POSTGRESQL_CASE_SENSITIVE_USERNAMES,
|
||||
true
|
||||
super.getCaseSensitiveUsernames()
|
||||
);
|
||||
|
||||
}
|
||||
|
@@ -316,8 +316,8 @@ public class PostgreSQLGuacamoleProperties {
|
||||
};
|
||||
|
||||
/**
|
||||
* A property that configures whether or not usernames should be treated as
|
||||
* case-sensitive with the Postgres JDBC backend.
|
||||
* A property used to configure whether or not usernames within the Postgres
|
||||
* JDBC module should be treated as case-sensitive.
|
||||
*/
|
||||
public static final BooleanGuacamoleProperty POSTGRESQL_CASE_SENSITIVE_USERNAMES =
|
||||
new BooleanGuacamoleProperty() {
|
||||
|
@@ -61,7 +61,14 @@
|
||||
(SELECT user_id FROM guacamole_user
|
||||
JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id
|
||||
WHERE
|
||||
guacamole_entity.name = #{record.username,jdbcType=VARCHAR}
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_entity.name = #{record.username,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_entity.name) = LOWER(#{record.username,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type),
|
||||
#{record.username,jdbcType=VARCHAR},
|
||||
#{record.startDate,jdbcType=TIMESTAMP},
|
||||
@@ -110,7 +117,15 @@
|
||||
guacamole_connection_history.user_id IN (
|
||||
SELECT user_id
|
||||
FROM guacamole_user
|
||||
WHERE POSITION(#{term.term,jdbcType=VARCHAR} IN username) > 0
|
||||
WHERE
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
POSITION(#{term.term,jdbcType=VARCHAR} IN username) > 0
|
||||
</when>
|
||||
<otherwise>
|
||||
POSITION(LOWER(#{term.term,jdbcType=VARCHAR}) IN LOWER(username)) > 0
|
||||
</otherwise>
|
||||
</choose>
|
||||
)
|
||||
|
||||
OR guacamole_connection_history.connection_id IN (
|
||||
@@ -198,7 +213,14 @@
|
||||
FROM guacamole_user
|
||||
JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id
|
||||
WHERE
|
||||
POSITION(#{term.term,jdbcType=VARCHAR} IN guacamole_entity.name) > 0
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
POSITION(#{term.term,jdbcType=VARCHAR} IN guacamole_entity.name) > 0
|
||||
</when>
|
||||
<otherwise>
|
||||
POSITION(LOWER(#{term.term,jdbcType=VARCHAR}) IN LOWER(guacamole_entity.name)) > 0
|
||||
</otherwise>
|
||||
</choose>
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type
|
||||
)
|
||||
|
||||
|
@@ -28,7 +28,7 @@
|
||||
<result column="entity_id" property="entityID" jdbcType="INTEGER"/>
|
||||
<result column="permission" property="type" jdbcType="VARCHAR"
|
||||
javaType="org.apache.guacamole.net.auth.permission.ObjectPermission$Type"/>
|
||||
<result column="affected_name" property="objectIdentifier" jdbcType="INTEGER"/>
|
||||
<result column="affected_name" property="objectIdentifier" jdbcType="VARCHAR"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- Select all permissions for a given entity -->
|
||||
@@ -68,7 +68,16 @@
|
||||
<property name="groups" value="effectiveGroups"/>
|
||||
</include>
|
||||
AND permission = #{type,jdbcType=VARCHAR}::guacamole_object_permission_type
|
||||
AND affected_entity.name = #{identifier,jdbcType=VARCHAR}
|
||||
AND
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
affected_entity.name = #{identifier,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(affected_entity.name) = LOWER(#{identifier,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
|
||||
AND affected_entity.type = 'USER'::guacamole_entity_type
|
||||
|
||||
</select>
|
||||
@@ -86,11 +95,23 @@
|
||||
<property name="entityID" value="#{entity.entityID,jdbcType=INTEGER}"/>
|
||||
<property name="groups" value="effectiveGroups"/>
|
||||
</include>
|
||||
AND affected_entity.name IN
|
||||
<foreach collection="identifiers" item="identifier"
|
||||
AND
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
affected_entity.name IN
|
||||
<foreach collection="identifiers" item="identifier"
|
||||
open="(" separator="," close=")">
|
||||
#{identifier,jdbcType=VARCHAR}
|
||||
</foreach>
|
||||
#{identifier,jdbcType=VARCHAR}
|
||||
</foreach>
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(affected_entity.name) IN
|
||||
<foreach collection="identifiers" item="identifier"
|
||||
open="(" separator="," close=")">
|
||||
LOWER(#{identifier,jdbcType=VARCHAR})
|
||||
</foreach>
|
||||
</otherwise>
|
||||
</choose>
|
||||
AND permission IN
|
||||
<foreach collection="permissions" item="permission"
|
||||
open="(" separator="," close=")">
|
||||
@@ -108,13 +129,26 @@
|
||||
WHERE
|
||||
guacamole_user_permission.affected_user_id = affected_user.user_id
|
||||
AND affected_user.entity_id = affected_entity.entity_id
|
||||
AND (guacamole_user_permission.entity_id, permission, affected_entity.name) IN
|
||||
<foreach collection="permissions" item="permission"
|
||||
open="(" separator="," close=")">
|
||||
(#{permission.entityID,jdbcType=INTEGER},
|
||||
#{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type,
|
||||
#{permission.objectIdentifier,jdbcType=INTEGER})
|
||||
</foreach>
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
AND (guacamole_user_permission.entity_id, permission, affected_entity.name) IN
|
||||
<foreach collection="permissions" item="permission"
|
||||
open="(" separator="," close=")">
|
||||
(#{permission.entityID,jdbcType=INTEGER},
|
||||
#{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type,
|
||||
#{permission.objectIdentifier,jdbcType=VARCHAR})
|
||||
</foreach>
|
||||
</when>
|
||||
<otherwise>
|
||||
AND (guacamole_user_permission.entity_id, permission, LOWER(affected_entity.name)) IN
|
||||
<foreach collection="permissions" item="permission"
|
||||
open="(" separator="," close=")">
|
||||
(#{permission.entityID,jdbcType=INTEGER},
|
||||
#{permission.type,jdbcType=VARCHAR}::guacamole_object_permission_type,
|
||||
LOWER(#{permission.objectIdentifier,jdbcType=VARCHAR}))
|
||||
</foreach>
|
||||
</otherwise>
|
||||
</choose>
|
||||
AND affected_entity.type = 'USER'::guacamole_entity_type
|
||||
|
||||
</delete>
|
||||
@@ -140,7 +174,14 @@
|
||||
</foreach>
|
||||
AS permissions
|
||||
JOIN guacamole_entity affected_entity ON
|
||||
affected_entity.name = permissions.affected_name
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
affected_entity.name = permissions.affected_name
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(affected_entity.name) = LOWER(permissions.affected_name)
|
||||
</otherwise>
|
||||
</choose>
|
||||
AND affected_entity.type = 'USER'::guacamole_entity_type
|
||||
JOIN guacamole_user affected_user ON affected_user.entity_id = affected_entity.entity_id
|
||||
WHERE (permissions.entity_id, permissions.permission, affected_user.user_id) NOT IN (
|
||||
|
@@ -43,7 +43,14 @@
|
||||
JOIN guacamole_user ON guacamole_user_password_history.user_id = guacamole_user.user_id
|
||||
JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id
|
||||
WHERE
|
||||
guacamole_entity.name = #{username,jdbcType=VARCHAR}
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_entity.name = #{username,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_entity.name) = LOWER(#{username,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
ORDER BY
|
||||
guacamole_user_password_history.password_date DESC
|
||||
LIMIT #{maxHistorySize}
|
||||
|
@@ -130,10 +130,26 @@
|
||||
FROM guacamole_user
|
||||
JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id
|
||||
LEFT JOIN guacamole_user_history ON guacamole_user_history.user_id = guacamole_user.user_id
|
||||
WHERE guacamole_entity.name IN
|
||||
WHERE
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_entity.name
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_entity.name)
|
||||
</otherwise>
|
||||
</choose>
|
||||
IN
|
||||
<foreach collection="identifiers" item="identifier"
|
||||
open="(" separator="," close=")">
|
||||
#{identifier,jdbcType=VARCHAR}
|
||||
open="(" separator="," close=")">
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
#{identifier,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(#{identifier,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
</foreach>
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type
|
||||
GROUP BY guacamole_user.user_id, guacamole_entity.entity_id;
|
||||
@@ -145,10 +161,26 @@
|
||||
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
|
||||
WHERE guacamole_entity.name IN
|
||||
WHERE
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_entity.name
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_entity.name)
|
||||
</otherwise>
|
||||
</choose>
|
||||
IN
|
||||
<foreach collection="identifiers" item="identifier"
|
||||
open="(" separator="," close=")">
|
||||
#{identifier,jdbcType=VARCHAR}
|
||||
open="(" separator="," close=")">
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
#{identifier,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(#{identifier,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
</foreach>
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type;
|
||||
|
||||
@@ -180,10 +212,26 @@
|
||||
FROM guacamole_user
|
||||
JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id
|
||||
LEFT JOIN guacamole_user_history ON guacamole_user_history.user_id = guacamole_user.user_id
|
||||
WHERE guacamole_entity.name IN
|
||||
WHERE
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_entity.name
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_entity.name)
|
||||
</otherwise>
|
||||
</choose>
|
||||
IN
|
||||
<foreach collection="identifiers" item="identifier"
|
||||
open="(" separator="," close=")">
|
||||
#{identifier,jdbcType=VARCHAR}
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
#{identifier,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(#{identifier,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
</foreach>
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type
|
||||
AND guacamole_user.user_id IN (
|
||||
@@ -201,10 +249,26 @@
|
||||
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
|
||||
WHERE guacamole_entity.name IN
|
||||
WHERE
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_entity.name
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_entity.name)
|
||||
</otherwise>
|
||||
</choose>
|
||||
IN
|
||||
<foreach collection="identifiers" item="identifier"
|
||||
open="(" separator="," close=")">
|
||||
#{identifier,jdbcType=VARCHAR}
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
#{identifier,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(#{identifier,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
</foreach>
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type
|
||||
AND guacamole_user.user_id IN (
|
||||
@@ -243,7 +307,14 @@
|
||||
JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id
|
||||
LEFT JOIN guacamole_user_history ON guacamole_user_history.user_id = guacamole_user.user_id
|
||||
WHERE
|
||||
guacamole_entity.name = #{username,jdbcType=VARCHAR}
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_entity.name = #{username,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_entity.name) = LOWER(#{username,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type
|
||||
GROUP BY guacamole_user.user_id, guacamole_entity.entity_id;
|
||||
|
||||
@@ -255,16 +326,29 @@
|
||||
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
|
||||
WHERE
|
||||
guacamole_entity.name = #{username,jdbcType=VARCHAR}
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_entity.name = #{username,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_entity.name) = LOWER(#{username,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type
|
||||
|
||||
</select>
|
||||
|
||||
<!-- Delete single user by username -->
|
||||
<delete id="delete">
|
||||
DELETE FROM guacamole_entity
|
||||
WHERE
|
||||
name = #{identifier,jdbcType=VARCHAR}
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
name = #{identifier,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(name) = LOWER(#{identifier,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
AND type = 'USER'::guacamole_entity_type
|
||||
</delete>
|
||||
|
||||
@@ -326,7 +410,7 @@
|
||||
email_address = #{object.emailAddress,jdbcType=VARCHAR},
|
||||
organization = #{object.organization,jdbcType=VARCHAR},
|
||||
organizational_role = #{object.organizationalRole,jdbcType=VARCHAR}
|
||||
WHERE user_id = #{object.objectID,jdbcType=VARCHAR}
|
||||
WHERE user_id = #{object.objectID,jdbcType=INTEGER}
|
||||
</update>
|
||||
|
||||
<!-- Delete attributes associated with user -->
|
||||
|
@@ -49,7 +49,14 @@
|
||||
(SELECT user_id FROM guacamole_user
|
||||
JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id
|
||||
WHERE
|
||||
guacamole_entity.name = #{record.username,jdbcType=VARCHAR}
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_entity.name = #{record.username,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_entity.name) = LOWER(#{record.username,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type),
|
||||
#{record.username,jdbcType=VARCHAR},
|
||||
#{record.startDate,jdbcType=TIMESTAMP},
|
||||
@@ -81,7 +88,14 @@
|
||||
<where>
|
||||
|
||||
<if test="identifier != null">
|
||||
guacamole_user_history.username = #{identifier,jdbcType=VARCHAR}
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_user_history.username = #{identifier,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_user_history.username) = LOWER(#{identifier,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
</if>
|
||||
|
||||
<foreach collection="terms" item="term" open=" AND " separator=" AND ">
|
||||
@@ -92,7 +106,14 @@
|
||||
FROM guacamole_user
|
||||
JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id
|
||||
WHERE
|
||||
POSITION(#{term.term,jdbcType=VARCHAR} IN guacamole_entity.name) > 0
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
POSITION(#{term.term,jdbcType=VARCHAR} IN guacamole_entity.name) > 0
|
||||
</when>
|
||||
<otherwise>
|
||||
POSITION(LOWER(#{term.term,jdbcType=VARCHAR}) IN LOWER(guacamole_entity.name)) > 0
|
||||
</otherwise>
|
||||
</choose>
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type),
|
||||
)
|
||||
|
||||
@@ -146,7 +167,15 @@
|
||||
)
|
||||
|
||||
<if test="identifier != null">
|
||||
AND guacamole_entity.name = #{identifier,jdbcType=VARCHAR}
|
||||
AND
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_entity.name = #{identifier,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_entity.name) = LOWER(#{identifier,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
</if>
|
||||
|
||||
<foreach collection="terms" item="term" open=" AND " separator=" AND ">
|
||||
@@ -157,7 +186,14 @@
|
||||
FROM guacamole_user
|
||||
JOIN guacamole_entity ON guacamole_user.entity_id = guacamole_entity.entity_id
|
||||
WHERE
|
||||
POSITION(#{term.term,jdbcType=VARCHAR} IN guacamole_entity.name) > 0
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
POSITION(#{term.term,jdbcType=VARCHAR} IN guacamole_entity.name) > 0
|
||||
</when>
|
||||
<otherwise>
|
||||
POSITION(LOWER(#{term.term,jdbcType=VARCHAR}) IN LOWER(guacamole_entity.name)) > 0
|
||||
</otherwise>
|
||||
</choose>
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type
|
||||
)
|
||||
|
||||
|
@@ -58,11 +58,27 @@
|
||||
user_group_id = #{parent.objectID,jdbcType=INTEGER}
|
||||
AND guacamole_entity.entity_id = member_entity_id
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type
|
||||
AND guacamole_entity.name IN
|
||||
<foreach collection="children" item="identifier"
|
||||
open="(" separator="," close=")">
|
||||
#{identifier,jdbcType=VARCHAR}
|
||||
</foreach>
|
||||
AND
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_entity.name
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_entity.name)
|
||||
</otherwise>
|
||||
</choose>
|
||||
IN
|
||||
<foreach collection="children" item="identifier"
|
||||
open="(" separator="," close=")">
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
#{identifier,jdbcType=VARCHAR}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(#{identifier,jdbcType=VARCHAR})
|
||||
</otherwise>
|
||||
</choose>
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
<!-- Insert member users by name -->
|
||||
@@ -76,11 +92,26 @@
|
||||
guacamole_entity.entity_id
|
||||
FROM guacamole_entity
|
||||
WHERE
|
||||
guacamole_entity.name IN
|
||||
<foreach collection="children" item="identifier"
|
||||
open="(" separator="," close=")">
|
||||
#{identifier}
|
||||
</foreach>
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
guacamole_entity.name
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(guacamole_entity.name)
|
||||
</otherwise>
|
||||
</choose>
|
||||
IN
|
||||
<foreach collection="children" item="identifier"
|
||||
open="(" separator="," close=")">
|
||||
<choose>
|
||||
<when test="caseSensitive">
|
||||
#{identifier}
|
||||
</when>
|
||||
<otherwise>
|
||||
LOWER(#{identifier})
|
||||
</otherwise>
|
||||
</choose>
|
||||
</foreach>
|
||||
AND guacamole_entity.type = 'USER'::guacamole_entity_type
|
||||
AND guacamole_entity.entity_id NOT IN (
|
||||
SELECT guacamole_user_group_member.member_entity_id
|
||||
|
Reference in New Issue
Block a user