This is an automated email from the ASF dual-hosted git repository.

sgarofalo pushed a commit to branch 3_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/3_0_X by this push:
     new 4ba8c30994 [SYNCOPE-1918] Avoided dynamic membership deletion after 
push task execution (#1198)
4ba8c30994 is described below

commit 4ba8c3099467073cf2d08c729ef6f60b6495b89a
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   | 19 ++++++++++++++++
 .../apache/syncope/fit/core/PushTaskITCase.java    | 25 ++++++++++++++++++++++
 2 files changed, 44 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 02d5043d0b..14689fd8e4 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 java.util.stream.Collectors;
 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.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;
@@ -179,6 +181,8 @@ public abstract class AbstractPushResultHandler extends 
AbstractSyncopeResultHan
                 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 @@ public abstract class AbstractPushResultHandler extends 
AbstractSyncopeResultHan
                 operation(PatchOperation.DELETE).
                 value(profile.getTask().getResource().getKey()).build());
 
+        copyDynMembershipConds(any, req);
+    
         update(req);
 
         deprovision(any, beforeObj, result);
@@ -201,11 +207,24 @@ public abstract class AbstractPushResultHandler extends 
AbstractSyncopeResultHan
                 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 9e686ca3f6..00d7e121c7 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.HashMap;
 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 class PushTaskITCase extends AbstractTaskITCase {
         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());
+    }
 }

Reply via email to