This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch 4_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/4_0_X by this push:
new 3391829bae [SYNCOPE-1918] Avoided dynamic membership deletion after
push task execution (#1198)
3391829bae is described below
commit 3391829baebfb0f41e10a457239567f1bead0f71
Author: Samuel Garofalo <[email protected]>
AuthorDate: Tue Sep 30 11:05:51 2025 +0200
[SYNCOPE-1918] Avoided dynamic membership deletion after push task
execution (#1198)
---
.../java/pushpull/AbstractPushResultHandler.java | 15 ++++++++++
.../apache/syncope/fit/core/PushTaskITCase.java | 33 ++++++++++++++++++++++
2 files changed, 48 insertions(+)
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 76a4ed47a0..854bdf68ab 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
@@ -28,6 +28,7 @@ import java.util.Set;
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;
@@ -40,6 +41,7 @@ import org.apache.syncope.common.lib.types.ResourceOperation;
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;
@@ -210,11 +212,22 @@ public abstract class AbstractPushResultHandler extends
AbstractSyncopeResultHan
}
}
+ protected void copyDynMembershipConds(final Any any, final AnyUR req) {
+ if (any instanceof Group group && req instanceof GroupUR gur) {
+ Optional.ofNullable(group.getUDynMembership()).
+ ifPresent(udc ->
gur.setUDynMembershipCond(udc.getFIQLCond()));
+
+ group.getADynMemberships().
+ forEach(adc ->
gur.getADynMembershipConds().put(adc.getAnyType().getKey(), adc.getFIQLCond()));
+ }
+ }
+
protected void link(final Any any, final boolean unlink, final
ProvisioningReport result) {
AnyUR req = getAnyUtils().newAnyUR(any.getKey());
req.getResources().add(new StringPatchItem.Builder().
operation(unlink ? PatchOperation.DELETE :
PatchOperation.ADD_REPLACE).
value(profile.getTask().getResource().getKey()).build());
+ copyDynMembershipConds(any, req);
update(req);
@@ -226,6 +239,7 @@ public abstract class AbstractPushResultHandler extends
AbstractSyncopeResultHan
req.getResources().add(new StringPatchItem.Builder().
operation(PatchOperation.DELETE).
value(profile.getTask().getResource().getKey()).build());
+ copyDynMembershipConds(any, req);
update(req);
@@ -237,6 +251,7 @@ public abstract class AbstractPushResultHandler extends
AbstractSyncopeResultHan
req.getResources().add(new StringPatchItem.Builder().
operation(PatchOperation.ADD_REPLACE).
value(profile.getTask().getResource().getKey()).build());
+ copyDynMembershipConds(any, req);
update(req);
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 fc4409dd3f..ac00ef4353 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
@@ -32,6 +32,7 @@ import java.util.Set;
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;
@@ -510,4 +511,36 @@ public class PushTaskITCase extends AbstractTaskITCase {
NotificationTaskTO taskTO =
findNotificationTask(notification.getKey(), 50);
assertNotNull(taskTO);
}
+
+ @Test
+ void issueSYNCOPE1918() throws Exception {
+ // update group citizen
+ GroupUR groupUR = new
GroupUR.Builder("29f96485-729e-4d31-88a1-6fc60e4677f3").
+ udynMembershipCond("username=~ros*").
+ adynMembershipCond(PRINTER, "name=~hp*").
+ build();
+ GroupTO citizen = updateGroup(groupUR).getEntity();
+ assertNotNull(citizen.getUDynMembershipCond());
+ assertFalse(citizen.getADynMembershipConds().isEmpty());
+
+ try {
+ execProvisioningTasks(
+ TASK_SERVICE,
+ TaskType.PUSH,
+ Set.of("fd905ba5-9d56-4f51-83e2-859096a67b75"),
+ MAX_WAIT_SECONDS, false);
+
+ citizen =
GROUP_SERVICE.read("29f96485-729e-4d31-88a1-6fc60e4677f3");
+ assertNotNull(citizen.getUDynMembershipCond());
+ assertFalse(citizen.getADynMembershipConds().isEmpty());
+ } finally {
+ // restore group citizen
+ groupUR.setUDynMembershipCond(null);
+ groupUR.getADynMembershipConds().clear();
+ citizen = updateGroup(groupUR).getEntity();
+
+ assertNull(citizen.getUDynMembershipCond());
+ assertTrue(citizen.getADynMembershipConds().isEmpty());
+ }
+ }
}