keycloak-aplcache

Merge pull request #3618 from abstractj/KEYCLOAK-3685 [KEYCLOAK-3685]:

12/7/2016 1:06:55 AM

Details

diff --git a/services/src/main/java/org/keycloak/forms/account/freemarker/model/RealmBean.java b/services/src/main/java/org/keycloak/forms/account/freemarker/model/RealmBean.java
index 569a769..d818876 100755
--- a/services/src/main/java/org/keycloak/forms/account/freemarker/model/RealmBean.java
+++ b/services/src/main/java/org/keycloak/forms/account/freemarker/model/RealmBean.java
@@ -65,4 +65,7 @@ public class RealmBean {
         return realm.isEditUsernameAllowed();
     }
 
+    public boolean isRegistrationEmailAsUsername() {
+        return realm.isRegistrationEmailAsUsername();
+    }
 }
diff --git a/services/src/main/java/org/keycloak/services/resources/AccountService.java b/services/src/main/java/org/keycloak/services/resources/AccountService.java
index 7a50644..f2f4951 100755
--- a/services/src/main/java/org/keycloak/services/resources/AccountService.java
+++ b/services/src/main/java/org/keycloak/services/resources/AccountService.java
@@ -417,6 +417,15 @@ public class AccountService extends AbstractSecuredLocalService {
                 user.setEmailVerified(false);
                 event.clone().event(EventType.UPDATE_EMAIL).detail(Details.PREVIOUS_EMAIL, oldEmail).detail(Details.UPDATED_EMAIL, email).success();
             }
+
+            if (realm.isRegistrationEmailAsUsername()) {
+                UserModel existing = session.users().getUserByEmail(email, realm);
+                if (existing != null && !existing.getId().equals(user.getId())) {
+                    throw new ModelDuplicateException(Messages.USERNAME_EXISTS);
+                }
+                user.setUsername(email);
+            }
+
             setReferrerOnPage();
             return account.setSuccess(Messages.ACCOUNT_UPDATED).createResponse(AccountPages.ACCOUNT);
         } catch (ModelReadOnlyException roe) {
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/account/AccountTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/account/AccountTest.java
index 90bf62b..b9afd9b 100755
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/account/AccountTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/account/AccountTest.java
@@ -395,6 +395,7 @@ public class AccountTest extends TestRealmKeycloakTest {
     @Test
     public void changeProfile() throws Exception {
         setEditUsernameAllowed(false);
+        setRegistrationEmailAsUsername(false);
 
         profilePage.open();
         loginPage.login("test-user@localhost", "password");
@@ -463,12 +464,31 @@ public class AccountTest extends TestRealmKeycloakTest {
         setEditUsernameAllowed(true);
     }
 
+    @Test
+    public void changeProfileEmailAsUsernameEnabled() throws Exception {
+        setRegistrationEmailAsUsername(true);
+
+        profilePage.open();
+        loginPage.login("test-user@localhost", "password");
+        Assert.assertFalse(driver.findElements(By.id("username")).size() > 0);
+
+        // Revert
+        setRegistrationEmailAsUsername(false);
+
+    }
+
     private void setEditUsernameAllowed(boolean allowed) {
         RealmRepresentation testRealm = testRealm().toRepresentation();
         testRealm.setEditUsernameAllowed(allowed);
         testRealm().update(testRealm);
     }
 
+    private void setRegistrationEmailAsUsername(boolean allowed) {
+        RealmRepresentation testRealm = testRealm().toRepresentation();
+        testRealm.setRegistrationEmailAsUsername(allowed);
+        testRealm().update(testRealm);
+    }
+
     @Test
     public void changeUsername() {
         // allow to edit the username in realm
diff --git a/themes/src/main/resources/theme/base/account/account.ftl b/themes/src/main/resources/theme/base/account/account.ftl
index 87cd198..08433f8 100755
--- a/themes/src/main/resources/theme/base/account/account.ftl
+++ b/themes/src/main/resources/theme/base/account/account.ftl
@@ -14,15 +14,17 @@
 
         <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker?html}">
 
-        <div class="form-group ${messagesPerField.printIfExists('username','has-error')}">
-            <div class="col-sm-2 col-md-2">
-                <label for="username" class="control-label">${msg("username")}</label> <#if realm.editUsernameAllowed><span class="required">*</span></#if>
-            </div>
+        <#if !realm.registrationEmailAsUsername>
+            <div class="form-group ${messagesPerField.printIfExists('username','has-error')}">
+                <div class="col-sm-2 col-md-2">
+                    <label for="username" class="control-label">${msg("username")}</label> <#if realm.editUsernameAllowed><span class="required">*</span></#if>
+                </div>
 
-            <div class="col-sm-10 col-md-10">
-                <input type="text" class="form-control" id="username" name="username" <#if !realm.editUsernameAllowed>disabled="disabled"</#if> value="${(account.username!'')?html}"/>
+                <div class="col-sm-10 col-md-10">
+                    <input type="text" class="form-control" id="username" name="username" <#if !realm.editUsernameAllowed>disabled="disabled"</#if> value="${(account.username!'')?html}"/>
+                </div>
             </div>
-        </div>
+        </#if>
 
         <div class="form-group ${messagesPerField.printIfExists('email','has-error')}">
             <div class="col-sm-2 col-md-2">