CLOUDSTACK-7283: listUsers API is available for regular users now

This commit is contained in:
Alena Prokharchyk 2014-08-07 10:46:11 -07:00
parent 6220947dbe
commit 6d1482b97b
3 changed files with 35 additions and 15 deletions

View File

@ -32,7 +32,7 @@ markDefaultZoneForAccount=1
createUser=7
deleteUser=7
updateUser=15
listUsers=7
listUsers=15
lockUser=7
disableUser=7
enableUser=7

View File

@ -375,23 +375,20 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
private Pair<List<UserAccountJoinVO>, 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<Long> permittedAccounts = new ArrayList<Long>();
_accountMgr.checkAccess(caller, domain);
} else {
// default domainId to the caller's domain
domainId = caller.getDomainId();
}
boolean listAll = cmd.listAll();
Long id = cmd.getId();
Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<Long, Boolean, ListProjectResourcesCriteria>(
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<UserAccountJoinVO> 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<UserAccountJoinVO> sc = sb.create();
// building ACL condition
_accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts,
listProjectResourcesCriteria);
if (keyword != null) {
SearchCriteria<UserAccountJoinVO> ssc = _userAccountJoinDao.createSearchCriteria();
ssc.addOr("username", SearchCriteria.Op.LIKE, "%" + keyword + "%");

View File

@ -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;
}
}