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);