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

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


The following commit(s) were added to refs/heads/2_0_X by this push:
     new 5c384b0  [SYNCOPE-1453] MappingItem with "mustChangePassword" field 
cannot be provisioned and updated during import
5c384b0 is described below

commit 5c384b068005173dc7e2dd9bfac6de178f3d3a44
Author: Dmitriy Brashevets <[email protected]>
AuthorDate: Wed Mar 27 14:42:26 2019 +0300

    [SYNCOPE-1453] MappingItem with "mustChangePassword" field cannot be 
provisioned and updated during import
---
 .../core/provisioning/java/data/UserDataBinderImpl.java     |  9 +++++++++
 .../core/provisioning/java/utils/ConnObjectUtils.java       |  5 ++++-
 .../syncope/core/provisioning/java/utils/MappingUtils.java  | 13 +++++++++++++
 3 files changed, 26 insertions(+), 1 deletion(-)

diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
index febbc90..e1a75da 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
@@ -60,6 +60,7 @@ import 
org.apache.syncope.core.persistence.api.entity.user.SecurityQuestion;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
+import org.apache.syncope.core.provisioning.java.utils.MappingUtils;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
@@ -349,6 +350,14 @@ public class UserDataBinderImpl extends 
AbstractAnyDataBinder implements UserDat
 
         if (userPatch.getMustChangePassword() != null) {
             
user.setMustChangePassword(userPatch.getMustChangePassword().getValue());
+            Set<ExternalResource> externalResources = 
anyUtils.getAllResources(toBeUpdated);
+
+            for (ExternalResource resource : externalResources) {
+                Provision provision = 
resource.getProvision(toBeUpdated.getType());
+                if (MappingUtils.hasMustChangePassword(provision)) {
+                    propByRes.add(ResourceOperation.UPDATE, resource.getKey());
+                }
+            }
         }
 
         // roles
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java
index c87f292..a564e75 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java
@@ -266,7 +266,10 @@ public class ConnObjectUtils {
                     }
 
                     
updatedUser.setSecurityQuestion(originalUser.getSecurityQuestion());
-                    
updatedUser.setMustChangePassword(originalUser.isMustChangePassword());
+
+                    if (!MappingUtils.hasMustChangePassword(provision)) {
+                        
updatedUser.setMustChangePassword(originalUser.isMustChangePassword());
+                    }
 
                     anyPatch = (T) AnyOperations.diff(updatedUser, 
originalUser, true);
                     break;
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java
index f0b2551..9f1028a 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java
@@ -23,6 +23,8 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.commons.jexl3.JexlContext;
@@ -244,6 +246,17 @@ public final class MappingUtils {
         return builder.build();
     }
 
+    public static boolean hasMustChangePassword(final Provision provision) {
+        return provision != null && provision.getMapping() != null
+                && IterableUtils.matchesAny(provision.getMapping().getItems(), 
new Predicate<MappingItem>() {
+
+            @Override
+            public boolean evaluate(final MappingItem mappingItem) {
+                return 
"mustChangePassword".equals(mappingItem.getIntAttrName());
+            }
+        });
+    }
+
     /**
      * Private default constructor, for static-only classes.
      */

Reply via email to