mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	CLOUDSTACK-4337 Dedicated Resources: Zone dedicated to an account should only be visible and accessible to that account
Changes: - When listing a zone, add clause in the search to check the account_id for a dedicated zone - When listsing a zone with a domainid, add a similar clause. - DomainCheck:: checkAccess() for a zone should consider that zone can now be dediacted to a specific account and check access accordingly. Conflicts: server/src/com/cloud/api/query/vo/DataCenterJoinVO.java setup/db/db/schema-410to420.sql
This commit is contained in:
		
							parent
							
								
									012afceed2
								
							
						
					
					
						commit
						6a0bda0280
					
				| @ -26,6 +26,8 @@ import org.apache.cloudstack.api.BaseCmd; | |||||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||||
| 
 | 
 | ||||||
| import com.cloud.dc.DataCenter; | import com.cloud.dc.DataCenter; | ||||||
|  | import com.cloud.dc.DedicatedResourceVO; | ||||||
|  | import com.cloud.dc.dao.DedicatedResourceDao; | ||||||
| import com.cloud.domain.Domain; | import com.cloud.domain.Domain; | ||||||
| import com.cloud.domain.dao.DomainDao; | import com.cloud.domain.dao.DomainDao; | ||||||
| import com.cloud.exception.PermissionDeniedException; | import com.cloud.exception.PermissionDeniedException; | ||||||
| @ -53,6 +55,8 @@ public class DomainChecker extends AdapterBase implements SecurityChecker { | |||||||
|     @Inject ProjectManager _projectMgr; |     @Inject ProjectManager _projectMgr; | ||||||
|     @Inject ProjectAccountDao _projecAccountDao; |     @Inject ProjectAccountDao _projecAccountDao; | ||||||
|     @Inject NetworkModel _networkMgr; |     @Inject NetworkModel _networkMgr; | ||||||
|  |     @Inject | ||||||
|  |     private DedicatedResourceDao _dedicatedDao; | ||||||
|      |      | ||||||
|     protected DomainChecker() { |     protected DomainChecker() { | ||||||
|         super(); |         super(); | ||||||
| @ -238,6 +242,18 @@ public class DomainChecker extends AdapterBase implements SecurityChecker { | |||||||
| 			//if account is normal user | 			//if account is normal user | ||||||
| 			//check if account's domain is a child of zone's domain | 			//check if account's domain is a child of zone's domain | ||||||
|             else if (account.getType() == Account.ACCOUNT_TYPE_NORMAL || account.getType() == Account.ACCOUNT_TYPE_PROJECT) { |             else if (account.getType() == Account.ACCOUNT_TYPE_NORMAL || account.getType() == Account.ACCOUNT_TYPE_PROJECT) { | ||||||
|  |                 // if zone is dedicated to an account check that the accountId | ||||||
|  |                 // matches. | ||||||
|  |                 DedicatedResourceVO dedicatedZone = _dedicatedDao.findByZoneId(zone.getId()); | ||||||
|  |                 if (dedicatedZone != null) { | ||||||
|  |                     if (dedicatedZone.getAccountId() != null) { | ||||||
|  |                         if (dedicatedZone.getAccountId() == account.getId()) { | ||||||
|  |                             return true; | ||||||
|  |                         } else { | ||||||
|  |                             return false; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|                 if (account.getDomainId() == zone.getDomainId()) { |                 if (account.getDomainId() == zone.getDomainId()) { | ||||||
| 					return true; //zone and account at exact node | 					return true; //zone and account at exact node | ||||||
|                 } else { |                 } else { | ||||||
|  | |||||||
| @ -2499,11 +2499,21 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { | |||||||
|              * List all resources due to Explicit Dedication except the |              * List all resources due to Explicit Dedication except the | ||||||
|              * dedicated resources of other account |              * dedicated resources of other account | ||||||
|              */ |              */ | ||||||
|             if (domainId != null && account.getType() == Account.ACCOUNT_TYPE_ADMIN) { // |             if (domainId != null) { // | ||||||
|                 // for domainId != null // right now, we made the decision to |                 // for domainId != null // right now, we made the decision to | ||||||
|                 // only |                 // only list zones associated // with this domain, private zone | ||||||
|                 // / list zones associated // with this domain, private zone |  | ||||||
|                 sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); |                 sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); | ||||||
|  | 
 | ||||||
|  |                 if (account.getType() == Account.ACCOUNT_TYPE_NORMAL) { | ||||||
|  |                     // accountId == null (zones dedicated to a domain) or | ||||||
|  |                     // accountId = caller | ||||||
|  |                     SearchCriteria<DataCenterJoinVO> sdc = _dcJoinDao.createSearchCriteria(); | ||||||
|  |                     sdc.addOr("accountId", SearchCriteria.Op.EQ, account.getId()); | ||||||
|  |                     sdc.addOr("accountId", SearchCriteria.Op.NULL); | ||||||
|  | 
 | ||||||
|  |                     sc.addAnd("account", SearchCriteria.Op.SC, sdc); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|             } else if (account.getType() == Account.ACCOUNT_TYPE_NORMAL) { |             } else if (account.getType() == Account.ACCOUNT_TYPE_NORMAL) { | ||||||
|                 // it was decided to return all zones for the user's domain, and |                 // it was decided to return all zones for the user's domain, and | ||||||
|                 // everything above till root |                 // everything above till root | ||||||
| @ -2535,6 +2545,14 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { | |||||||
|                 // remove disabled zones |                 // remove disabled zones | ||||||
|                 sc.addAnd("allocationState", SearchCriteria.Op.NEQ, Grouping.AllocationState.Disabled); |                 sc.addAnd("allocationState", SearchCriteria.Op.NEQ, Grouping.AllocationState.Disabled); | ||||||
| 
 | 
 | ||||||
|  |                 // accountId == null (zones dedicated to a domain) or | ||||||
|  |                 // accountId = caller | ||||||
|  |                 SearchCriteria<DataCenterJoinVO> sdc2 = _dcJoinDao.createSearchCriteria(); | ||||||
|  |                 sdc2.addOr("accountId", SearchCriteria.Op.EQ, account.getId()); | ||||||
|  |                 sdc2.addOr("accountId", SearchCriteria.Op.NULL); | ||||||
|  | 
 | ||||||
|  |                 sc.addAnd("account", SearchCriteria.Op.SC, sdc2); | ||||||
|  | 
 | ||||||
|                 // remove Dedicated zones not dedicated to this domainId or |                 // remove Dedicated zones not dedicated to this domainId or | ||||||
|                 // subdomainId |                 // subdomainId | ||||||
|                 List<Long> dedicatedZoneIds = removeDedicatedZoneNotSuitabe(domainIds); |                 List<Long> dedicatedZoneIds = removeDedicatedZoneNotSuitabe(domainIds); | ||||||
|  | |||||||
| @ -108,6 +108,15 @@ public class DataCenterJoinVO extends BaseViewVO implements InternalIdentity, Id | |||||||
|     @Column(name="domain_path") |     @Column(name="domain_path") | ||||||
|     private String domainPath; |     private String domainPath; | ||||||
| 
 | 
 | ||||||
|  |     @Column(name = "affinity_group_id") | ||||||
|  |     private long affinityGroupId; | ||||||
|  | 
 | ||||||
|  |     @Column(name = "affinity_group_uuid") | ||||||
|  |     private String affinityGroupUuid; | ||||||
|  | 
 | ||||||
|  |     @Column(name = "account_id") | ||||||
|  |     private long accountId; | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|     public DataCenterJoinVO() { |     public DataCenterJoinVO() { | ||||||
|     } |     } | ||||||
| @ -303,4 +312,15 @@ public class DataCenterJoinVO extends BaseViewVO implements InternalIdentity, Id | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |     public String getAffinityGroupUuid() { | ||||||
|  |         return affinityGroupUuid; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public long getAccountId() { | ||||||
|  |         return accountId; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setAccountId(long accountId) { | ||||||
|  |         this.accountId = accountId; | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -2338,3 +2338,40 @@ CREATE TABLE `cloud`.`ldap_configuration` ( | |||||||
|   PRIMARY KEY  (`id`) |   PRIMARY KEY  (`id`) | ||||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; | ||||||
| 
 | 
 | ||||||
|  | DROP VIEW IF EXISTS `cloud`.`data_center_view`; | ||||||
|  | CREATE VIEW `cloud`.`data_center_view` AS | ||||||
|  |     select  | ||||||
|  |         data_center.id, | ||||||
|  |         data_center.uuid, | ||||||
|  |         data_center.name, | ||||||
|  |         data_center.is_security_group_enabled, | ||||||
|  |         data_center.is_local_storage_enabled, | ||||||
|  |         data_center.description, | ||||||
|  |         data_center.dns1, | ||||||
|  |         data_center.dns2, | ||||||
|  |         data_center.ip6_dns1, | ||||||
|  |         data_center.ip6_dns2, | ||||||
|  |         data_center.internal_dns1, | ||||||
|  |         data_center.internal_dns2, | ||||||
|  |         data_center.guest_network_cidr, | ||||||
|  |         data_center.domain, | ||||||
|  |         data_center.networktype, | ||||||
|  |         data_center.allocation_state, | ||||||
|  |         data_center.zone_token, | ||||||
|  |         data_center.dhcp_provider, | ||||||
|  |         data_center.removed, | ||||||
|  |         domain.id domain_id, | ||||||
|  |         domain.uuid domain_uuid, | ||||||
|  |         domain.name domain_name, | ||||||
|  |         domain.path domain_path, | ||||||
|  | 		dedicated_resources.affinity_group_id, | ||||||
|  | 		dedicated_resources.account_id, | ||||||
|  | 		affinity_group.uuid affinity_group_uuid | ||||||
|  |     from | ||||||
|  |         `cloud`.`data_center` | ||||||
|  |             left join | ||||||
|  |         `cloud`.`domain` ON data_center.domain_id = domain.id | ||||||
|  | 			left join | ||||||
|  |         `cloud`.`dedicated_resources` ON data_center.id = dedicated_resources.data_center_id | ||||||
|  | 			left join | ||||||
|  |         `cloud`.`affinity_group` ON dedicated_resources.affinity_group_id = affinity_group.id; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user