keycloak-uncached

fix KEYCLOAK-7572 consistently perform duplicate user checks

7/4/2018 1:41:07 PM

Details

diff --git a/services/src/main/java/org/keycloak/services/resources/account/AccountRestService.java b/services/src/main/java/org/keycloak/services/resources/account/AccountRestService.java
index e25aa2f..0a39dd4 100755
--- a/services/src/main/java/org/keycloak/services/resources/account/AccountRestService.java
+++ b/services/src/main/java/org/keycloak/services/resources/account/AccountRestService.java
@@ -155,7 +155,7 @@ public class AccountRestService {
                 }
             }
 
-            if (realm.isRegistrationEmailAsUsername() && !realm.isDuplicateEmailsAllowed()) {
+            if (emailChanged && realm.isRegistrationEmailAsUsername() && !realm.isDuplicateEmailsAllowed()) {
                 UserModel existing = session.users().getUserByUsername(userRep.getEmail(), realm);
                 if (existing != null) {
                     return ErrorResponse.exists(Messages.USERNAME_EXISTS);
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/account/AccountRestServiceTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/account/AccountRestServiceTest.java
index 2d4fc69..6f81bac 100755
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/account/AccountRestServiceTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/account/AccountRestServiceTest.java
@@ -146,6 +146,31 @@ public class AccountRestServiceTest extends AbstractTestRealmKeycloakTest {
 
         user.setUsername("updatedUsername2");
         updateError(user, 400, Messages.READ_ONLY_USERNAME);
+
+
+    }
+
+    // KEYCLOAK-7572
+    @Test
+    public void testUpdateProfileWithRegistrationEmailAsUsername() throws IOException {
+        RealmRepresentation realmRep = adminClient.realm("test").toRepresentation();
+        realmRep.setRegistrationEmailAsUsername(true);
+        adminClient.realm("test").update(realmRep);
+
+        UserRepresentation user = SimpleHttp.doGet(getAccountUrl(null), client).auth(tokenUtil.getToken()).asJson(UserRepresentation.class);
+        String originalFirstname = user.getFirstName();
+
+        try {
+            user.setFirstName("Homer1");
+
+            user = updateAndGet(user);
+
+            assertEquals("Homer1", user.getFirstName());
+        } finally {
+            user.setFirstName(originalFirstname);
+            int status = SimpleHttp.doPost(getAccountUrl(null), client).auth(tokenUtil.getToken()).json(user).asStatus();
+            assertEquals(200, status);
+        }
     }
 
     private UserRepresentation updateAndGet(UserRepresentation user) throws IOException {
@@ -227,15 +252,15 @@ public class AccountRestServiceTest extends AbstractTestRealmKeycloakTest {
         //Change the password back
         updatePassword("Str0ng3rP4ssw0rd", "password", 200);
    }
-    
+
     @Test
     public void testPasswordConfirmation() throws IOException {
         assumeFeatureEnabled(ACCOUNT2);
         
         updatePassword("password", "Str0ng3rP4ssw0rd", "confirmationDoesNotMatch", 400);
-        
+
         updatePassword("password", "Str0ng3rP4ssw0rd", "Str0ng3rP4ssw0rd", 200);
-        
+
         //Change the password back
         updatePassword("Str0ng3rP4ssw0rd", "password", 200);
     }
@@ -250,7 +275,7 @@ public class AccountRestServiceTest extends AbstractTestRealmKeycloakTest {
     private void updatePassword(String currentPass, String newPass, int expectedStatus) throws IOException {
         updatePassword(currentPass, newPass, null, expectedStatus);
     }
-        
+
     private void updatePassword(String currentPass, String newPass, String confirmation, int expectedStatus) throws IOException {
         AccountCredentialResource.PasswordUpdate passwordUpdate = new AccountCredentialResource.PasswordUpdate();
         passwordUpdate.setCurrentPassword(currentPass);