keycloak-aplcache

Details

diff --git a/server-spi/src/main/java/org/keycloak/migration/migrators/MigrateTo1_9_0.java b/server-spi/src/main/java/org/keycloak/migration/migrators/MigrateTo1_9_0.java
index f8c709b..fb24598 100644
--- a/server-spi/src/main/java/org/keycloak/migration/migrators/MigrateTo1_9_0.java
+++ b/server-spi/src/main/java/org/keycloak/migration/migrators/MigrateTo1_9_0.java
@@ -38,7 +38,7 @@ public class MigrateTo1_9_0 {
     public static final ModelVersion VERSION = new ModelVersion("1.9.0");
 
     public void migrate(KeycloakSession session) {
-        RealmModel realm = session.realms().getRealmByName(Config.getAdminRealm());
+        RealmModel realm = session.realms().getRealm(Config.getAdminRealm());
         if (realm != null && realm.getDisplayNameHtml() != null && realm.getDisplayNameHtml().equals("<strong>Keycloak</strong>")) {
             realm.setDisplayNameHtml("<div class=\"kc-logo-text\"><span>Keycloak</span></div>");
         }
diff --git a/server-spi/src/main/java/org/keycloak/models/ImpersonationConstants.java b/server-spi/src/main/java/org/keycloak/models/ImpersonationConstants.java
index 9c5681f..05f6b45 100755
--- a/server-spi/src/main/java/org/keycloak/models/ImpersonationConstants.java
+++ b/server-spi/src/main/java/org/keycloak/models/ImpersonationConstants.java
@@ -36,7 +36,7 @@ public class ImpersonationConstants {
             adminRealm = realm;
             adminRole = realm.getRole(AdminRoles.ADMIN);
         } else {
-            adminRealm = model.getRealmByName(Config.getAdminRealm());
+            adminRealm = model.getRealm(Config.getAdminRealm());
             adminRole = adminRealm.getRole(AdminRoles.ADMIN);
         }
         ClientModel realmAdminApp = adminRealm.getClientByClientId(KeycloakModelUtils.getMasterRealmAdminApplicationClientId(realm.getName()));
diff --git a/server-spi/src/main/java/org/keycloak/models/utils/RepresentationToModel.java b/server-spi/src/main/java/org/keycloak/models/utils/RepresentationToModel.java
index d07902d..e6bb3c5 100755
--- a/server-spi/src/main/java/org/keycloak/models/utils/RepresentationToModel.java
+++ b/server-spi/src/main/java/org/keycloak/models/utils/RepresentationToModel.java
@@ -80,6 +80,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -620,9 +621,40 @@ public class RepresentationToModel {
 
     public static void renameRealm(RealmModel realm, String name) {
         if (name.equals(realm.getName())) return;
+
+        String oldName = realm.getName();
+
         ClientModel masterApp = realm.getMasterAdminClient();
         masterApp.setClientId(KeycloakModelUtils.getMasterRealmAdminApplicationClientId(name));
         realm.setName(name);
+
+        ClientModel adminClient = realm.getClientByClientId(Constants.ADMIN_CONSOLE_CLIENT_ID);
+        if (adminClient != null) {
+            if (adminClient.getBaseUrl() != null) {
+                adminClient.setBaseUrl(adminClient.getBaseUrl().replace("/admin/" + oldName + "/", "/admin/" + name + "/"));
+            }
+            Set<String> adminRedirectUris = new HashSet<>();
+            for (String r : adminClient.getRedirectUris()) {
+                adminRedirectUris.add(replace(r, "/admin/" + oldName + "/", "/admin/" + name + "/"));
+            }
+            adminClient.setRedirectUris(adminRedirectUris);
+        }
+
+        ClientModel accountClient = realm.getClientByClientId(Constants.ACCOUNT_MANAGEMENT_CLIENT_ID);
+        if (accountClient != null) {
+            if (accountClient.getBaseUrl() != null) {
+                accountClient.setBaseUrl(accountClient.getBaseUrl().replace("/realms/" + oldName + "/", "/realms/" + name + "/"));
+            }
+            Set<String> accountRedirectUris = new HashSet<>();
+            for (String r : accountClient.getRedirectUris()) {
+                accountRedirectUris.add(replace(r, "/realms/" + oldName + "/", "/realms/" + name + "/"));
+            }
+            accountClient.setRedirectUris(accountRedirectUris);
+        }
+    }
+
+    private static String replace(String url, String target, String replacement) {
+        return url != null ? url.replace(target, replacement) : null;
     }
 
     public static void updateRealm(RealmRepresentation rep, RealmModel realm) {
diff --git a/services/src/main/java/org/keycloak/services/managers/RealmManager.java b/services/src/main/java/org/keycloak/services/managers/RealmManager.java
index b1dcaff..b46a0e8 100755
--- a/services/src/main/java/org/keycloak/services/managers/RealmManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/RealmManager.java
@@ -293,7 +293,7 @@ public class RealmManager implements RealmImporter {
             createRealmRole.setDescription("${role_" + AdminRoles.CREATE_REALM + "}");
             createRealmRole.setScopeParamRequired(false);
         } else {
-            adminRealm = model.getRealmByName(Config.getAdminRealm());
+            adminRealm = model.getRealm(Config.getAdminRealm());
             adminRole = adminRealm.getRole(AdminRoles.ADMIN);
         }
         adminRole.setDescription("${role_"+AdminRoles.ADMIN+"}");
diff --git a/services/src/main/java/org/keycloak/services/resources/WelcomeResource.java b/services/src/main/java/org/keycloak/services/resources/WelcomeResource.java
index ef4bef2..7a2632b 100755
--- a/services/src/main/java/org/keycloak/services/resources/WelcomeResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/WelcomeResource.java
@@ -231,7 +231,6 @@ public class WelcomeResource {
     }
 
     private void updateCsrfChecks() {
-        RealmModel realm = session.realms().getRealmByName(Config.getAdminRealm());
         Cookie cookie = headers.getCookies().get(KEYCLOAK_STATE_CHECKER);
         if (cookie != null) {
             stateChecker = cookie.getValue();
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/RealmTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/RealmTest.java
index 511e6b5..6b842b0 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/RealmTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/RealmTest.java
@@ -71,6 +71,34 @@ public class RealmTest extends AbstractClientTest {
     }
 
     @Test
+    public void renameRealm() {
+        RealmRepresentation rep = new RealmRepresentation();
+        rep.setId("old");
+        rep.setRealm("old");
+
+        try {
+            keycloak.realms().create(rep);
+
+            rep.setRealm("new");
+            keycloak.realm("old").update(rep);
+
+            // Check client in master realm renamed
+            assertEquals(0, keycloak.realm("master").clients().findByClientId("old-realm").size());
+            assertEquals(1, keycloak.realm("master").clients().findByClientId("new-realm").size());
+
+            ClientRepresentation adminClient = keycloak.realm("new").clients().findByClientId(Constants.ADMIN_CONSOLE_CLIENT_ID).get(0);
+            assertEquals("/auth/admin/new/console/index.html", adminClient.getBaseUrl());
+            assertEquals("/auth/admin/new/console/*", adminClient.getRedirectUris().get(0));
+
+            ClientRepresentation accountClient = keycloak.realm("new").clients().findByClientId(Constants.ACCOUNT_MANAGEMENT_CLIENT_ID).get(0);
+            assertEquals("/auth/realms/new/account", accountClient.getBaseUrl());
+            assertEquals("/auth/realms/new/account/*", accountClient.getRedirectUris().get(0));
+        } finally {
+            keycloak.realms().realm(rep.getRealm()).remove();
+        }
+    }
+
+    @Test
     public void createRealmEmpty() {
         try {
             RealmRepresentation rep = new RealmRepresentation();