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());
+        }
+    }
 }

Reply via email to