Skip to content

Commit 3391829

Browse files
SamuelGaroilgrosso
authored andcommitted
[SYNCOPE-1918] Avoided dynamic membership deletion after push task execution (#1198)
1 parent 71d1dd6 commit 3391829

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.commons.lang3.BooleanUtils;
2929
import org.apache.commons.lang3.exception.ExceptionUtils;
3030
import org.apache.syncope.common.lib.request.AnyUR;
31+
import org.apache.syncope.common.lib.request.GroupUR;
3132
import org.apache.syncope.common.lib.request.StringPatchItem;
3233
import org.apache.syncope.common.lib.to.AnyTO;
3334
import org.apache.syncope.common.lib.to.Provision;
@@ -40,6 +41,7 @@
4041
import org.apache.syncope.common.lib.types.UnmatchingRule;
4142
import org.apache.syncope.core.persistence.api.entity.Any;
4243
import org.apache.syncope.core.persistence.api.entity.ExternalResource;
44+
import org.apache.syncope.core.persistence.api.entity.group.Group;
4345
import org.apache.syncope.core.persistence.api.entity.task.PushTask;
4446
import org.apache.syncope.core.persistence.api.entity.user.User;
4547
import org.apache.syncope.core.provisioning.api.AuditManager;
@@ -210,11 +212,22 @@ protected void provision(final Any any, final Boolean enable, final Provisioning
210212
}
211213
}
212214

215+
protected void copyDynMembershipConds(final Any any, final AnyUR req) {
216+
if (any instanceof Group group && req instanceof GroupUR gur) {
217+
Optional.ofNullable(group.getUDynMembership()).
218+
ifPresent(udc -> gur.setUDynMembershipCond(udc.getFIQLCond()));
219+
220+
group.getADynMemberships().
221+
forEach(adc -> gur.getADynMembershipConds().put(adc.getAnyType().getKey(), adc.getFIQLCond()));
222+
}
223+
}
224+
213225
protected void link(final Any any, final boolean unlink, final ProvisioningReport result) {
214226
AnyUR req = getAnyUtils().newAnyUR(any.getKey());
215227
req.getResources().add(new StringPatchItem.Builder().
216228
operation(unlink ? PatchOperation.DELETE : PatchOperation.ADD_REPLACE).
217229
value(profile.getTask().getResource().getKey()).build());
230+
copyDynMembershipConds(any, req);
218231

219232
update(req);
220233

@@ -226,6 +239,7 @@ protected void unassign(final Any any, final ConnectorObject beforeObj, final Pr
226239
req.getResources().add(new StringPatchItem.Builder().
227240
operation(PatchOperation.DELETE).
228241
value(profile.getTask().getResource().getKey()).build());
242+
copyDynMembershipConds(any, req);
229243

230244
update(req);
231245

@@ -237,6 +251,7 @@ protected void assign(final Any any, final Boolean enabled, final ProvisioningRe
237251
req.getResources().add(new StringPatchItem.Builder().
238252
operation(PatchOperation.ADD_REPLACE).
239253
value(profile.getTask().getResource().getKey()).build());
254+
copyDynMembershipConds(any, req);
240255

241256
update(req);
242257

fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.apache.syncope.client.lib.SyncopeClient;
3333
import org.apache.syncope.common.lib.SyncopeConstants;
3434
import org.apache.syncope.common.lib.request.GroupCR;
35+
import org.apache.syncope.common.lib.request.GroupUR;
3536
import org.apache.syncope.common.lib.to.AnyTypeClassTO;
3637
import org.apache.syncope.common.lib.to.ExecTO;
3738
import org.apache.syncope.common.lib.to.GroupTO;
@@ -510,4 +511,36 @@ public void issueSYNCOPE648() {
510511
NotificationTaskTO taskTO = findNotificationTask(notification.getKey(), 50);
511512
assertNotNull(taskTO);
512513
}
514+
515+
@Test
516+
void issueSYNCOPE1918() throws Exception {
517+
// update group citizen
518+
GroupUR groupUR = new GroupUR.Builder("29f96485-729e-4d31-88a1-6fc60e4677f3").
519+
udynMembershipCond("username=~ros*").
520+
adynMembershipCond(PRINTER, "name=~hp*").
521+
build();
522+
GroupTO citizen = updateGroup(groupUR).getEntity();
523+
assertNotNull(citizen.getUDynMembershipCond());
524+
assertFalse(citizen.getADynMembershipConds().isEmpty());
525+
526+
try {
527+
execProvisioningTasks(
528+
TASK_SERVICE,
529+
TaskType.PUSH,
530+
Set.of("fd905ba5-9d56-4f51-83e2-859096a67b75"),
531+
MAX_WAIT_SECONDS, false);
532+
533+
citizen = GROUP_SERVICE.read("29f96485-729e-4d31-88a1-6fc60e4677f3");
534+
assertNotNull(citizen.getUDynMembershipCond());
535+
assertFalse(citizen.getADynMembershipConds().isEmpty());
536+
} finally {
537+
// restore group citizen
538+
groupUR.setUDynMembershipCond(null);
539+
groupUR.getADynMembershipConds().clear();
540+
citizen = updateGroup(groupUR).getEntity();
541+
542+
assertNull(citizen.getUDynMembershipCond());
543+
assertTrue(citizen.getADynMembershipConds().isEmpty());
544+
}
545+
}
513546
}

0 commit comments

Comments
 (0)