This is an automated email from the ASF dual-hosted git repository. ilgrosso pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/syncope.git
commit a957165d30bb33a00f00dcd98c4d9ee7da407538 Author: Francesco Chicchiriccò <[email protected]> AuthorDate: Fri Aug 21 18:07:22 2026 +0200 Setting JexlPermissions --- .../client/console/panels/UserDirectoryPanel.java | 4 +- .../client/console/wizards/any/Management.java | 30 +++---- .../apache/syncope/common/lib/AnyOperations.java | 32 ++++---- .../apache/syncope/common/lib/EntityTOUtils.java | 8 +- .../apache/syncope/common/lib/request/AnyCR.java | 12 +-- .../apache/syncope/common/lib/request/AnyUR.java | 12 +-- .../apache/syncope/common/lib/request/UserCR.java | 4 +- .../apache/syncope/common/lib/request/UserUR.java | 4 +- .../org/apache/syncope/common/lib/to/AnyTO.java | 8 +- .../core/persistence/api/dao/AnyChecker.java | 38 ++++----- .../syncope/core/persistence/api/entity/Any.java | 8 +- .../core/persistence/api/entity/user/Account.java | 2 +- .../core/persistence/jpa/entity/AbstractAny.java | 8 +- .../core/persistence/jpa/outer/GroupTest.java | 8 +- .../neo4j/dao/repo/AnyObjectRepoExtImpl.java | 8 +- .../neo4j/dao/repo/GroupRepoExtImpl.java | 8 +- .../neo4j/dao/repo/UserRepoExtImpl.java | 8 +- .../core/persistence/neo4j/entity/AbstractAny.java | 8 +- .../core/persistence/neo4j/outer/GroupTest.java | 8 +- .../core/provisioning/api/jexl/JexlFunctions.java | 1 + .../core/provisioning/api/jexl/JexlTools.java | 41 +++++++-- .../core/provisioning/api/jexl/TemplateUtils.java | 12 +-- .../core/provisioning/api/AbstractTest.java | 3 +- .../{JexlUtilsTest.java => JexlToolsTest.java} | 2 +- .../provisioning/java/DefaultMappingManager.java | 12 +-- .../provisioning/java/ProvisioningContext.java | 3 +- .../core/provisioning/java/data/AnyDataBinder.java | 50 ++++++----- .../java/pushpull/AbstractPullResultHandler.java | 24 +++--- .../core/provisioning/java/JexlToolsTest.java | 96 ++++++++++++++++++++++ .../DefaultNotificationManagerTest.java | 3 +- .../elasticsearch/client/ElasticsearchUtils.java | 4 +- .../ext/opensearch/client/OpenSearchUtils.java | 4 +- .../org/apache/syncope/fit/core/GroupITCase.java | 6 +- .../org/apache/syncope/fit/core/ManagerITCase.java | 8 +- .../apache/syncope/fit/core/PullTaskITCase.java | 4 +- .../apache/syncope/fit/core/UserIssuesITCase.java | 18 ++-- 36 files changed, 316 insertions(+), 193 deletions(-) diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java index 3fa73757b2..774f4e5324 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java @@ -220,7 +220,7 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED)); target.add(container); } catch (Exception e) { - LOG.error("While requesting password reject for {}", model.getObject().getUManager(), e); + LOG.error("While requesting password reject for {}", model.getObject().getuManager(), e); SyncopeConsoleSession.get().onException(e); } ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target); @@ -241,7 +241,7 @@ public class UserDirectoryPanel extends AnyDirectoryPanel<UserTO, UserRestClient SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED)); target.add(container); } catch (Exception e) { - LOG.error("While dismissing MFA for {}", model.getObject().getUManager(), e); + LOG.error("While dismissing MFA for {}", model.getObject().getuManager(), e); SyncopeConsoleSession.get().onException(e); } ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target); diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/Management.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/Management.java index a481486d64..bdbebfd677 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/Management.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/Management.java @@ -117,7 +117,7 @@ public class Management extends WizardStep implements ICondition { setTitleModel(new ResourceModel("manager")); this.wrapper = anyWrapper; - isGManager = Model.of(anyWrapper.getInnerObject().getGManager() != null); + isGManager = Model.of(anyWrapper.getInnerObject().getgManager() != null); BootstrapToggleConfig config = new BootstrapToggleConfig(). withOnStyle(BootstrapToggleConfig.Style.info). @@ -213,11 +213,11 @@ public class Management extends WizardStep implements ICondition { @Override public String getObject() { - if (anyWrapper.getInnerObject().getUManager() == null) { + if (anyWrapper.getInnerObject().getuManager() == null) { return StringUtils.EMPTY; } - UserTO userTO = userRestClient.read(anyWrapper.getInnerObject().getUManager()); + UserTO userTO = userRestClient.read(anyWrapper.getInnerObject().getuManager()); if (userTO == null) { return StringUtils.EMPTY; } @@ -228,11 +228,11 @@ public class Management extends WizardStep implements ICondition { @Override public void setObject(final String object) { if (StringUtils.isBlank(object)) { - anyWrapper.getInnerObject().setUManager(null); + anyWrapper.getInnerObject().setuManager(null); } else { Matcher matcher = manager.matcher(object); if (matcher.matches()) { - anyWrapper.getInnerObject().setUManager(matcher.group(1)); + anyWrapper.getInnerObject().setuManager(matcher.group(1)); } } } @@ -262,10 +262,10 @@ public class Management extends WizardStep implements ICondition { @Override public String getObject() { - if (anyWrapper.getInnerObject().getGManager() == null) { + if (anyWrapper.getInnerObject().getgManager() == null) { return StringUtils.EMPTY; } else { - GroupTO groupTO = groupRestClient.read(anyWrapper.getInnerObject().getGManager()); + GroupTO groupTO = groupRestClient.read(anyWrapper.getInnerObject().getgManager()); if (groupTO == null) { return StringUtils.EMPTY; } else { @@ -277,11 +277,11 @@ public class Management extends WizardStep implements ICondition { @Override public void setObject(final String object) { if (StringUtils.isBlank(object)) { - anyWrapper.getInnerObject().setGManager(null); + anyWrapper.getInnerObject().setgManager(null); } else { final Matcher matcher = manager.matcher(object); if (matcher.matches()) { - anyWrapper.getInnerObject().setGManager(matcher.group(1)); + anyWrapper.getInnerObject().setgManager(matcher.group(1)); } } } @@ -322,14 +322,14 @@ public class Management extends WizardStep implements ICondition { } else if (event.getPayload() instanceof final AnySelectionDirectoryPanel.ItemSelection<?> itemSelection) { AnyTO sel = itemSelection.getSelection(); if (sel == null) { - wrapper.getInnerObject().setUManager(null); - wrapper.getInnerObject().setGManager(null); + wrapper.getInnerObject().setuManager(null); + wrapper.getInnerObject().setgManager(null); } else if (sel instanceof UserTO) { - wrapper.getInnerObject().setUManager(sel.getKey()); - wrapper.getInnerObject().setGManager(null); + wrapper.getInnerObject().setuManager(sel.getKey()); + wrapper.getInnerObject().setgManager(null); } else if (sel instanceof GroupTO) { - wrapper.getInnerObject().setUManager(null); - wrapper.getInnerObject().setGManager(sel.getKey()); + wrapper.getInnerObject().setuManager(null); + wrapper.getInnerObject().setgManager(sel.getKey()); } itemSelection.getTarget().add(managerContainer); } else { diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java index 7b086202fb..d371d12ff8 100644 --- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java +++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java @@ -123,29 +123,29 @@ public final class AnyOperations { result.setRealm(replacePatchItem(updated.getRealm(), original.getRealm(), new StringReplacePatchItem())); // 2. manager - if (updated.getUManager() != null || original.getUManager() != null) { + if (updated.getuManager() != null || original.getuManager() != null) { StringReplacePatchItem uManager = new StringReplacePatchItem(); - if (updated.getUManager() == null) { + if (updated.getuManager() == null) { if (!incremental) { uManager.setOperation(PatchOperation.DELETE); - result.setUManager(uManager); + result.setuManager(uManager); } - } else if (!updated.getUManager().equals(original.getUManager())) { - uManager.setValue(updated.getUManager()); - result.setUManager(uManager); + } else if (!updated.getuManager().equals(original.getuManager())) { + uManager.setValue(updated.getuManager()); + result.setuManager(uManager); } } - if (updated.getGManager() != null || original.getGManager() != null) { + if (updated.getgManager() != null || original.getgManager() != null) { StringReplacePatchItem gManager = new StringReplacePatchItem(); - if (updated.getGManager() == null) { + if (updated.getgManager() == null) { if (!incremental) { gManager.setOperation(PatchOperation.DELETE); - result.setGManager(gManager); + result.setgManager(gManager); } - } else if (!updated.getGManager().equals(original.getGManager())) { - gManager.setValue(updated.getGManager()); - result.setGManager(gManager); + } else if (!updated.getgManager().equals(original.getgManager())) { + gManager.setValue(updated.getgManager()); + result.setgManager(gManager); } } @@ -406,11 +406,11 @@ public final class AnyOperations { } // 1. manager - if (req.getUManager() != null) { - result.setUManager(req.getUManager().getValue()); + if (req.getuManager() != null) { + result.setuManager(req.getuManager().getValue()); } - if (req.getGManager() != null) { - result.setGManager(req.getGManager().getValue()); + if (req.getgManager() != null) { + result.setgManager(req.getgManager().getValue()); } // 2. auxiliary classes diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java index cb41968f09..b810721a2c 100644 --- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java +++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java @@ -65,8 +65,8 @@ public final class EntityTOUtils { public static <A extends AnyTO, C extends AnyCR> void toAnyCR(final A anyTO, final C anyCR) { anyCR.setRealm(anyTO.getRealm()); - anyCR.setUManager(anyTO.getUManager()); - anyCR.setGManager(anyTO.getGManager()); + anyCR.setuManager(anyTO.getuManager()); + anyCR.setgManager(anyTO.getgManager()); anyCR.getAuxClasses().addAll(anyTO.getAuxClasses()); anyCR.getPlainAttrs().addAll(anyTO.getPlainAttrs()); anyCR.getResources().addAll(anyTO.getResources()); @@ -91,8 +91,8 @@ public final class EntityTOUtils { public static <C extends AnyCR, A extends AnyTO> void toAnyTO(final C anyCR, final A anyTO) { anyTO.setRealm(anyCR.getRealm()); - anyTO.setUManager(anyCR.getUManager()); - anyTO.setGManager(anyCR.getGManager()); + anyTO.setuManager(anyCR.getuManager()); + anyTO.setgManager(anyCR.getgManager()); anyTO.getAuxClasses().addAll(anyCR.getAuxClasses()); anyTO.getPlainAttrs().addAll(anyCR.getPlainAttrs()); anyTO.getResources().addAll(anyCR.getResources()); diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyCR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyCR.java index d7c0e77dee..a21bab0a96 100644 --- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyCR.java +++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyCR.java @@ -63,13 +63,13 @@ public abstract class AnyCR implements BaseBean, RealmMember, RelatableTO { @SuppressWarnings("unchecked") public B uManager(final String uManager) { - getInstance().setUManager(uManager); + getInstance().setuManager(uManager); return (B) this; } @SuppressWarnings("unchecked") public B gManager(final String gManager) { - getInstance().setGManager(gManager); + getInstance().setgManager(gManager); return (B) this; } @@ -185,19 +185,19 @@ public abstract class AnyCR implements BaseBean, RealmMember, RelatableTO { this.realm = realm; } - public String getUManager() { + public String getuManager() { return uManager; } - public void setUManager(final String uManager) { + public void setuManager(final String uManager) { this.uManager = uManager; } - public String getGManager() { + public String getgManager() { return gManager; } - public void setGManager(final String gManager) { + public void setgManager(final String gManager) { this.gManager = gManager; } diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyUR.java index a3c18fb0fb..7b29a19578 100644 --- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyUR.java +++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/AnyUR.java @@ -64,13 +64,13 @@ public abstract class AnyUR implements BaseBean { @SuppressWarnings("unchecked") public B uManager(final StringReplacePatchItem uManager) { - getInstance().setUManager(uManager); + getInstance().setuManager(uManager); return (B) this; } @SuppressWarnings("unchecked") public B gManager(final StringReplacePatchItem gManager) { - getInstance().setGManager(gManager); + getInstance().setgManager(gManager); return (B) this; } @@ -195,19 +195,19 @@ public abstract class AnyUR implements BaseBean { this.realm = realm; } - public StringReplacePatchItem getUManager() { + public StringReplacePatchItem getuManager() { return uManager; } - public void setUManager(final StringReplacePatchItem uManager) { + public void setuManager(final StringReplacePatchItem uManager) { this.uManager = uManager; } - public StringReplacePatchItem getGManager() { + public StringReplacePatchItem getgManager() { return gManager; } - public void setGManager(final StringReplacePatchItem gManager) { + public void setgManager(final StringReplacePatchItem gManager) { this.gManager = gManager; } diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserCR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserCR.java index 0fe8dae439..fefca338a7 100644 --- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserCR.java +++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserCR.java @@ -219,8 +219,8 @@ public class UserCR extends AnyCR implements GroupableRelatableTO { @JsonIgnore public boolean requiresApproval() { - return getUManager() != null - || getGManager() != null + return getuManager() != null + || getgManager() != null || !getResources().isEmpty() || !getRelationships().isEmpty() || !memberships.isEmpty() diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserUR.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserUR.java index 7e33b9dad3..71bab24a8e 100644 --- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserUR.java +++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/request/UserUR.java @@ -197,8 +197,8 @@ public class UserUR extends AnyUR { @JsonIgnore public boolean requiresApproval() { - return getUManager() != null - || getGManager() != null + return getuManager() != null + || getgManager() != null || !getResources().isEmpty() || !getRelationships().isEmpty() || !memberships.isEmpty() diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java index b92d5d522c..8d8853b3c5 100644 --- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java +++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java @@ -183,19 +183,19 @@ public abstract class AnyTO implements EntityTO, RealmMember, RelatableTO { this.realm = realm; } - public String getUManager() { + public String getuManager() { return uManager; } - public void setUManager(final String uManager) { + public void setuManager(final String uManager) { this.uManager = uManager; } - public String getGManager() { + public String getgManager() { return gManager; } - public void setGManager(final String gManager) { + public void setgManager(final String gManager) { this.gManager = gManager; } diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyChecker.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyChecker.java index cb03c89854..f7eb9d3e44 100644 --- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyChecker.java +++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyChecker.java @@ -91,14 +91,14 @@ public class AnyChecker { gTypeExtensionClasses.entrySet().stream().peek( entry -> result.memberships().put(entry.getKey(), new HashSet<>())). forEach(entry -> entry.getValue().forEach(typeClass -> { - if (reference.equals(PlainSchema.class)) { - result.memberships().get(entry.getKey()). - addAll((Collection<? extends S>) typeClass.getPlainSchemas()); - } else if (reference.equals(DerSchema.class)) { - result.memberships().get(entry.getKey()). - addAll((Collection<? extends S>) typeClass.getDerSchemas()); - } - })); + if (reference.equals(PlainSchema.class)) { + result.memberships().get(entry.getKey()). + addAll((Collection<? extends S>) typeClass.getPlainSchemas()); + } else if (reference.equals(DerSchema.class)) { + result.memberships().get(entry.getKey()). + addAll((Collection<? extends S>) typeClass.getDerSchemas()); + } + })); // schemas given by relationship type extensions Map<RelationshipType, List<? extends AnyTypeClass>> rTypeExtensionClasses = new HashMap<>(); @@ -106,25 +106,25 @@ public class AnyChecker { case User user -> user.getRelationships().stream().map(Relationship::getType).distinct(). forEach(rt -> rt.getTypeExtensions(). - forEach(typeExt -> rTypeExtensionClasses.put(rt, typeExt.getAuxClasses()))); + forEach(typeExt -> rTypeExtensionClasses.put(rt, typeExt.getAuxClasses()))); case AnyObject anyObject -> anyObject.getRelationships().stream().map(Relationship::getType).distinct(). forEach(rt -> rt.getTypeExtensions(). - forEach(typeExt -> rTypeExtensionClasses.put(rt, typeExt.getAuxClasses()))); + forEach(typeExt -> rTypeExtensionClasses.put(rt, typeExt.getAuxClasses()))); default -> { } } rTypeExtensionClasses.entrySet().stream().peek( entry -> result.relationshipTypes().put(entry.getKey(), new HashSet<>())). forEach(entry -> entry.getValue().forEach(typeClass -> { - if (reference.equals(PlainSchema.class)) { - result.relationshipTypes().get(entry.getKey()). - addAll((Collection<? extends S>) typeClass.getPlainSchemas()); - } else if (reference.equals(DerSchema.class)) { - result.relationshipTypes().get(entry.getKey()). - addAll((Collection<? extends S>) typeClass.getDerSchemas()); - } - })); + if (reference.equals(PlainSchema.class)) { + result.relationshipTypes().get(entry.getKey()). + addAll((Collection<? extends S>) typeClass.getPlainSchemas()); + } else if (reference.equals(DerSchema.class)) { + result.relationshipTypes().get(entry.getKey()). + addAll((Collection<? extends S>) typeClass.getDerSchemas()); + } + })); return result; } @@ -132,7 +132,7 @@ public class AnyChecker { @Transactional(readOnly = true) public <T extends Attributable> void checkBeforeSave(final T attributable, final AnyUtils anyUtils) { if (attributable instanceof Any any) { - if (any.getUManager() != null && any.getGManager() != null) { + if (any.getuManager() != null && any.getgManager() != null) { throw new InvalidEntityException( anyUtils.anyClass(), EntityViolationType.InvalidManager.propertyPath("manager"), diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java index 3e6e8c4150..a6e6fa828b 100644 --- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java +++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java @@ -57,13 +57,13 @@ public interface Any extends Attributable, Entity { void setRealm(Realm realm); - User getUManager(); + User getuManager(); - void setUManager(User manager); + void setuManager(User manager); - Group getGManager(); + Group getgManager(); - void setGManager(Group manager); + void setgManager(Group manager); String getStatus(); diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/Account.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/Account.java index dc34148856..f6b2fc93b3 100644 --- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/Account.java +++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/Account.java @@ -37,7 +37,7 @@ public interface Account { void setPassword(String password); void setCipherAlgorithm(CipherAlgorithm cipherAlgorithm); - + Boolean isSuspended(); void setSuspended(Boolean suspended); diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java index fcde093020..13f022385e 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java @@ -152,23 +152,23 @@ public abstract class AbstractAny extends AbstractAttributable implements Any { } @Override - public User getUManager() { + public User getuManager() { return uManager; } @Override - public void setUManager(final User manager) { + public void setuManager(final User manager) { checkType(manager, JPAUser.class); this.uManager = (JPAUser) manager; } @Override - public Group getGManager() { + public Group getgManager() { return gManager; } @Override - public void setGManager(final Group manager) { + public void setgManager(final Group manager) { checkType(manager, JPAGroup.class); this.gManager = (JPAGroup) manager; } diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java index d77a6784dd..d7129e1ac2 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java @@ -136,8 +136,8 @@ public class GroupTest extends AbstractTest { Group group = entityFactory.newEntity(Group.class); group.setRealm(realmDAO.getRoot()); group.setName("error"); - group.setUManager(user); - group.setGManager(root); + group.setuManager(user); + group.setgManager(root); groupDAO.save(group); }); @@ -149,7 +149,7 @@ public class GroupTest extends AbstractTest { User user = userDAO.findById("823074dc-d280-436d-a7dd-07399fae48ec").orElseThrow(); - assertEquals(user, group.getUManager()); + assertEquals(user, group.getuManager()); List<Group> managed = userDAO.findManagedGroups(user.getKey()); assertFalse(managed.isEmpty()); @@ -163,7 +163,7 @@ public class GroupTest extends AbstractTest { Group group = entityFactory.newEntity(Group.class); group.setRealm(realmDAO.getRoot()); group.setName("error"); - group.setGManager(root); + group.setgManager(root); group = groupDAO.save(group); entityManager.flush(); diff --git a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/AnyObjectRepoExtImpl.java b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/AnyObjectRepoExtImpl.java index 38a5002c5c..dacb8ddb6e 100644 --- a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/AnyObjectRepoExtImpl.java +++ b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/AnyObjectRepoExtImpl.java @@ -246,20 +246,20 @@ public class AnyObjectRepoExtImpl extends AbstractAnyRepoExt<AnyObject, Neo4jAny anyObject.getKey(), auxClass.getKey(), Neo4jAnyObject.ANY_OBJECT_AUX_CLASSES_REL)); - if (before.getUManager() != null && anyObject.getUManager() == null) { + if (before.getuManager() != null && anyObject.getuManager() == null) { deleteRelationship( Neo4jAnyObject.NODE, Neo4jUser.NODE, anyObject.getKey(), - before.getUManager().getKey(), + before.getuManager().getKey(), Neo4jGroup.USER_MANAGER_REL); } - if (before.getGManager() != null && anyObject.getGManager() == null) { + if (before.getgManager() != null && anyObject.getgManager() == null) { deleteRelationship( Neo4jAnyObject.NODE, Neo4jGroup.NODE, anyObject.getKey(), - before.getGManager().getKey(), + before.getgManager().getKey(), Neo4jGroup.GROUP_MANAGER_REL); } diff --git a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/GroupRepoExtImpl.java b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/GroupRepoExtImpl.java index 37f64d1f2f..5a06fd0624 100644 --- a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/GroupRepoExtImpl.java +++ b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/GroupRepoExtImpl.java @@ -275,20 +275,20 @@ public class GroupRepoExtImpl extends AbstractAnyRepoExt<Group, Neo4jGroup> impl group.getKey(), auxClass.getKey(), Neo4jGroup.GROUP_AUX_CLASSES_REL)); - if (before.getUManager() != null && group.getUManager() == null) { + if (before.getuManager() != null && group.getuManager() == null) { deleteRelationship( Neo4jGroup.NODE, Neo4jUser.NODE, group.getKey(), - before.getUManager().getKey(), + before.getuManager().getKey(), AbstractAny.USER_MANAGER_REL); } - if (before.getGManager() != null && group.getGManager() == null) { + if (before.getgManager() != null && group.getgManager() == null) { deleteRelationship( Neo4jGroup.NODE, Neo4jGroup.NODE, group.getKey(), - before.getGManager().getKey(), + before.getgManager().getKey(), AbstractAny.GROUP_MANAGER_REL); } diff --git a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/UserRepoExtImpl.java b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/UserRepoExtImpl.java index c8921ee267..b5759830f0 100644 --- a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/UserRepoExtImpl.java +++ b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/UserRepoExtImpl.java @@ -335,20 +335,20 @@ public class UserRepoExtImpl extends AbstractAnyRepoExt<User, Neo4jUser> impleme user.getKey(), auxClass.getKey(), Neo4jUser.USER_AUX_CLASSES_REL)); - if (before.getUManager() != null && user.getUManager() == null) { + if (before.getuManager() != null && user.getuManager() == null) { deleteRelationship( Neo4jUser.NODE, Neo4jUser.NODE, user.getKey(), - before.getUManager().getKey(), + before.getuManager().getKey(), AbstractAny.USER_MANAGER_REL); } - if (before.getGManager() != null && user.getGManager() == null) { + if (before.getgManager() != null && user.getgManager() == null) { deleteRelationship( Neo4jUser.NODE, Neo4jGroup.NODE, user.getKey(), - before.getGManager().getKey(), + before.getgManager().getKey(), AbstractAny.GROUP_MANAGER_REL); } if (before.getSecurityQuestion() != null && user.getSecurityQuestion() == null) { diff --git a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/entity/AbstractAny.java b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/entity/AbstractAny.java index 683a708048..fa96de5ab7 100644 --- a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/entity/AbstractAny.java +++ b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/entity/AbstractAny.java @@ -153,23 +153,23 @@ public abstract class AbstractAny extends AbstractAttributable implements Any { } @Override - public User getUManager() { + public User getuManager() { return uManager; } @Override - public void setUManager(final User uManager) { + public void setuManager(final User uManager) { checkType(uManager, Neo4jUser.class); this.uManager = (Neo4jUser) uManager; } @Override - public Group getGManager() { + public Group getgManager() { return gManager; } @Override - public void setGManager(final Group gManager) { + public void setgManager(final Group gManager) { checkType(gManager, Neo4jGroup.class); this.gManager = (Neo4jGroup) gManager; } diff --git a/core/persistence-neo4j/src/test/java/org/apache/syncope/core/persistence/neo4j/outer/GroupTest.java b/core/persistence-neo4j/src/test/java/org/apache/syncope/core/persistence/neo4j/outer/GroupTest.java index 553077cad3..7510fd30a9 100644 --- a/core/persistence-neo4j/src/test/java/org/apache/syncope/core/persistence/neo4j/outer/GroupTest.java +++ b/core/persistence-neo4j/src/test/java/org/apache/syncope/core/persistence/neo4j/outer/GroupTest.java @@ -134,8 +134,8 @@ public class GroupTest extends AbstractTest { Group group = entityFactory.newEntity(Group.class); group.setRealm(realmDAO.getRoot()); group.setName("error"); - group.setUManager(user); - group.setGManager(root); + group.setuManager(user); + group.setgManager(root); groupDAO.save(group); }); @@ -147,7 +147,7 @@ public class GroupTest extends AbstractTest { User user = userDAO.findById("823074dc-d280-436d-a7dd-07399fae48ec").orElseThrow(); - assertEquals(user, group.getUManager()); + assertEquals(user, group.getuManager()); List<Group> managed = userDAO.findManagedGroups(user.getKey()); assertFalse(managed.isEmpty()); @@ -161,7 +161,7 @@ public class GroupTest extends AbstractTest { Group group = entityFactory.newEntity(Group.class); group.setRealm(realmDAO.getRoot()); group.setName("error"); - group.setGManager(root); + group.setgManager(root); group = groupDAO.save(group); List<Group> managed = groupDAO.findManagedGroups(root.getKey()); diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/JexlFunctions.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/JexlFunctions.java index 56fd253091..72d18e859c 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/JexlFunctions.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/JexlFunctions.java @@ -18,6 +18,7 @@ */ package org.apache.syncope.core.provisioning.api.jexl; +@FunctionalInterface public interface JexlFunctions { String getNamespace(); diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/JexlTools.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/JexlTools.java index 7f622c168f..1d95d161e1 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/JexlTools.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/JexlTools.java @@ -26,6 +26,7 @@ import org.apache.commons.jexl3.JexlEngine; import org.apache.commons.jexl3.JexlException; import org.apache.commons.jexl3.JexlExpression; import org.apache.commons.jexl3.JxltEngine; +import org.apache.commons.jexl3.introspection.JexlPermissions; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.core.persistence.api.entity.Any; import org.apache.syncope.core.persistence.api.entity.Attributable; @@ -43,6 +44,41 @@ public class JexlTools { protected static final Logger LOG = LoggerFactory.getLogger(JexlTools.class); + public static final JexlPermissions DEFAULT_PERMISSIONS = JexlPermissions.RESTRICTED.compose( + "java.time.*", + "org.apache.syncope.* ", + "org.apache.syncope.core.persistence.jpa.entity.user { -JPAUser { " + + "getCipherAlgorithm(); " + + "getPassword(); " + + "getPasswordHistory(); " + + "getSecurityAnswer(); " + + "getMfa(); " + + "getToken(); " + + "getTokenExpireTime(); " + + "} }", + "org.apache.syncope.core.persistence.jpa.entity.user { -JPALinkedAccount { " + + "getPassword(); " + + "} }", + "org.apache.syncope.core.persistence.neo4j.entity.user { -Neo4jUser { " + + "getCipherAlgorithm(); " + + "getPassword(); " + + "getPasswordHistory(); " + + "getSecurityAnswer(); " + + "getMfa(); " + + "getToken(); " + + "getTokenExpireTime(); " + + "} }", + "org.apache.syncope.core.persistence.neo4j.entity.user { -Neo4jLinkedAccount { " + + "getPassword(); " + + "} }", + "org.apache.syncope.common.lib.to { -UserTO { " + + "getPassword(); " + + "} }", + "org.apache.syncope.common.lib.to { -LinkedAccountTO { " + + "getPassword(); " + + "} }" + ); + protected final JexlEngine jexlEngine; protected final JxltEngine jxltEngine; @@ -52,11 +88,6 @@ public class JexlTools { this.jxltEngine = jexlEngine.createJxltEngine(false); } - public JexlTools(final JexlEngine jexlEngine, final JxltEngine jxltEngine) { - this.jexlEngine = jexlEngine; - this.jxltEngine = jxltEngine; - } - public boolean isExpressionValid(final String expression) { boolean result; try { diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/TemplateUtils.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/TemplateUtils.java index 42d9dcdf89..a17f5a310f 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/TemplateUtils.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/TemplateUtils.java @@ -161,22 +161,22 @@ public class TemplateUtils { fill(realmMember, template, jexlContext); - Optional.ofNullable(template.getUManager()).flatMap(userDAO::findById).ifPresent(uManager -> { + Optional.ofNullable(template.getuManager()).flatMap(userDAO::findById).ifPresent(uManager -> { switch (realmMember) { case AnyTO arm -> - arm.setUManager(uManager.getKey()); + arm.setuManager(uManager.getKey()); case AnyCR arm -> - arm.setGManager(uManager.getKey()); + arm.setgManager(uManager.getKey()); default -> { } } }); - Optional.ofNullable(template.getGManager()).flatMap(groupDAO::findById).ifPresent(gManager -> { + Optional.ofNullable(template.getgManager()).flatMap(groupDAO::findById).ifPresent(gManager -> { switch (realmMember) { case AnyTO arm -> - arm.setUManager(gManager.getKey()); + arm.setuManager(gManager.getKey()); case AnyCR arm -> - arm.setGManager(gManager.getKey()); + arm.setgManager(gManager.getKey()); default -> { } } diff --git a/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/AbstractTest.java b/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/AbstractTest.java index f923b6d3f0..f246b7c583 100644 --- a/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/AbstractTest.java +++ b/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/AbstractTest.java @@ -21,7 +21,6 @@ package org.apache.syncope.core.provisioning.api; import java.util.Map; import org.apache.commons.jexl3.JexlBuilder; import org.apache.commons.jexl3.JexlEngine; -import org.apache.commons.jexl3.introspection.JexlPermissions; import org.apache.syncope.core.provisioning.api.jexl.EmptyClassLoader; import org.apache.syncope.core.provisioning.api.jexl.JexlTools; import org.apache.syncope.core.provisioning.api.jexl.SyncopeJexlFunctions; @@ -40,7 +39,7 @@ public class AbstractTest { protected JexlTools jexlTools() { JexlEngine jexlEngine = new JexlBuilder(). loader(new EmptyClassLoader()). - permissions(JexlPermissions.RESTRICTED.compose("java.time.*", "org.apache.syncope.*")). + permissions(JexlTools.DEFAULT_PERMISSIONS). namespaces(Map.of("syncope", new SyncopeJexlFunctions())). cache(512). silent(false). diff --git a/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/jexl/JexlUtilsTest.java b/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/jexl/JexlToolsTest.java similarity index 99% rename from core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/jexl/JexlUtilsTest.java rename to core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/jexl/JexlToolsTest.java index a31c662ae6..e337bcd096 100644 --- a/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/jexl/JexlUtilsTest.java +++ b/core/provisioning-api/src/test/java/org/apache/syncope/core/provisioning/api/jexl/JexlToolsTest.java @@ -48,7 +48,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.springframework.test.util.ReflectionTestUtils; -public class JexlUtilsTest extends AbstractTest { +class JexlToolsTest extends AbstractTest { @Mock private JexlContext context; diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultMappingManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultMappingManager.java index 9227b9dfb0..9488c439ab 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultMappingManager.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultMappingManager.java @@ -760,11 +760,11 @@ public class DefaultMappingManager implements MappingManager { : null; String managerValue = null; - if (ref.getUManager() != null && uMappingTO != null) { - managerValue = getManagerValue(resource, provision, ref.getUManager()); + if (ref.getuManager() != null && uMappingTO != null) { + managerValue = getManagerValue(resource, provision, ref.getuManager()); } - if (ref.getGManager() != null && gMappingTO != null) { - managerValue = getManagerValue(resource, provision, ref.getGManager()); + if (ref.getgManager() != null && gMappingTO != null) { + managerValue = getManagerValue(resource, provision, ref.getgManager()); } if (StringUtils.isNotBlank(managerValue)) { @@ -1090,11 +1090,11 @@ public class DefaultMappingManager implements MappingManager { } case "uManager" -> { - anyTO.setUManager(values.getFirst().toString()); + anyTO.setuManager(values.getFirst().toString()); } case "gManager" -> { - anyTO.setGManager(values.getFirst().toString()); + anyTO.setgManager(values.getFirst().toString()); } default -> { diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java index 7ad761a991..2abfffed1b 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java @@ -24,7 +24,6 @@ import java.util.function.Function; import java.util.stream.Collectors; import org.apache.commons.jexl3.JexlBuilder; import org.apache.commons.jexl3.JexlEngine; -import org.apache.commons.jexl3.introspection.JexlPermissions; import org.apache.syncope.common.keymaster.client.api.ConfParamOps; import org.apache.syncope.core.persistence.api.DomainHolder; import org.apache.syncope.core.persistence.api.EncryptorManager; @@ -201,7 +200,7 @@ public class ProvisioningContext { public JexlTools jexlTools(final List<JexlFunctions> jexlFunctions) { JexlEngine jexlEngine = new JexlBuilder(). loader(new EmptyClassLoader()). - permissions(JexlPermissions.RESTRICTED.compose("java.time.*", "org.apache.syncope.*")). + permissions(JexlTools.DEFAULT_PERMISSIONS). namespaces(jexlFunctions.stream(). collect(Collectors.toMap(JexlFunctions::getNamespace, Function.identity()))). cache(512). diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyDataBinder.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyDataBinder.java index e6ed35341f..7ae3ba0d17 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyDataBinder.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyDataBinder.java @@ -103,8 +103,8 @@ abstract class AnyDataBinder extends AttributableDataBinder { anyTO.setRealm(any.getRealm().getFullPath()); - Optional.ofNullable(any.getUManager()).map(User::getKey).ifPresent(anyTO::setUManager); - Optional.ofNullable(any.getGManager()).map(Group::getKey).ifPresent(anyTO::setGManager); + Optional.ofNullable(any.getuManager()).map(User::getKey).ifPresent(anyTO::setuManager); + Optional.ofNullable(any.getgManager()).map(Group::getKey).ifPresent(anyTO::setgManager); anyTO.getAuxClasses().addAll(any.getAuxClasses().stream().map(AnyTypeClass::getKey).toList()); @@ -425,38 +425,38 @@ abstract class AnyDataBinder extends AttributableDataBinder { // 0. manager PropagationByResource<String> managerPropByRes = new PropagationByResource<>(); - if (anyUR.getUManager() != null) { - if (anyUR.getUManager().getValue() == null) { - if (any.getUManager() != null) { - any.setUManager(null); + if (anyUR.getuManager() != null) { + if (anyUR.getuManager().getValue() == null) { + if (any.getuManager() != null) { + any.setuManager(null); managerPropByRes.addAll(ResourceOperation.UPDATE, anyUtils.dao().findAllResourceKeys(any.getKey())); } } else { - User manager = userDAO.findById(anyUR.getUManager().getValue()).orElse(null); + User manager = userDAO.findById(anyUR.getuManager().getValue()).orElse(null); if (manager == null) { LOG.debug("Unable to find user manager for {} {} by key {}", - any.getKey(), anyUtils.anyTypeKind(), anyUR.getUManager().getValue()); - any.setUManager(null); + any.getKey(), anyUtils.anyTypeKind(), anyUR.getuManager().getValue()); + any.setuManager(null); } else { - any.setUManager(manager); + any.setuManager(manager); managerPropByRes.addAll(ResourceOperation.UPDATE, anyUtils.dao().findAllResourceKeys(any.getKey())); } } } - if (anyUR.getGManager() != null) { - if (anyUR.getGManager().getValue() == null) { - if (any.getGManager() != null) { - any.setGManager(null); + if (anyUR.getgManager() != null) { + if (anyUR.getgManager().getValue() == null) { + if (any.getgManager() != null) { + any.setgManager(null); managerPropByRes.addAll(ResourceOperation.UPDATE, anyUtils.dao().findAllResourceKeys(any.getKey())); } } else { - Group manager = groupDAO.findById(anyUR.getGManager().getValue()).orElse(null); + Group manager = groupDAO.findById(anyUR.getgManager().getValue()).orElse(null); if (manager == null) { LOG.debug("Unable to find group manager for {} {} by key {}", - any.getKey(), anyUtils.anyTypeKind(), anyUR.getGManager().getValue()); - any.setGManager(null); + any.getKey(), anyUtils.anyTypeKind(), anyUR.getgManager().getValue()); + any.setgManager(null); } else { - any.setGManager(manager); + any.setgManager(manager); managerPropByRes.addAll(ResourceOperation.UPDATE, anyUtils.dao().findAllResourceKeys(any.getKey())); } } @@ -648,15 +648,13 @@ abstract class AnyDataBinder extends AttributableDataBinder { // 0. manager // owner - if (anyCR.getUManager() != null) { - userDAO.findById(anyCR.getUManager()).ifPresentOrElse( - any::setUManager, - () -> LOG.warn("Ignoring invalid user specified as manager: {}", anyCR.getUManager())); + if (anyCR.getuManager() != null) { + userDAO.findById(anyCR.getuManager()).ifPresentOrElse(any::setuManager, + () -> LOG.warn("Ignoring invalid user specified as manager: {}", anyCR.getuManager())); } - if (anyCR.getGManager() != null) { - groupDAO.findById(anyCR.getGManager()).ifPresentOrElse( - any::setGManager, - () -> LOG.warn("Ignoring invalid group specified as manager: {}", anyCR.getGManager())); + if (anyCR.getgManager() != null) { + groupDAO.findById(anyCR.getgManager()).ifPresentOrElse(any::setgManager, + () -> LOG.warn("Ignoring invalid group specified as manager: {}", anyCR.getgManager())); } // 1. aux classes diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java index 8096146912..0ff7ab4820 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java @@ -238,10 +238,10 @@ public abstract class AbstractPullResultHandler } result.setName(getName(req)); - Optional<String> uManager = Optional.ofNullable(req.getUManager()); - req.setUManager(null); - Optional<String> gManager = Optional.ofNullable(req.getGManager()); - req.setGManager(null); + Optional<String> uManager = Optional.ofNullable(req.getuManager()); + req.setuManager(null); + Optional<String> gManager = Optional.ofNullable(req.getgManager()); + req.setgManager(null); AnyTO created = doCreate(req, delta); output = created; @@ -358,14 +358,14 @@ public abstract class AbstractPullResultHandler action.beforeUpdate(profile, delta, before, req); } - Optional.ofNullable(req.getUManager()).ifPresent(patch -> uManagers.put( + Optional.ofNullable(req.getuManager()).ifPresent(patch -> uManagers.put( before.getKey(), Optional.ofNullable(patch.getValue()))); - req.setUManager(null); - Optional.ofNullable(req.getGManager()).ifPresent(patch -> gManagers.put( + req.setuManager(null); + Optional.ofNullable(req.getgManager()).ifPresent(patch -> gManagers.put( before.getKey(), Optional.ofNullable(patch.getValue()))); - req.setGManager(null); + req.setgManager(null); req = doUpdate(before, req, delta, result); AnyTO updated = AnyOperations.patch(before, req); @@ -1018,8 +1018,8 @@ public abstract class AbstractPullResultHandler manager, profile.getTask().getResource(), profile.getConnector()). - ifPresent(match -> any.setUManager((User) match.getAny())), - () -> any.setUManager(null)); + ifPresent(match -> any.setuManager((User) match.getAny())), + () -> any.setuManager(null)); anyUtils().dao().save(any); }); @@ -1033,8 +1033,8 @@ public abstract class AbstractPullResultHandler manager, profile.getTask().getResource(), profile.getConnector()). - ifPresent(match -> any.setGManager((Group) match.getAny())), - () -> any.setGManager(null)); + ifPresent(match -> any.setgManager((Group) match.getAny())), + () -> any.setgManager(null)); anyUtils().dao().save(any); }); diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/JexlToolsTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/JexlToolsTest.java new file mode 100644 index 0000000000..63bc485498 --- /dev/null +++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/JexlToolsTest.java @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.core.provisioning.java; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Map; +import org.apache.commons.jexl3.JexlContext; +import org.apache.commons.jexl3.MapContext; +import org.apache.syncope.common.lib.to.MembershipTO; +import org.apache.syncope.common.lib.to.UserTO; +import org.apache.syncope.core.persistence.api.entity.EntityFactory; +import org.apache.syncope.core.persistence.api.entity.group.Group; +import org.apache.syncope.core.persistence.api.entity.user.UMembership; +import org.apache.syncope.core.persistence.api.entity.user.User; +import org.apache.syncope.core.provisioning.api.jexl.JexlContextBuilder; +import org.apache.syncope.core.provisioning.api.jexl.JexlTools; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class JexlToolsTest extends AbstractTest { + + @Autowired + private EntityFactory entityFactory; + + @Autowired + private JexlTools jexlTools; + + @Test + void permissionFields() { + UserTO userTO = new UserTO(); + userTO.setUsername("username1"); + userTO.setPassword("userPassword1"); + + JexlContext ctx = new JexlContextBuilder().fields(userTO).build(); + + assertEquals("username1/", jexlTools.evaluateExpression("username + '/' + password", ctx)); + } + + @Test + void permissionTemplate() { + UserTO userTO = new UserTO(); + userTO.setUsername("username1"); + userTO.setPassword("userPassword1"); + userTO.getMemberships().add(new MembershipTO.Builder("groupKey").groupName("groupName").build()); + + assertEquals( + "I am username1, my password is ''; my group is groupName", + jexlTools.evaluateTemplate( + "I am ${user.username}, my password is '${user.password}'; " + + "my group is ${user.memberships[0].groupName}", + new MapContext(Map.of("user", userTO)))); + + User user = entityFactory.newEntity(User.class); + user.setUsername("username1"); + user.setPassword("password1"); + + Group group = entityFactory.newEntity(Group.class); + group.setName("groupName"); + UMembership membership = entityFactory.newEntity(UMembership.class); + membership.setLeftEnd(user); + membership.setRightEnd(group); + user.add(membership); + + User manager = entityFactory.newEntity(User.class); + manager.setUsername("usernameM1"); + manager.setPassword("passwordM1"); + user.setuManager(manager); + + assertEquals( + "I am username1, my password is ''; " + + "my manager is usernameM1, their password is ''; " + + "my group is groupName", + jexlTools.evaluateTemplate( + "I am ${user.username}, my password is '${user.password}'; " + + "my manager is ${user.uManager.username}, their password is '${user.uManager.password}'; " + + "my group is ${user.memberships[0].rightEnd.name}", + new MapContext(Map.of("user", user)))); + } +} diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/notification/DefaultNotificationManagerTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/notification/DefaultNotificationManagerTest.java index 954650764d..3e456e6e7a 100644 --- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/notification/DefaultNotificationManagerTest.java +++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/notification/DefaultNotificationManagerTest.java @@ -35,7 +35,6 @@ import java.util.Optional; import org.apache.commons.jexl3.JexlBuilder; import org.apache.commons.jexl3.JexlEngine; import org.apache.commons.jexl3.MapContext; -import org.apache.commons.jexl3.introspection.JexlPermissions; import org.apache.syncope.common.keymaster.client.api.ConfParamOps; import org.apache.syncope.common.lib.Attr; import org.apache.syncope.common.lib.SyncopeConstants; @@ -140,7 +139,7 @@ public class DefaultNotificationManagerTest { void init() { JexlEngine jexlEngine = new JexlBuilder(). loader(new EmptyClassLoader()). - permissions(JexlPermissions.RESTRICTED.compose("java.time.*", "org.apache.syncope.*")). + permissions(JexlTools.DEFAULT_PERMISSIONS). namespaces(Map.of("syncope", new SyncopeJexlFunctions())). cache(512). silent(false). diff --git a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java index 6b59cc2bda..bd147b88ed 100644 --- a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java +++ b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java @@ -122,8 +122,8 @@ public class ElasticsearchUtils { builder.put("lastChangeContext", any.getLastChangeContext()); builder.put("status", any.getStatus()); builder.put("auxClasses", any.getAuxClasses().stream().map(AnyTypeClass::getKey).toList()); - Optional.ofNullable(any.getUManager()).ifPresent(um -> builder.put("uManager", um.getKey())); - Optional.ofNullable(any.getGManager()).ifPresent(gm -> builder.put("gManager", gm.getKey())); + Optional.ofNullable(any.getuManager()).ifPresent(um -> builder.put("uManager", um.getKey())); + Optional.ofNullable(any.getgManager()).ifPresent(gm -> builder.put("gManager", gm.getKey())); switch (any) { case AnyObject anyObject -> { diff --git a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchUtils.java b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchUtils.java index b206a4e363..11b0dc28e5 100644 --- a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchUtils.java +++ b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchUtils.java @@ -122,8 +122,8 @@ public class OpenSearchUtils { builder.put("lastChangeContext", any.getLastChangeContext()); builder.put("status", any.getStatus()); builder.put("auxClasses", any.getAuxClasses().stream().map(AnyTypeClass::getKey).toList()); - Optional.ofNullable(any.getUManager()).ifPresent(um -> builder.put("uManager", um.getKey())); - Optional.ofNullable(any.getGManager()).ifPresent(gm -> builder.put("gManager", gm.getKey())); + Optional.ofNullable(any.getuManager()).ifPresent(um -> builder.put("uManager", um.getKey())); + Optional.ofNullable(any.getgManager()).ifPresent(gm -> builder.put("gManager", gm.getKey())); switch (any) { case AnyObject anyObject -> { diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java index c5aa8aac8a..37616a8adf 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java @@ -114,7 +114,7 @@ public class GroupITCase extends AbstractITCase { public void create() { // create group managed by f779c0d4-633b-4be5-8f57-32eb478a3ca5 GroupCR groupCR = getSample("lastGroup"); - groupCR.setGManager("f779c0d4-633b-4be5-8f57-32eb478a3ca5"); + groupCR.setgManager("f779c0d4-633b-4be5-8f57-32eb478a3ca5"); GroupTO groupTO = createGroup(groupCR).getEntity(); assertNotNull(groupTO); @@ -133,9 +133,9 @@ public class GroupITCase extends AbstractITCase { // remove group manager GroupUR groupUR = new GroupUR(); groupUR.setKey(groupTO.getKey()); - groupUR.setGManager(new StringReplacePatchItem.Builder().operation(PatchOperation.DELETE).build()); + groupUR.setgManager(new StringReplacePatchItem.Builder().operation(PatchOperation.DELETE).build()); - assertNull(updateGroup(groupUR).getEntity().getGManager()); + assertNull(updateGroup(groupUR).getEntity().getgManager()); } @Test diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ManagerITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ManagerITCase.java index 498eced672..3c8779c5d9 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ManagerITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ManagerITCase.java @@ -134,10 +134,10 @@ public class ManagerITCase extends AbstractITCase { assertNotNull(manager); GroupCR groupCR = GroupITCase.getSample("uManagerTestGroup"); - groupCR.setUManager(manager.getKey()); + groupCR.setuManager(manager.getKey()); GroupTO group = createGroup(groupCR).getEntity(); assertNotNull(group); - assertEquals(manager.getKey(), group.getUManager()); + assertEquals(manager.getKey(), group.getuManager()); UserCR managedCR = UserITCase.getUniqueSample("[email protected]"); managedCR.getMemberships().add(new MembershipTO.Builder(group.getKey()).build()); @@ -178,9 +178,9 @@ public class ManagerITCase extends AbstractITCase { assertNotNull(manager); UserCR managedCR = UserITCase.getUniqueSample("[email protected]"); - managedCR.setGManager(group.getKey()); + managedCR.setgManager(group.getKey()); UserTO managed = createUser(managedCR).getEntity(); - assertEquals(group.getKey(), managed.getGManager()); + assertEquals(group.getKey(), managed.getgManager()); // check check( diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java index 06f9a1e1d8..3e3ca46122 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java @@ -468,8 +468,8 @@ public class PullTaskITCase extends AbstractTaskITCase { assertEquals("testLDAPGroup", groupTO.getName()); assertTrue(groupTO.getLastChangeContext().contains("Task " + task.getKey())); assertEquals("true", groupTO.getPlainAttr("show").orElseThrow().getValues().getFirst()); - assertEquals(matchingUsers.getResult().getFirst().getKey(), groupTO.getUManager()); - assertNull(groupTO.getGManager()); + assertEquals(matchingUsers.getResult().getFirst().getKey(), groupTO.getuManager()); + assertNull(groupTO.getgManager()); // SYNCOPE-1343, set value title to null on LDAP ConnObject userConnObject = RESOURCE_SERVICE.readConnObject( RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), matchingUsers.getResult().getFirst().getKey()); diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java index fdd564b66b..30109021cb 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java @@ -1913,10 +1913,10 @@ public class UserIssuesITCase extends AbstractITCase { UserCR userCR = UserITCase.getUniqueSample("[email protected]"); userCR.getResources().add(RESOURCE_NAME_TESTDB); userCR.setPassword("Password123!"); - userCR.setUManager(USER_SERVICE.read("puccini").getKey()); + userCR.setuManager(USER_SERVICE.read("puccini").getKey()); ProvisioningResult<UserTO> pr = createUser(userCR); assertEquals(ExecStatus.SUCCESS, pr.getPropagationStatuses().getFirst().getStatus()); - assertNotNull(pr.getEntity().getUManager()); + assertNotNull(pr.getEntity().getuManager()); // 2. pull from resource-testdb PullTaskTO pullTaskTO = new PullTaskTO(); pullTaskTO.setPerformCreate(true); @@ -1929,17 +1929,17 @@ public class UserIssuesITCase extends AbstractITCase { .build(), pullTaskTO); // user manager should be kept UserTO updatedUser = USER_SERVICE.read(pr.getEntity().getKey()); - assertNotNull(updatedUser.getUManager()); - assertEquals(USER_SERVICE.read("puccini").getKey(), updatedUser.getUManager()); + assertNotNull(updatedUser.getuManager()); + assertEquals(USER_SERVICE.read("puccini").getKey(), updatedUser.getuManager()); // perform the same check on a group GroupCR groupCR = GroupITCase.getSample("issue1965grp"); groupCR.getResources().add(RESOURCE_NAME_LDAP); - groupCR.setGManager(GROUP_SERVICE.read("managingDirector").getKey()); + groupCR.setgManager(GROUP_SERVICE.read("managingDirector").getKey()); ProvisioningResult<GroupTO> prGrp = createGroup(groupCR); assertEquals(ExecStatus.SUCCESS, prGrp.getPropagationStatuses().getFirst().getStatus()); - assertNotNull(prGrp.getEntity().getGManager()); - assertEquals(GROUP_SERVICE.read("managingDirector").getKey(), prGrp.getEntity().getGManager()); + assertNotNull(prGrp.getEntity().getgManager()); + assertEquals(GROUP_SERVICE.read("managingDirector").getKey(), prGrp.getEntity().getgManager()); // 2. pull from resource-ldap pullTaskTO = new PullTaskTO(); @@ -1954,7 +1954,7 @@ public class UserIssuesITCase extends AbstractITCase { .build(), pullTaskTO); // group manager should be kept GroupTO updatedGrp = GROUP_SERVICE.read(prGrp.getEntity().getKey()); - assertNotNull(updatedGrp.getGManager()); - assertEquals(GROUP_SERVICE.read("managingDirector").getKey(), updatedGrp.getGManager()); + assertNotNull(updatedGrp.getgManager()); + assertEquals(GROUP_SERVICE.read("managingDirector").getKey(), updatedGrp.getgManager()); } }
