diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java index 02d5043d0b5..14689fd8e4a 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java @@ -29,6 +29,7 @@ import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.syncope.common.lib.request.AnyUR; +import org.apache.syncope.common.lib.request.GroupUR; import org.apache.syncope.common.lib.request.StringPatchItem; import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.common.lib.to.Provision; @@ -42,6 +43,7 @@ import org.apache.syncope.common.lib.types.UnmatchingRule; import org.apache.syncope.core.persistence.api.entity.Any; import org.apache.syncope.core.persistence.api.entity.ExternalResource; +import org.apache.syncope.core.persistence.api.entity.group.Group; import org.apache.syncope.core.persistence.api.entity.task.PushTask; import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.provisioning.api.AuditManager; @@ -179,6 +181,8 @@ protected void link(final Any any, final boolean unlink, final ProvisioningRe operation(unlink ? PatchOperation.DELETE : PatchOperation.ADD_REPLACE). value(profile.getTask().getResource().getKey()).build()); + copyDynMembershipConds(any, req); + update(req); result.setStatus(ProvisioningReport.Status.SUCCESS); @@ -190,6 +194,8 @@ protected void unassign(final Any any, final ConnectorObject beforeObj, final operation(PatchOperation.DELETE). value(profile.getTask().getResource().getKey()).build()); + copyDynMembershipConds(any, req); + update(req); deprovision(any, beforeObj, result); @@ -201,11 +207,24 @@ protected void assign(final Any any, final Boolean enabled, final Provisionin operation(PatchOperation.ADD_REPLACE). value(profile.getTask().getResource().getKey()).build()); + copyDynMembershipConds(any, req); + update(req); provision(any, enabled, result); } + protected void copyDynMembershipConds(final Any any, final AnyUR req) { + if (any instanceof Group) { + Optional.ofNullable(((Group) any).getUDynMembership()). + ifPresent(udc -> ((GroupUR) req).setUDynMembershipCond(udc.getFIQLCond())); + + ((Group) any).getADynMemberships().forEach(aDynGroupMembership -> + ((GroupUR) req).getADynMembershipConds().put( + aDynGroupMembership.getAnyType().getKey(), aDynGroupMembership.getFIQLCond())); + } + } + @Transactional(propagation = Propagation.REQUIRES_NEW) @Override public boolean handle(final String anyKey) { diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java index 9e686ca3f62..00d7e121c79 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java @@ -29,9 +29,11 @@ import java.util.Map; import java.util.Set; import javax.ws.rs.core.Response; +import org.apache.commons.lang3.StringUtils; import org.apache.syncope.client.lib.SyncopeClient; import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.request.GroupCR; +import org.apache.syncope.common.lib.request.GroupUR; import org.apache.syncope.common.lib.to.AnyTypeClassTO; import org.apache.syncope.common.lib.to.ExecTO; import org.apache.syncope.common.lib.to.GroupTO; @@ -513,4 +515,27 @@ public void issueSYNCOPE648() { NotificationTaskTO taskTO = findNotificationTask(notification.getKey(), 50); assertNotNull(taskTO); } + + @Test + void issueSYNCOPE1918() { + GroupUR groupUR = new GroupUR.Builder("29f96485-729e-4d31-88a1-6fc60e4677f3") + .udynMembershipCond("username=~ros*").adynMembershipCond(PRINTER, "name=~hp*").build(); + GroupTO groupTO = updateGroup(groupUR).getEntity(); + assertTrue(StringUtils.isNotBlank(groupTO.getUDynMembershipCond())); + + execProvisioningTask( + TASK_SERVICE, TaskType.PUSH, "fd905ba5-9d56-4f51-83e2-859096a67b75", MAX_WAIT_SECONDS, false); + + groupTO = GROUP_SERVICE.read("29f96485-729e-4d31-88a1-6fc60e4677f3"); + assertTrue(StringUtils.isNotBlank(groupTO.getUDynMembershipCond())); + assertFalse(groupTO.getADynMembershipConds().isEmpty()); + + //Restore group citizen + groupUR.setUDynMembershipCond(null); + groupUR.getADynMembershipConds().clear(); + groupTO = updateGroup(groupUR).getEntity(); + + assertTrue(StringUtils.isBlank(groupTO.getUDynMembershipCond())); + assertTrue(groupTO.getADynMembershipConds().isEmpty()); + } }