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

ilgrosso pushed a commit to branch 2_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/2_1_X by this push:
     new ecf2975  [SYNCOPE-1583] Fix
ecf2975 is described below

commit ecf2975e13a21a32c59a2614e2e2b61379f41832
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Wed Jul 22 09:46:23 2020 +0200

    [SYNCOPE-1583] Fix
---
 .../core/provisioning/java/MappingManagerImpl.java | 12 +++-
 .../provisioning/java/MappingManagerImplTest.java  | 76 ++++++++++++++++++++++
 2 files changed, 85 insertions(+), 3 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 3908bbb..1aacbc7 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()).isPresent()) {
-                    LOG.warn("No membership for {} in {}, ignoring",
+                if (group == null
+                        || any instanceof User
+                                ? 
!groupDAO.findUDynMembers(group).contains(any.getKey())
+                                : any instanceof AnyObject
+                                        ? 
!groupDAO.findADynMembers(group).contains(any.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/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..e82a8f9 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.Arrays;
 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(groupDAO.findUDynMembers(group).contains(user.getKey()));
+
+        // 3. check propagation attrs
+        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()) && 
Arrays.asList("sx-dx").equals(attr.getValue())));
+    }
 }

Reply via email to