keycloak-uncached

Details

diff --git a/services/src/main/java/org/keycloak/partialimport/ClientsPartialImport.java b/services/src/main/java/org/keycloak/partialimport/ClientsPartialImport.java
index 308d634..954c291 100755
--- a/services/src/main/java/org/keycloak/partialimport/ClientsPartialImport.java
+++ b/services/src/main/java/org/keycloak/partialimport/ClientsPartialImport.java
@@ -17,7 +17,9 @@
 
 package org.keycloak.partialimport;
 
+import org.jboss.logging.Logger;
 import org.keycloak.models.ClientModel;
+import org.keycloak.models.Constants;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.utils.KeycloakModelUtils;
@@ -26,7 +28,11 @@ import org.keycloak.representations.idm.ClientRepresentation;
 import org.keycloak.representations.idm.PartialImportRepresentation;
 import org.keycloak.representations.idm.ProtocolMapperRepresentation;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * PartialImport handler for Clients.
@@ -35,9 +41,28 @@ import java.util.List;
  */
 public class ClientsPartialImport extends AbstractPartialImport<ClientRepresentation> {
 
+    private static Set<String> INTERNAL_CLIENTS = Collections.unmodifiableSet(new HashSet(Constants.defaultClients));
+
+    private static Logger logger = Logger.getLogger(ClientsPartialImport.class);
+
     @Override
     public List<ClientRepresentation> getRepList(PartialImportRepresentation partialImportRep) {
-        return partialImportRep.getClients();
+        List<ClientRepresentation> clients = partialImportRep.getClients();
+        if (clients == null || clients.size() == 0) {
+            return clients;
+        }
+
+        // filter out internal clients
+        List<ClientRepresentation> ret = new ArrayList();
+
+        for (ClientRepresentation c: clients) {
+            if (!isInternalClient(c.getClientId())) {
+                ret.add(c);
+            } else {
+                logger.debugv("Internal client {0} will not be processed", c.getClientId());
+            }
+        }
+        return ret;
     }
 
     @Override
@@ -85,4 +110,10 @@ public class ClientsPartialImport extends AbstractPartialImport<ClientRepresenta
         RepresentationToModel.createClient(session, realm, clientRep, true);
     }
 
+    public static boolean isInternalClient(String clientId) {
+        if (clientId != null && clientId.endsWith("-realm")) {
+            return true;
+        }
+        return INTERNAL_CLIENTS.contains(clientId);
+    }
 }
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/partialimport/PartialImportTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/partialimport/PartialImportTest.java
index cdd8856..346472e 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/partialimport/PartialImportTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/partialimport/PartialImportTest.java
@@ -645,4 +645,17 @@ public class PartialImportTest extends AbstractAuthTest {
                 
         doImport();
     }
+
+    // KEYCLOAK-6058
+    @Test
+    public void testOverwriteExistingInternalClient() {
+        setOverwrite();
+        ClientRepresentation client = adminClient.realm(MASTER).clients().findByClientId("security-admin-console").get(0);
+        ClientRepresentation client2 = adminClient.realm(MASTER).clients().findByClientId("master-realm").get(0);
+        piRep.setClients(Arrays.asList(client, client2));
+
+        PartialImportResults result = doImport();
+        Assert.assertEquals(0, result.getOverwritten());
+    }
+
 }