Skip to content

Commit

Permalink
MID-8326: fix for item configuration in object tempate, when item is …
Browse files Browse the repository at this point in the history
…child of multivalue container
  • Loading branch information
skublik committed Nov 24, 2022
1 parent 9877660 commit 586e21c
Show file tree
Hide file tree
Showing 5 changed files with 169 additions and 85 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -752,15 +752,14 @@ private <O extends ObjectType> void applyObjectTemplateToObject(PrismObject<O> o
+ " as specified in item definition in " + objectTemplateType);
continue;
}
Item<?, ?> item = object.findItem(itemPath);
if (item != null) {
Collection<Item<?, ?>> items = object.getAllItems(itemPath);
for (Item<?, ?> item : items) {
ItemDefinition itemDef = item.getDefinition();
if (itemDef != itemDefFromObject) {
applyObjectTemplateItem(itemDef, templateItemDefType, "item "+itemPath+" in " + object
+ " as specified in item definition in "+objectTemplateType);
}
}

}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3210,6 +3210,34 @@ public void test400AutzJackSearchByAssignmentTargetRef() throws Exception {
assertSearch(UserType.class, existsQuery, 1); // guybrush
}

/**
* Checks whether item configuration from object template is applicated for child item of multivalue container
*
* MID-8347
*/
@Test
public void test410ItemAccessMultivalueAttrChild() throws Exception {
given();
cleanupAutzTest(USER_JACK_OID);

assignRole(USER_JACK_OID, ROLE_SUPERUSER_OID);

login(USER_JACK_USERNAME);

when();

PrismObject<UserType> user = getObject(UserType.class, USER_CHARLES_OID);

then();

assertObjectDefinition(user.getDefinition())
.container(UserType.F_OPERATION_EXECUTION)
.property(OperationExecutionType.F_MESSAGE)
.assertDenyAdd()
.assertDenyModify()
.assertAllowRead();
}

