From 945e8cd588da9ead01fe4caa8d798ea4775b1e81 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Fri, 3 Feb 2023 14:16:51 +0100 Subject: [PATCH 1/2] server: fix exception while list users with keyword MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit old: ``` (localcloud) 🐱 > list users keyword=ADMIN 🙈 Error: (HTTP 530, error code 4250) Caught: com.mysql.cj.jdbc.ClientPreparedStatement: SELECT user_view.id, user_view.uuid, user_view.username, user_view.password, user_view.firstname, user_view.lastname, user_view.email, user_view.state, user_view.api_key, user_view.secret_key, user_view.created, user_view.removed, user_view.timezone, user_view.registration_token, user_view.is_registered, user_view.incorrect_login_attempts, user_view.account_id, user_view.account_uuid, user_view.account_name, user_view.account_type, user_view.account_role_id, user_view.domain_id, user_view.domain_uuid, user_view.domain_name, user_view.domain_path, user_view.job_id, user_view.job_uuid, user_view.job_status, user_view.default, user_view.source FROM user_view WHERE user_view.account_id=2 AND user_view.account_type != 5 AND user_view.id != 1 AND (user_view.username LIKE x'2541444D494E25' OR user_view.firstname LIKE x'2541444D494E25' OR user_view.lastname LIKE x'2541444D494E25' OR user_view.email LIKE x'2541444D494E25' OR user_view.state LIKE x'2541444D494E25' OR user_view.account_name LIKE x'2541444D494E25' OR user_view.account_type = ** NOT SPECIFIED ** ) AND user_view.removed IS NULL ORDER BY user_view.id ASC LIMIT 0, 500 ``` new: ``` (localcloud) 🐱 > list users keyword=admin listall=true filter=username,roletype { "count": 3, "user": [ { "roletype": "Admin", "username": "admin" }, { "roletype": "Admin", "username": "admin-kubeadmin" }, { "roletype": "DomainAdmin", "username": "testadmin" } ] } ``` and ``` (localcloud) 🐱 > list users keyword=domain_admin listall=true filter=username,roletype { "count": 1, "user": [ { "roletype": "DomainAdmin", "username": "testadmin" } ] } ``` --- .../src/main/java/com/cloud/api/query/QueryManagerImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index d5ce58b6c885..ed11a770d73f 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -132,6 +132,7 @@ import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -617,7 +618,9 @@ private Pair, Integer> getUserListInternal(Account calle ssc.addOr("email", Op.LIKE, "%" + keyword + "%"); ssc.addOr("state", Op.LIKE, "%" + keyword + "%"); ssc.addOr("accountName", Op.LIKE, "%" + keyword + "%"); - ssc.addOr("accountType", Op.LIKE, "%" + keyword + "%"); + if (EnumUtils.isValidEnum(Account.Type.class, keyword.toString().toUpperCase())) { + ssc.addOr("accountType", Op.EQ, EnumUtils.getEnum(Account.Type.class, keyword.toString().toUpperCase())); + } sc.addAnd("username", Op.SC, ssc); } From 828f2a8bf53055cfefd224bc81721bf94e96c7e8 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Tue, 7 Feb 2023 19:33:11 +0100 Subject: [PATCH 2/2] Update 7169: remove unnecessary toString --- .../java/com/cloud/api/query/QueryManagerImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index ed11a770d73f..560f62ad9177 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -532,7 +532,7 @@ public ListResponse searchForUsers(Long domainId, boolean recursiv Object type = null; String accountName = null; Object state = null; - Object keyword = null; + String keyword = null; Pair, Integer> result = getUserListInternal(caller, permittedAccounts, listAll, id, username, type, accountName, state, keyword, domainId, recursive, null); @@ -561,7 +561,7 @@ private Pair, Integer> searchForUsersInternal(ListUsersC Object type = cmd.getAccountType(); String accountName = cmd.getAccountName(); Object state = cmd.getState(); - Object keyword = cmd.getKeyword(); + String keyword = cmd.getKeyword(); Long domainId = cmd.getDomainId(); boolean recursive = cmd.isRecursive(); @@ -574,7 +574,7 @@ private Pair, Integer> searchForUsersInternal(ListUsersC } private Pair, Integer> getUserListInternal(Account caller, List permittedAccounts, boolean listAll, Long id, Object username, Object type, - String accountName, Object state, Object keyword, Long domainId, boolean recursive, Filter searchFilter) { + String accountName, Object state, String keyword, Long domainId, boolean recursive, Filter searchFilter) { Ternary domainIdRecursiveListProject = new Ternary(domainId, recursive, null); _accountMgr.buildACLSearchParameters(caller, id, accountName, null, permittedAccounts, domainIdRecursiveListProject, listAll, false); domainId = domainIdRecursiveListProject.first(); @@ -618,8 +618,8 @@ private Pair, Integer> getUserListInternal(Account calle ssc.addOr("email", Op.LIKE, "%" + keyword + "%"); ssc.addOr("state", Op.LIKE, "%" + keyword + "%"); ssc.addOr("accountName", Op.LIKE, "%" + keyword + "%"); - if (EnumUtils.isValidEnum(Account.Type.class, keyword.toString().toUpperCase())) { - ssc.addOr("accountType", Op.EQ, EnumUtils.getEnum(Account.Type.class, keyword.toString().toUpperCase())); + if (EnumUtils.isValidEnum(Account.Type.class, keyword.toUpperCase())) { + ssc.addOr("accountType", Op.EQ, EnumUtils.getEnum(Account.Type.class, keyword.toUpperCase())); } sc.addAnd("username", Op.SC, ssc);