diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index c1d21b96aad..c71f4bad8af 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -32,7 +32,7 @@ markDefaultZoneForAccount=1 createUser=7 deleteUser=7 updateUser=15 -listUsers=7 +listUsers=15 lockUser=7 disableUser=7 enableUser=7 diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java index 39eabd1e256..60b082c0061 100644 --- a/server/src/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java @@ -375,23 +375,20 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { private Pair, Integer> searchForUsersInternal(ListUsersCmd cmd) throws PermissionDeniedException { Account caller = CallContext.current().getCallingAccount(); - // TODO: Integrate with ACL checkAccess refactoring - Long domainId = cmd.getDomainId(); - if (domainId != null) { - Domain domain = _domainDao.findById(domainId); - if (domain == null) { - throw new InvalidParameterValueException("Unable to find domain by id=" + domainId); - } + List permittedAccounts = new ArrayList(); - _accountMgr.checkAccess(caller, domain); - } else { - // default domainId to the caller's domain - domainId = caller.getDomainId(); - } + boolean listAll = cmd.listAll(); + Long id = cmd.getId(); + Ternary domainIdRecursiveListProject = new Ternary( + cmd.getDomainId(), cmd.isRecursive(), null); + _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), null, permittedAccounts, + domainIdRecursiveListProject, listAll, false); + Long domainId = domainIdRecursiveListProject.first(); + Boolean isRecursive = domainIdRecursiveListProject.second(); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); Filter searchFilter = new Filter(UserAccountJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); - Long id = cmd.getId(); Object username = cmd.getUsername(); Object type = cmd.getAccountType(); Object accountName = cmd.getAccountName(); @@ -399,6 +396,8 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { Object keyword = cmd.getKeyword(); SearchBuilder sb = _userAccountJoinDao.createSearchBuilder(); + _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, + listProjectResourcesCriteria); sb.and("username", sb.entity().getUsername(), SearchCriteria.Op.LIKE); if (id != null && id == 1) { // system user should NOT be searchable @@ -422,6 +421,11 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { } SearchCriteria sc = sb.create(); + + // building ACL condition + _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, + listProjectResourcesCriteria); + if (keyword != null) { SearchCriteria ssc = _userAccountJoinDao.createSearchCriteria(); ssc.addOr("username", SearchCriteria.Op.LIKE, "%" + keyword + "%"); diff --git a/server/src/com/cloud/api/query/vo/UserAccountJoinVO.java b/server/src/com/cloud/api/query/vo/UserAccountJoinVO.java index ed29284a81a..0e66ca022c5 100644 --- a/server/src/com/cloud/api/query/vo/UserAccountJoinVO.java +++ b/server/src/com/cloud/api/query/vo/UserAccountJoinVO.java @@ -26,12 +26,13 @@ import javax.persistence.Table; import org.apache.cloudstack.api.Identity; import org.apache.cloudstack.api.InternalIdentity; +import com.cloud.user.UserAccount; import com.cloud.utils.db.Encrypt; import com.cloud.utils.db.GenericDao; @Entity @Table(name = "user_view") -public class UserAccountJoinVO extends BaseViewVO implements InternalIdentity, Identity { +public class UserAccountJoinVO extends BaseViewVO implements InternalIdentity, Identity, ControlledViewEntity { @Id @Column(name = "id", updatable = false, nullable = false) @@ -235,4 +236,19 @@ public class UserAccountJoinVO extends BaseViewVO implements InternalIdentity, I public boolean isDefault() { return isDefault; } + + @Override + public Class getEntityType() { + return UserAccount.class; + } + + @Override + public String getProjectUuid() { + return null; + } + + @Override + public String getProjectName() { + return null; + } }