private void assertTaskAddAllow(String oid, String name, String ownerOid, String handlerUri) throws Exception {
assertAllow("add task " + name,
(task, result) -> addTask(oid, name, ownerOid, handlerUri, task, result));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,17 @@
</target>
</mapping>

<!-- MID-8347 -->
<item>
<ref>operationExecution/message</ref>
<limitations>
<layer>presentation</layer>
<access>
<read>true</read>
<add>false</add>
<modify>false</modify>
</access>
</limitations>
</item>

</objectTemplate>
Original file line number Diff line number Diff line change
@@ -1,82 +1,91 @@
/*
* Copyright (c) 2019 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.test.asserter.prism;

import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;

import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.util.PrettyPrinter;


/**
* Related to ComplexTypeDefinitionAsserter
*
* @author Radovan semancik
*/
public class PrismContainerDefinitionAsserter<C extends Containerable,RA> extends PrismDefinitionAsserter<RA> {

public PrismContainerDefinitionAsserter(PrismContainerDefinition<C> definition) {
super(definition);
}

public PrismContainerDefinitionAsserter(PrismContainerDefinition<C> definition, String detail) {
super(definition, detail);
}

public PrismContainerDefinitionAsserter(PrismContainerDefinition<C> definition, RA returnAsserter, String detail) {
super(definition, returnAsserter, detail);
}

public static <C extends Containerable> PrismContainerDefinitionAsserter<C,Void> forContainerDefinition(PrismContainerDefinition<C> definition) {
return new PrismContainerDefinitionAsserter<>(definition);
}

public PrismContainerDefinition<C> getDefinition() {
return (PrismContainerDefinition<C>) super.getDefinition();
}

public PrismContainerDefinitionAsserter<C,RA> assertSize(int expected) {
assertEquals("Wrong number of item definitions in "+desc(), expected, getDefinition() != null ? getDefinition().getDefinitions().size() : 0);
return this;
}


public PrismContainerDefinitionAsserter<C,RA> assertProperty(ItemName itemPath) {
PrismPropertyDefinition<Object> propertyDefinition = getDefinition().findPropertyDefinition(itemPath);
assertNotNull("No property definition for path "+itemPath+" in "+desc(), propertyDefinition);
return this;
}

public <CC extends Containerable> PrismContainerDefinitionAsserter<CC,PrismContainerDefinitionAsserter<C,RA>> container(ItemPath subDefPath) {
PrismContainerDefinition<CC> subDefinition = getDefinition().findContainerDefinition(subDefPath);
assertNotNull("No container for path "+subDefPath+" in "+desc(), subDefinition);
PrismContainerDefinitionAsserter<CC,PrismContainerDefinitionAsserter<C,RA>> subAsserter = new PrismContainerDefinitionAsserter<>(subDefinition, this, "container for "+subDefPath+" in "+desc());
copySetupTo(subAsserter);
return subAsserter;
}

protected String desc() {
return descWithDetails("container definition " + PrettyPrinter.prettyPrint(getDefinition().getItemName()));
}

public PrismContainerDefinitionAsserter<C,RA> display() {
display(desc());
return this;
}

public PrismContainerDefinitionAsserter<C,RA> display(String message) {
PrismTestUtil.display(message, getDefinition());
return this;
}

}
/*
* Copyright (c) 2019 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.test.asserter.prism;

import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;

import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.util.PrettyPrinter;


/**
* Related to ComplexTypeDefinitionAsserter
*
* @author Radovan semancik
*/
public class PrismContainerDefinitionAsserter<C extends Containerable,RA> extends PrismDefinitionAsserter<RA> {

public PrismContainerDefinitionAsserter(PrismContainerDefinition<C> definition) {
super(definition);
}

public PrismContainerDefinitionAsserter(PrismContainerDefinition<C> definition, String detail) {
super(definition, detail);
}

public PrismContainerDefinitionAsserter(PrismContainerDefinition<C> definition, RA returnAsserter, String detail) {
super(definition, returnAsserter, detail);
}

public static <C extends Containerable> PrismContainerDefinitionAsserter<C,Void> forContainerDefinition(PrismContainerDefinition<C> definition) {
return new PrismContainerDefinitionAsserter<>(definition);
}

public PrismContainerDefinition<C> getDefinition() {
return (PrismContainerDefinition<C>) super.getDefinition();
}

public PrismContainerDefinitionAsserter<C,RA> assertSize(int expected) {
assertEquals("Wrong number of item definitions in "+desc(), expected, getDefinition() != null ? getDefinition().getDefinitions().size() : 0);
return this;
}


public PrismContainerDefinitionAsserter<C,RA> assertProperty(ItemName itemPath) {
PrismPropertyDefinition<Object> propertyDefinition = getDefinition().findPropertyDefinition(itemPath);
assertNotNull("No property definition for path "+itemPath+" in "+desc(), propertyDefinition);
return this;
}

public <CC extends Containerable> PrismContainerDefinitionAsserter<CC,PrismContainerDefinitionAsserter<C,RA>> container(ItemPath subDefPath) {
PrismContainerDefinition<CC> subDefinition = getDefinition().findContainerDefinition(subDefPath);
assertNotNull("No container for path "+subDefPath+" in "+desc(), subDefinition);
PrismContainerDefinitionAsserter<CC,PrismContainerDefinitionAsserter<C,RA>> subAsserter = new PrismContainerDefinitionAsserter<>(subDefinition, this, "container for "+subDefPath+" in "+desc());
copySetupTo(subAsserter);
return subAsserter;
}

public <T> PrismPropertyDefinitionAsserter<T, PrismPropertyDefinitionAsserter<T, Void>> property(ItemPath subDefPath) {
PrismPropertyDefinition<T> subDefinition = getDefinition().findPropertyDefinition(subDefPath);
assertNotNull("No property for path "+subDefPath+" in "+desc(), subDefinition);
PrismPropertyDefinitionAsserter<T,PrismPropertyDefinitionAsserter<T, Void>> subAsserter =
new PrismPropertyDefinitionAsserter<>(subDefinition, "property for "+subDefPath+" in "+desc());
copySetupTo(subAsserter);
return subAsserter;
}

protected String desc() {
return descWithDetails("container definition " + PrettyPrinter.prettyPrint(getDefinition().getItemName()));
}

public PrismContainerDefinitionAsserter<C,RA> display() {
display(desc());
return this;
}

public PrismContainerDefinitionAsserter<C,RA> display(String message) {
PrismTestUtil.display(message, getDefinition());
return this;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,39 @@ public PrismPropertyDefinitionAsserter<T,RA> display(String message) {
PrismTestUtil.display(message, getDefinition());
return this;
}

public PrismPropertyDefinitionAsserter<T,RA> assertDenyAdd() {
assertAccess("Add", false, getDefinition().canAdd());
return this;
}

public PrismPropertyDefinitionAsserter<T,RA> assertAllowAdd() {
assertAccess("Add", true, getDefinition().canAdd());
return this;
}

public PrismPropertyDefinitionAsserter<T,RA> assertDenyModify() {
assertAccess("Modify", false, getDefinition().canModify());
return this;
}

public PrismPropertyDefinitionAsserter<T,RA> assertAllowModify() {
assertAccess("Modify", true, getDefinition().canModify());
return this;
}

public PrismPropertyDefinitionAsserter<T,RA> assertDenyRead() {
assertAccess("Read", false, getDefinition().canRead());
return this;
}

public PrismPropertyDefinitionAsserter<T,RA> assertAllowRead() {
assertAccess("Read", true, getDefinition().canRead());
return this;
}
private void assertAccess(String access, boolean expected, boolean actual) {
if (expected != actual) {
fail(access+" access is "+actual+" and we expected "+expected+" in "+desc());
}
}
}

0 comments on commit 586e21c

Please sign in to comment.