Skip to content

Commit 1043c13

Browse files
0ffersandrobonazzola
authored andcommitted
engine: Check concrete disk permissions firstly on TransferImageStatusCommand
There is some situations when storageDomainId is not come with parameters (image upload cancel and pause operations). For this operations checked CREATE_DISK permission on SYSTEM_OBJECT (i.e. system-wide). Problem starts when we give permissions for user only on concrete storage domain object (not system-wide). Then permission check failed for operations without storage domain id info in parameters. Here I just add check permission for disk before other objects. Signed-off-by: Stanislav Melnichuk <[email protected]>
1 parent a48bad9 commit 1043c13

File tree

2 files changed

+39
-12
lines changed

2 files changed

+39
-12
lines changed

backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/TransferImageStatusCommand.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import javax.inject.Inject;
77

8+
import org.apache.commons.lang3.ObjectUtils;
89
import org.ovirt.engine.core.bll.CommandBase;
910
import org.ovirt.engine.core.bll.MultiLevelAdministrationHandler;
1011
import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
@@ -104,16 +105,17 @@ protected void executeCommand() {
104105

105106
@Override
106107
public List<PermissionSubject> getPermissionCheckSubjects() {
107-
Guid objectId = getStorageDomainId();
108-
if (objectId == null) {
109-
objectId = getParameters().getStorageDomainId();
110-
if (objectId != null) {
111-
setStorageDomainId(objectId);
112-
} else {
113-
objectId = MultiLevelAdministrationHandler.SYSTEM_OBJECT_ID;
114-
}
108+
// Set storage domain id for audit logs.
109+
if (getStorageDomainId() == null && getParameters().getStorageDomainId() != null) {
110+
setStorageDomainId(getParameters().getStorageDomainId());
115111
}
116112

113+
Guid objectId = ObjectUtils.firstNonNull(
114+
getParameters().getDiskId(),
115+
getParameters().getStorageDomainId(),
116+
MultiLevelAdministrationHandler.SYSTEM_OBJECT_ID
117+
);
118+
117119
// Only check generic permissions because the command and/or ImageUpload entity may be missing
118120
return Collections.singletonList(new PermissionSubject(
119121
objectId,

backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/disk/image/TransferImageStatusCommandTest.java

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,22 @@
77
import static org.mockito.Mockito.when;
88

99
import java.util.List;
10+
import java.util.stream.Stream;
1011

1112
import org.junit.jupiter.api.BeforeEach;
1213
import org.junit.jupiter.api.Test;
1314
import org.junit.jupiter.api.extension.ExtendWith;
15+
import org.junit.jupiter.params.ParameterizedTest;
16+
import org.junit.jupiter.params.provider.Arguments;
17+
import org.junit.jupiter.params.provider.MethodSource;
1418
import org.mockito.InjectMocks;
1519
import org.mockito.Mock;
1620
import org.mockito.Mockito;
1721
import org.mockito.Spy;
1822
import org.mockito.junit.jupiter.MockitoSettings;
1923
import org.mockito.quality.Strictness;
2024
import org.ovirt.engine.core.bll.BaseCommandTest;
25+
import org.ovirt.engine.core.bll.MultiLevelAdministrationHandler;
2126
import org.ovirt.engine.core.bll.ValidateTestUtils;
2227
import org.ovirt.engine.core.bll.utils.PermissionSubject;
2328
import org.ovirt.engine.core.common.action.TransferImageStatusParameters;
@@ -46,7 +51,8 @@ public class TransferImageStatusCommandTest extends BaseCommandTest {
4651
private TransferImageStatusCommand<TransferImageStatusParameters> command =
4752
new TransferImageStatusCommand<>(new TransferImageStatusParameters(), null);
4853

49-
private Guid diskId = Guid.newGuid();
54+
private static Guid diskId = Guid.newGuid();
55+
private static Guid storageDomainId = Guid.newGuid();
5056

5157
@BeforeEach
5258
public void setUp() {
@@ -57,14 +63,33 @@ public void setUp() {
5763
}
5864

5965
@Test
60-
public void testCorrectPermissionCheckSubjects() {
61-
Guid storageDomainId = Guid.newGuid();
66+
void testBaseExecution() {
6267
command.getParameters().setStorageDomainId(storageDomainId);
6368
command.getParameters().setDiskId(diskId);
6469
List<PermissionSubject> subjects = command.getPermissionCheckSubjects();
6570
PermissionSubject subject = subjects.get(0);
66-
assertEquals(storageDomainId, subject.getObjectId());
71+
assertEquals(diskId, subject.getObjectId());
6772
ValidateTestUtils.runAndAssertValidateSuccess(command);
6873
command.executeCommand();
6974
}
75+
76+
@ParameterizedTest
77+
@MethodSource("commandCheckPermissionTestParameters")
78+
public void testCorrectPermissionCheckSubjects(Guid inputDiskId, Guid inputStorageDomainId, Guid expectedPermissionSubjectId) {
79+
command.getParameters().setStorageDomainId(inputStorageDomainId);
80+
command.getParameters().setDiskId(inputDiskId);
81+
82+
List<PermissionSubject> subjects = command.getPermissionCheckSubjects();
83+
PermissionSubject subject = subjects.get(0);
84+
85+
assertEquals(expectedPermissionSubjectId, subject.getObjectId());
86+
}
87+
88+
private static Stream<Arguments> commandCheckPermissionTestParameters() {
89+
return Stream.of(
90+
Arguments.of(diskId, storageDomainId, diskId),
91+
Arguments.of(null, storageDomainId, storageDomainId),
92+
Arguments.of(null, null, MultiLevelAdministrationHandler.SYSTEM_OBJECT_ID)
93+
);
94+
}
7095
}

0 commit comments

Comments
 (0)