| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 9b9d0cf commit 72bdf59
6 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -17,6 +17,8 @@ | |||
| 17 | 17 | package org.apache.cloudstack.api.command.user.userdata; | |
| 18 | 18 | ||
| 19 | 19 | import org.apache.cloudstack.acl.RoleType; | |
| 20 | + import org.apache.cloudstack.acl.SecurityChecker; | ||
| 21 | + import org.apache.cloudstack.api.ACL; | ||
| 20 | 22 | import org.apache.cloudstack.api.APICommand; | |
| 21 | 23 | import org.apache.cloudstack.api.ApiConstants; | |
| 22 | 24 | import org.apache.cloudstack.api.ApiErrorCode; | |
@@ -27,7 +29,6 @@ | |||
| 27 | 29 | import org.apache.cloudstack.api.response.ProjectResponse; | |
| 28 | 30 | import org.apache.cloudstack.api.response.SuccessResponse; | |
| 29 | 31 | import org.apache.cloudstack.api.response.UserDataResponse; | |
| 30 | - import org.apache.cloudstack.context.CallContext; | ||
| 31 | 32 | ||
| 32 | 33 | import com.cloud.user.Account; | |
| 33 | 34 | import com.cloud.user.UserData; | |
@@ -43,6 +44,7 @@ public class DeleteUserDataCmd extends BaseCmd { | |||
| 43 | 44 | //////////////// API parameters ///////////////////// | |
| 44 | 45 | ///////////////////////////////////////////////////// | |
| 45 | 46 | ||
| 47 | + @ACL(accessType = SecurityChecker.AccessType.OperateEntry) | ||
| 46 | 48 | @Parameter(name = ApiConstants.ID, type = CommandType.UUID, required = true, entityType = UserDataResponse.class, description = "The ID of the Userdata") | |
| 47 | 49 | private Long id; | |
| 48 | 50 | ||
@@ -97,18 +99,13 @@ public void execute() { | |||
| 97 | 99 | ||
| 98 | 100 | @Override | |
| 99 | 101 | public long getEntityOwnerId() { | |
| 100 | - Account account = CallContext.current().getCallingAccount(); | ||
| 101 | - if ((account == null || _accountService.isAdmin(account.getId())) && (domainId != null && accountName != null)) { | ||
| 102 | - Account userAccount = _responseGenerator.findAccountByNameDomain(accountName, domainId); | ||
| 103 | - if (userAccount != null) { | ||
| 104 | - return userAccount.getId(); | ||
| 102 | + if (id != null) { | ||
| 103 | + UserData userData = _entityMgr.findById(UserData.class, id); | ||
| 104 | + if (userData != null) { | ||
| 105 | + return userData.getAccountId(); | ||
| 105 | 106 | } | |
| 106 | 107 | } | |
| 107 | 108 | ||
| 108 | - if (account != null) { | ||
| 109 | - return account.getId(); | ||
| 110 | - } | ||
| 111 | - | ||
| 112 | 109 | return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked | |
| 113 | 110 | } | |
| 114 | 111 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -17,19 +17,18 @@ | |||
| 17 | 17 | package org.apache.cloudstack.api.command.user.userdata; | |
| 18 | 18 | ||
| 19 | 19 | import com.cloud.server.ManagementService; | |
| 20 | - import com.cloud.user.Account; | ||
| 21 | 20 | import com.cloud.user.AccountService; | |
| 21 | + import com.cloud.user.UserData; | ||
| 22 | + import com.cloud.utils.db.EntityManager; | ||
| 22 | 23 | import org.apache.cloudstack.api.ServerApiException; | |
| 23 | 24 | import org.apache.cloudstack.api.response.SuccessResponse; | |
| 24 | - import org.apache.cloudstack.context.CallContext; | ||
| 25 | 25 | import org.junit.After; | |
| 26 | 26 | import org.junit.Assert; | |
| 27 | 27 | import org.junit.Before; | |
| 28 | 28 | import org.junit.Test; | |
| 29 | 29 | import org.junit.runner.RunWith; | |
| 30 | 30 | import org.mockito.InjectMocks; | |
| 31 | 31 | import org.mockito.Mock; | |
| 32 | - import org.mockito.MockedStatic; | ||
| 33 | 32 | import org.mockito.Mockito; | |
| 34 | 33 | import org.mockito.MockitoAnnotations; | |
| 35 | 34 | import org.mockito.junit.MockitoJUnitRunner; | |
@@ -46,6 +45,12 @@ public class DeleteUserDataCmdTest { | |||
| 46 | 45 | @Mock | |
| 47 | 46 | ManagementService _mgr; | |
| 48 | 47 | ||
| 48 | + @Mock | ||
| 49 | + private EntityManager entityManagerMock; | ||
| 50 | + | ||
| 51 | + @Mock | ||
| 52 | + private UserData userDataMock; | ||
| 53 | + | ||
| 49 | 54 | private static final long DOMAIN_ID = 5L; | |
| 50 | 55 | private static final long PROJECT_ID = 10L; | |
| 51 | 56 | private static final String ACCOUNT_NAME = "user"; | |
@@ -84,19 +89,13 @@ public void testDeleteFailure() { | |||
| 84 | 89 | } | |
| 85 | 90 | ||
| 86 | 91 | @Test | |
| 87 | - public void validateArgsCmd() { | ||
| 88 | - try (MockedStatic<CallContext> callContextMocked = Mockito.mockStatic(CallContext.class)) { | ||
| 89 | - CallContext callContextMock = Mockito.mock(CallContext.class); | ||
| 90 | - callContextMocked.when(CallContext::current).thenReturn(callContextMock); | ||
| 91 | - Account accountMock = Mockito.mock(Account.class); | ||
| 92 | - Mockito.when(callContextMock.getCallingAccount()).thenReturn(accountMock); | ||
| 93 | - Mockito.when(accountMock.getId()).thenReturn(2L); | ||
| 94 | - Mockito.doReturn(false).when(_accountService).isAdmin(2L); | ||
| 95 | - | ||
| 96 | - ReflectionTestUtils.setField(cmd, "id", 1L); | ||
| 92 | + public void getEntityOwnerIdTestReturnUserDataOwnerWhenUserDataIdIsProvided() { | ||
| 93 | + long userDataId = 1L; | ||
| 94 | + long userDataOwnerId = 2L; | ||
| 95 | + ReflectionTestUtils.setField(cmd, "id", userDataId); | ||
| 96 | + Mockito.when(entityManagerMock.findById(UserData.class, userDataId)).thenReturn(userDataMock); | ||
| 97 | + Mockito.when(userDataMock.getAccountId()).thenReturn(userDataOwnerId); | ||
| 97 | 98 | ||
| 98 | - Assert.assertEquals(1L, (long) cmd.getId()); | ||
| 99 | - Assert.assertEquals(2L, cmd.getEntityOwnerId()); | ||
| 100 | - } | ||
| 99 | + Assert.assertEquals(userDataOwnerId, cmd.getEntityOwnerId()); | ||
| 101 | 100 | } | |
| 102 | 101 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -197,6 +197,7 @@ | |||
| 197 | 197 | import com.cloud.user.User; | |
| 198 | 198 | import com.cloud.user.UserData; | |
| 199 | 199 | import com.cloud.user.dao.AccountDao; | |
| 200 | + import com.cloud.user.dao.UserDataDao; | ||
| 200 | 201 | import com.cloud.uservm.UserVm; | |
| 201 | 202 | import com.cloud.utils.DateUtil; | |
| 202 | 203 | import com.cloud.utils.EncryptionUtil; | |
@@ -328,6 +329,9 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, | |||
| 328 | 329 | ||
| 329 | 330 | protected boolean backupSnapshotAfterTakingSnapshot = SnapshotInfo.BackupSnapshotAfterTakingSnapshot.value(); | |
| 330 | 331 | ||
| 332 | + @Inject | ||
| 333 | + private UserDataDao userDataDao; | ||
| 334 | + | ||
| 331 | 335 | private TemplateAdapter getAdapter(HypervisorType type) { | |
| 332 | 336 | TemplateAdapter adapter = null; | |
| 333 | 337 | if (type == HypervisorType.BareMetal) { | |
@@ -2589,12 +2593,17 @@ public VirtualMachineTemplate linkUserDataToTemplate(LinkUserDataToTemplateCmd c | |||
| 2589 | 2593 | ||
| 2590 | 2594 | _accountMgr.checkAccess(caller, AccessType.OperateEntry, true, template); | |
| 2591 | 2595 | ||
| 2592 | - template.setUserDataId(userDataId); | ||
| 2593 | 2596 | if (userDataId != null) { | |
| 2597 | + UserData userData = userDataDao.findById(userDataId); | ||
| 2598 | + if (userData == null) { | ||
| 2599 | + throw new InvalidParameterValueException("Unable to find user data with the specified ID."); | ||
| 2600 | + } | ||
| 2601 | + _accountMgr.checkAccess(caller, null, false, userData); | ||
| 2594 | 2602 | template.setUserDataLinkPolicy(overridePolicy); | |
| 2595 | 2603 | } else { | |
| 2596 | 2604 | template.setUserDataLinkPolicy(null); | |
| 2597 | 2605 | } | |
| 2606 | + template.setUserDataId(userDataId); | ||
| 2598 | 2607 | _tmpltDao.update(template.getId(), template); | |
| 2599 | 2608 | ||
| 2600 | 2609 | return _tmpltDao.findById(template.getId()); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -996,8 +996,16 @@ public UserVm resetVMUserData(ResetVMUserDataCmd cmd) throws ResourceUnavailable | |||
| 996 | 996 | throw new InvalidParameterValueException(String.format("VM %s should be stopped to do UserData reset", userVm)); | |
| 997 | 997 | } | |
| 998 | 998 | ||
| 999 | - String userData = cmd.getUserData(); | ||
| 1000 | 999 | Long userDataId = cmd.getUserdataId(); | |
| 1000 | + if (userDataId != null) { | ||
| 1001 | + UserData userData = userDataDao.findById(userDataId); | ||
| 1002 | + if (userData == null) { | ||
| 1003 | + throw new InvalidParameterValueException("Unable to find user data with the specified ID."); | ||
| 1004 | + } | ||
| 1005 | + _accountMgr.checkAccess(caller, null, false, userData); | ||
| 1006 | + } | ||
| 1007 | + | ||
| 1008 | + String userData = cmd.getUserData(); | ||
| 1001 | 1009 | String userDataDetails = null; | |
| 1002 | 1010 | if (MapUtils.isNotEmpty(cmd.getUserdataDetails())) { | |
| 1003 | 1011 | userDataDetails = cmd.getUserdataDetails().toString(); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -62,8 +62,10 @@ | |||
| 62 | 62 | import com.cloud.user.ResourceLimitService; | |
| 63 | 63 | import com.cloud.user.User; | |
| 64 | 64 | import com.cloud.user.UserData; | |
| 65 | + import com.cloud.user.UserDataVO; | ||
| 65 | 66 | import com.cloud.user.UserVO; | |
| 66 | 67 | import com.cloud.user.dao.AccountDao; | |
| 68 | + import com.cloud.user.dao.UserDataDao; | ||
| 67 | 69 | import com.cloud.utils.concurrency.NamedThreadFactory; | |
| 68 | 70 | import com.cloud.utils.exception.CloudRuntimeException; | |
| 69 | 71 | import com.cloud.vm.VMInstanceVO; | |
@@ -220,6 +222,12 @@ public class TemplateManagerImplTest extends TestCase { | |||
| 220 | 222 | @Mock | |
| 221 | 223 | HeuristicRuleHelper heuristicRuleHelperMock; | |
| 222 | 224 | ||
| 225 | + @Mock | ||
| 226 | + private UserDataDao userDataDaoMock; | ||
| 227 | + | ||
| 228 | + @Mock | ||
| 229 | + private UserDataVO userDataMock; | ||
| 230 | + | ||
| 223 | 231 | public class CustomThreadPoolExecutor extends ThreadPoolExecutor { | |
| 224 | 232 | AtomicInteger ai = new AtomicInteger(0); | |
| 225 | 233 | public CustomThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, | |
@@ -524,6 +532,8 @@ public void testLinkUserDataToTemplate() { | |||
| 524 | 532 | VMTemplateVO template = Mockito.mock(VMTemplateVO.class); | |
| 525 | 533 | when(vmTemplateDao.findById(anyLong())).thenReturn(template); | |
| 526 | 534 | ||
| 535 | + when(userDataDaoMock.findById(anyLong())).thenReturn(userDataMock); | ||
| 536 | + | ||
| 527 | 537 | VirtualMachineTemplate resultTemplate = templateManager.linkUserDataToTemplate(cmd); | |
| 528 | 538 | ||
| 529 | 539 | Assert.assertEquals(template, resultTemplate); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1029,7 +1029,6 @@ public void testResetVMUserDataDontAcceptBothUserdataAndUserdataId() { | |||
| 1029 | 1029 | ||
| 1030 | 1030 | when(userVmVoMock.getState()).thenReturn(VirtualMachine.State.Stopped); | |
| 1031 | 1031 | ||
| 1032 | - when(cmd.getUserData()).thenReturn("testUserdata"); | ||
| 1033 | 1032 | when(cmd.getUserdataId()).thenReturn(1L); | |
| 1034 | 1033 | ||
| 1035 | 1034 | try { | |
| Back | FazBrowse Home | New Git URL |
0 commit comments