diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ActivationProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ActivationProcessor.java index d0ab91186f2..aa89546e9e7 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ActivationProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ActivationProcessor.java @@ -732,7 +732,9 @@ private boolean evaluateExistenceMapping( .implicitSourcePath(LEGAL_PROPERTY_NAME) .implicitTargetPath(SHADOW_EXISTS_PROPERTY_NAME); - builder.defaultSource(new Source<>(getLegalIdi(projCtx), ExpressionConstants.VAR_LEGAL_QNAME)); + ItemDeltaItem, PrismPropertyDefinition> legalIdi = getLegalIdi(projCtx); + builder.defaultSource(new Source<>(legalIdi, ExpressionConstants.VAR_LEGAL_QNAME)); + builder.additionalSource(new Source<>(legalIdi, ExpressionConstants.VAR_INPUT_QNAME)); builder.additionalSource(new Source<>(getAssignedIdi(projCtx), ExpressionConstants.VAR_ASSIGNED_QNAME)); builder.additionalSource(new Source<>(getFocusExistsIdi(context.getFocusContext()), ExpressionConstants.VAR_FOCUS_EXISTS_QNAME)); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java index 91f86b6c44a..ae990b53b36 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java @@ -95,6 +95,8 @@ public class TestActivation extends AbstractInitializedModelIntegrationTest { c -> c.extendSchemaPirate()); private static final DummyTestResource RESOURCE_DUMMY_FIXED_EXISTENCE = new DummyTestResource(TEST_DIR, "resource-dummy-fixed-existence.xml", "8ba303ee-3f07-4163-aa46-508cbc496ff4", "fixed-existence"); + private static final DummyTestResource RESOURCE_DUMMY_EXISTENCE_INPUT = new DummyTestResource(TEST_DIR, + "resource-dummy-existence-input.xml", "8ba303ee-3f07-4163-aa46-508cbc496ff5", "existence-input"); private static final String ACCOUNT_MANCOMB_DUMMY_USERNAME = "mancomb"; private static final Date ACCOUNT_MANCOMB_VALID_FROM_DATE = MiscUtil.asDate(2011, 2, 3, 4, 5, 6); @@ -133,7 +135,8 @@ public void initSystem(Task initTask, OperationResult initResult) RESOURCE_DUMMY_KHAKI, RESOURCE_DUMMY_PRECREATE, RESOURCE_DUMMY_FULL_VALIDITY, - RESOURCE_DUMMY_FIXED_EXISTENCE); + RESOURCE_DUMMY_FIXED_EXISTENCE, + RESOURCE_DUMMY_EXISTENCE_INPUT); resourceDummyKhaki = modelService .getObject(ResourceType.class, RESOURCE_DUMMY_KHAKI.oid, null, initTask, initResult) @@ -3115,6 +3118,36 @@ public void test820FixedExistence() throws Exception { .assertFullName(fullName); } + /** Existence mapping should expose "input" as the same legality value as "legal". MID-10905. */ + @Test + public void test830ExistenceInput() throws Exception { + var task = getTestTask(); + var result = task.getResult(); + assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL); + var userName = getTestNameShort(); + var fullName = "Mr. " + userName; + + given("a user with a single account exists"); + var user = new UserType() + .name(userName) + .fullName(fullName) + .assignment( + RESOURCE_DUMMY_EXISTENCE_INPUT.assignmentWithConstructionOf(ACCOUNT, INTENT_DEFAULT)); + addObject(user, task, result); + + then("the existence mapping used input=true to create the account"); + assertSuccess(result); + assertDummyAccountByUsername(RESOURCE_DUMMY_EXISTENCE_INPUT.name, userName) + .assertFullName(fullName); + + when("the account is unassigned"); + unassignAccountFromUser(user.getOid(), RESOURCE_DUMMY_EXISTENCE_INPUT.oid, INTENT_DEFAULT, task, result); + + then("the existence mapping used input=false to delete the account"); + assertSuccess(result); + assertNoDummyAccount(RESOURCE_DUMMY_EXISTENCE_INPUT.name, userName); + } + private void assertDummyActivationEnabledState(String userId, Boolean expectedEnabled) throws SchemaViolationException, ConflictException, InterruptedException { assertDummyActivationEnabledState(null, userId, expectedEnabled); } diff --git a/model/model-intest/src/test/resources/activation/resource-dummy-existence-input.xml b/model/model-intest/src/test/resources/activation/resource-dummy-existence-input.xml new file mode 100644 index 00000000000..4220cc25248 --- /dev/null +++ b/model/model-intest/src/test/resources/activation/resource-dummy-existence-input.xml @@ -0,0 +1,79 @@ + + + + + + resource-dummy-existence-input + + + + + connectorType + com.evolveum.icf.dummy.connector.DummyConnector + + + connectorVersion + 2.0 + + + + + + + existence-input + + + + + account + default + Default Account + true + ri:AccountObjectClass + + icfs:name + + strong + + name + + + + + ri:fullname + + strong + + fullName + + + + + + + + + + + + + + + diff --git a/release-notes.adoc b/release-notes.adoc index c606d71c93d..dc3db35d8eb 100644 --- a/release-notes.adoc +++ b/release-notes.adoc @@ -102,6 +102,7 @@ Overall, midPoint 4.10 opens up the world of identity management and governance * Delineation suggestions: filter parsing broken after recent GUI change. See bug:MID-11175[] * Fixed work item search by name causing repository mapping error. See bug:MID-8834[] * Fixed translation of archetype display labels in assignment picker and summary panel. See bug:MID-11177[] +* Fixed missing input variable in resource activation existence mappings. See bug:MID-10905[] === Releases Of Other Components