You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2020/02/26 16:14:32 UTC

[syncope] 04/04: [SYNCOPE-1537] Linked account update using put

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

commit c56592e4c0d9787942475917fd3f544a8fe3a63d
Author: dima.ayash <di...@tirasa.net>
AuthorDate: Wed Feb 26 16:27:59 2020 +0100

    [SYNCOPE-1537] Linked account update using put
---
 .../apache/syncope/common/lib/AnyOperations.java   |  1 -
 .../org/apache/syncope/fit/AbstractITCase.java     |  6 ++
 .../syncope/fit/core/LinkedAccountITCase.java      | 96 ++++++++++++++++++++++
 3 files changed, 102 insertions(+), 1 deletion(-)

diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java b/common/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java
index 870027c..72e984c 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java
@@ -359,7 +359,6 @@ public final class AnyOperations {
                 EntityTOUtils.buildLinkedAccountMap(original.getLinkedAccounts());
 
         updatedAccounts.entrySet().stream().
-                filter(entry -> (!originalAccounts.containsKey(entry.getKey()))).
                 forEachOrdered(entry -> {
                     result.getLinkedAccounts().add(new LinkedAccountPatch.Builder().
                             operation(PatchOperation.ADD_REPLACE).
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
index 35bfb76..1709427 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
@@ -469,6 +469,12 @@ public abstract class AbstractITCase {
                 });
     }
 
+    protected ProvisioningResult<UserTO> updateUser(final UserTO userTO) {
+        return userService.update(userTO).
+                readEntity(new GenericType<ProvisioningResult<UserTO>>() {
+                });
+    }
+
     protected ProvisioningResult<UserTO> deleteUser(final String key) {
         return userService.delete(key).
                 readEntity(new GenericType<ProvisioningResult<UserTO>>() {
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LinkedAccountITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LinkedAccountITCase.java
index 829570f..42066e5 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LinkedAccountITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LinkedAccountITCase.java
@@ -152,6 +152,46 @@ public class LinkedAccountITCase extends AbstractITCase {
     }
 
     @Test
+    public void createWithLinkedAccountThenUpdateUsingPutThenRemove() throws NamingException {
+        // 1. create user with linked account
+        UserTO user = UserITCase.getSampleTO(
+                "linkedAccount" + RandomStringUtils.randomNumeric(5) + "@syncope.apache.org");
+        String connObjectKeyValue = "uid=" + user.getUsername() + ",ou=People,o=isp";
+        String privilege = applicationService.read("mightyApp").getPrivileges().get(0).getKey();
+
+        LinkedAccountTO account = new LinkedAccountTO.Builder(RESOURCE_NAME_LDAP, connObjectKeyValue).build();
+        account.setUsername("LinkedUsername");
+        account.getPlainAttrs().add(attrTO("surname", "LINKED_SURNAME"));
+        account.getPrivileges().add(privilege);
+        user.getLinkedAccounts().add(account);
+
+        user = createUser(user).getEntity();
+        assertNotNull(user.getKey());
+        assertEquals(1, user.getLinkedAccounts().size());
+        assertEquals(privilege, user.getLinkedAccounts().get(0).getPrivileges().iterator().next());
+        assertEquals("LinkedUsername", user.getLinkedAccounts().get(0).getUsername());
+        assertEquals("LINKED_SURNAME", account.getPlainAttr("surname").get().getValues().get(0));
+
+        // 2. update linked account
+        account.getPlainAttrs().clear();
+        account.setUsername("LinkedUsernameUpdated");
+        account.getPlainAttrs().add(attrTO("email", "UPDATED_EMAIL@syncope.apache.org"));
+        account.getPlainAttrs().add(attrTO("surname", "UPDATED_SURNAME"));
+        user.getLinkedAccounts().clear();
+        user.getLinkedAccounts().add(account);
+
+        user = updateUser(user).getEntity();
+        assertEquals(1, user.getLinkedAccounts().size());
+        assertEquals("LinkedUsernameUpdated", user.getLinkedAccounts().get(0).getUsername());
+        assertEquals("UPDATED_SURNAME", account.getPlainAttr("surname").get().getValues().get(0));
+
+        // 3. remove linked account from user
+        user.getLinkedAccounts().clear();
+        user = updateUser(user).getEntity();
+        assertTrue(user.getLinkedAccounts().isEmpty());
+    }
+
+    @Test
     public void createWithoutLinkedAccountThenAdd() throws NamingException {
         // 1. create user without linked account
         UserTO user = UserITCase.getSampleTO(
@@ -198,6 +238,62 @@ public class LinkedAccountITCase extends AbstractITCase {
     }
 
     @Test
+    public void createWithoutLinkedAccountThenAddAndUpdatePassword() throws NamingException {
+        // 1. set the return value parameter to true
+        configurationService.set(new AttrTO.Builder().schema("return.password.value").value("true").build());
+
+        // 2. create user without linked account
+        UserTO user = UserITCase.getSampleTO(
+                "linkedAccount" + RandomStringUtils.randomNumeric(5) + "@syncope.apache.org");
+        String connObjectKeyValue = "uid=" + user.getUsername() + ",ou=People,o=isp";
+
+        user = createUser(user).getEntity();
+        assertNotNull(user.getKey());
+        assertTrue(user.getLinkedAccounts().isEmpty());
+
+        // 3. add linked account to user without password
+        UserPatch userPatch = new UserPatch();
+        userPatch.setKey(user.getKey());
+
+        LinkedAccountTO account = new LinkedAccountTO.Builder(RESOURCE_NAME_LDAP, connObjectKeyValue).build();
+        userPatch.getLinkedAccounts().add(new LinkedAccountPatch.Builder().linkedAccountTO(account).build());
+
+        user = updateUser(userPatch).getEntity();
+        assertEquals(1, user.getLinkedAccounts().size());
+        assertNull(user.getLinkedAccounts().get(0).getPassword());
+
+        // 4. update linked account with adding a password
+        account.setPassword("Password123");
+        userPatch = new UserPatch();
+        userPatch.setKey(user.getKey());
+        userPatch.getLinkedAccounts().add(new LinkedAccountPatch.Builder().linkedAccountTO(account).build());
+        user = updateUser(userPatch).getEntity();
+        assertNotNull(user.getLinkedAccounts().get(0).getPassword());
+
+        // 5. update linked account  password
+        String beforeUpdatePassword = user.getLinkedAccounts().get(0).getPassword();
+        account.setPassword("Password123Updated");
+        userPatch = new UserPatch();
+        userPatch.setKey(user.getKey());
+        
+        userPatch.getLinkedAccounts().add(new LinkedAccountPatch.Builder().linkedAccountTO(account).build());
+        user = updateUser(userPatch).getEntity();
+        assertNotNull(user.getLinkedAccounts().get(0).getPassword());
+        assertNotEquals(beforeUpdatePassword, user.getLinkedAccounts().get(0).getPassword());
+
+        // 6. set linked account password to null
+        account.setPassword(null);
+        userPatch = new UserPatch();
+        userPatch.setKey(user.getKey());
+        
+        userPatch.getLinkedAccounts().add(new LinkedAccountPatch.Builder().linkedAccountTO(account).build());
+        user = updateUser(userPatch).getEntity();
+        assertNull(user.getLinkedAccounts().get(0).getPassword());
+
+        configurationService.set(new AttrTO.Builder().schema("return.password.value").value("false").build());
+    }
+
+    @Test
     public void push() {
         // 0a. read configured cipher algorithm in order to be able to restore it at the end of test
         AttrTO pwdCipherAlgo = configurationService.get("password.cipher.algorithm");