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
The following commit(s) were added to refs/heads/master by this push:
new b96970c [SYNCOPE-1583] Fix
b96970c is described below
commit b96970ce7c3511d990b6a0ca7e871ff21e156ce3
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Wed Jul 22 09:46:23 2020 +0200
[SYNCOPE-1583] Fix
---
.../core/provisioning/java/MappingManagerImpl.java | 12 +++-
.../java/data/ClientAppDataBinderImpl.java | 4 +-
.../provisioning/java/MappingManagerImplTest.java | 76 ++++++++++++++++++++++
3 files changed, 87 insertions(+), 5 deletions(-)
diff --git
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
index 8502dcf..23f9f8a 100644
---
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
+++
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
@@ -623,8 +623,14 @@ public class MappingManagerImpl implements MappingManager {
if (intAttrName.getEnclosingGroup() != null) {
Group group =
groupDAO.findByName(intAttrName.getEnclosingGroup());
- if (group == null ||
groupableRelatable.getMembership(group.getKey()).isEmpty()) {
- LOG.warn("No membership for {} in {}, ignoring",
+ if (group == null
+ || any instanceof User
+ ? !userDAO.findAllGroupKeys((User)
any).contains(group.getKey())
+ : any instanceof AnyObject
+ ?
!anyObjectDAO.findAllGroupKeys((AnyObject) any).contains(group.getKey())
+ : false) {
+
+ LOG.warn("No (dyn) membership for {} in {}, ignoring",
intAttrName.getEnclosingGroup(),
groupableRelatable);
} else {
references.add(group);
@@ -649,7 +655,7 @@ public class MappingManagerImpl implements MappingManager {
}
} else if (intAttrName.getRelationshipAnyType() != null &&
intAttrName.getRelationshipType() != null) {
RelationshipType relationshipType =
relationshipTypeDAO.find(intAttrName.getRelationshipType());
- final AnyType anyType =
anyTypeDAO.find(intAttrName.getRelationshipAnyType());
+ AnyType anyType =
anyTypeDAO.find(intAttrName.getRelationshipAnyType());
if (relationshipType == null ||
groupableRelatable.getRelationships(relationshipType).isEmpty()) {
LOG.warn("No relationship for type {} in {}, ignoring",
intAttrName.getRelationshipType(),
groupableRelatable);
diff --git
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ClientAppDataBinderImpl.java
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ClientAppDataBinderImpl.java
index 9fb5c44..d00bfb1 100644
---
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ClientAppDataBinderImpl.java
+++
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ClientAppDataBinderImpl.java
@@ -106,7 +106,7 @@ public class ClientAppDataBinderImpl implements
ClientAppDataBinder {
clientApp.setClientAppId(clientAppTO.getClientAppId());
clientApp.setEntityId(clientAppTO.getEntityId());
clientApp.setMetadataLocation(clientAppTO.getMetadataLocation());
-
clientApp.setMetadataSignatureLocation(clientAppTO.getMetadataLocation());
+
clientApp.setMetadataSignatureLocation(clientAppTO.getMetadataSignatureLocation());
clientApp.setSignAssertions(clientAppTO.isSignAssertions());
clientApp.setSignResponses(clientAppTO.isSignResponses());
clientApp.setEncryptionOptional(clientAppTO.isEncryptionOptional());
@@ -170,7 +170,7 @@ public class ClientAppDataBinderImpl implements
ClientAppDataBinder {
clientAppTO.setClientAppId(clientApp.getClientAppId());
clientAppTO.setEntityId(clientApp.getEntityId());
clientAppTO.setMetadataLocation(clientApp.getMetadataLocation());
-
clientAppTO.setMetadataSignatureLocation(clientApp.getMetadataLocation());
+
clientAppTO.setMetadataSignatureLocation(clientApp.getMetadataSignatureLocation());
clientAppTO.setSignAssertions(clientApp.isSignAssertions());
clientAppTO.setSignResponses(clientApp.isSignResponses());
clientAppTO.setEncryptionOptional(clientApp.isEncryptionOptional());
diff --git
a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingManagerImplTest.java
b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingManagerImplTest.java
index efedfaf..b8137f4 100644
---
a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingManagerImplTest.java
+++
b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingManagerImplTest.java
@@ -20,18 +20,29 @@ package org.apache.syncope.core.provisioning.java;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import java.util.List;
import java.util.Set;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.common.lib.types.CipherAlgorithm;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
+import org.apache.syncope.core.persistence.api.dao.GroupDAO;
+import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
+import org.apache.syncope.core.persistence.api.dao.RealmDAO;
import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
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.resource.ExternalResource;
import org.apache.syncope.core.persistence.api.entity.resource.Provision;
import org.apache.syncope.core.persistence.api.entity.user.LinkedAccount;
+import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership;
+import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
import org.apache.syncope.core.persistence.api.entity.user.User;
import org.apache.syncope.core.provisioning.api.MappingManager;
import org.identityconnectors.common.security.SecurityUtil;
@@ -54,6 +65,21 @@ public class MappingManagerImplTest extends AbstractTest {
private ExternalResourceDAO resourceDAO;
@Autowired
+ private RealmDAO realmDAO;
+
+ @Autowired
+ private GroupDAO groupDAO;
+
+ @Autowired
+ private AnyTypeClassDAO anyTypeClassDAO;
+
+ @Autowired
+ private PlainSchemaDAO plainSchemaDAO;
+
+ @Autowired
+ private AnyUtilsFactory anyUtilsFactory;
+
+ @Autowired
private EntityFactory entityFactory;
@Test
@@ -202,4 +228,54 @@ public class MappingManagerImplTest extends AbstractTest {
provision);
assertNull(AttributeUtil.getPasswordValue(attrs));
}
+
+ @Test
+ public void issueSYNCOPE1583() {
+ // 0. create user matching the condition below
+ User user = entityFactory.newEntity(User.class);
+ user.setUsername("username");
+ user.setRealm(realmDAO.findByFullPath("/even/two"));
+ user.add(anyTypeClassDAO.find("other"));
+
+ UPlainAttr cool = entityFactory.newEntity(UPlainAttr.class);
+ cool.setOwner(user);
+ cool.setSchema(plainSchemaDAO.find("cool"));
+ cool.add("true", anyUtilsFactory.getInstance(AnyTypeKind.USER));
+ user.add(cool);
+
+ user = userDAO.save(user);
+ String newUserKey = user.getKey();
+ assertNotNull(newUserKey);
+
+ // 1. update group with dynamic membership
+ Group group = groupDAO.findByName("root");
+ assertNotNull(group);
+
+ UDynGroupMembership dynMembership =
entityFactory.newEntity(UDynGroupMembership.class);
+ dynMembership.setFIQLCond("cool==true");
+ dynMembership.setGroup(group);
+ group.setUDynMembership(dynMembership);
+
+ group = groupDAO.saveAndRefreshDynMemberships(group);
+ assertNotNull(group);
+
+ entityManager().flush();
+
+ // 2. verify that dynamic membership is in place
+ assertTrue(userDAO.findAllGroupKeys(user).contains(group.getKey()));
+
+ // 3.
+ ExternalResource csv = resourceDAO.find("resource-csv");
+ Provision provision = csv.getProvision(AnyTypeKind.USER.name()).get();
+ assertNotNull(provision);
+
+ Pair<String, Set<Attribute>> attrs =
mappingManager.prepareAttrsFromAny(
+ user,
+ null,
+ false,
+ Boolean.TRUE,
+ provision);
+ assertTrue(attrs.getRight().stream().anyMatch(
+ attr -> "theirgroup".equals(attr.getName()) &&
List.of("sx-dx").equals(attr.getValue())));
+ }
}