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