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