keycloak-aplcache

Details

diff --git a/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/RealmResource.java b/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/RealmResource.java
index 42b6196..0e85682 100644
--- a/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/RealmResource.java
+++ b/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/RealmResource.java
@@ -208,6 +208,10 @@ public interface RealmResource {
     @Path("components")
     ComponentsResource components();
 
+    @Path("user-storage")
+    UserStorageProviderResource userStorage();
+
+
     @Path("keys")
     KeyResource keys();
 
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UserStorageProviderResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UserStorageProviderResource.java
index 8e29779..6476dce 100644
--- a/services/src/main/java/org/keycloak/services/resources/admin/UserStorageProviderResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/UserStorageProviderResource.java
@@ -34,6 +34,7 @@ import org.keycloak.storage.ldap.LDAPStorageProviderFactory;
 import org.keycloak.storage.ldap.mappers.LDAPStorageMapper;
 import org.keycloak.storage.user.SynchronizationResult;
 
+import javax.ws.rs.BadRequestException;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
@@ -141,7 +142,7 @@ public class UserStorageProviderResource {
         ComponentModel mapperModel = realm.getComponent(mapperId);
         if (mapperModel == null) throw new NotFoundException("Mapper model not found");
         LDAPStorageMapper mapper = session.getProvider(LDAPStorageMapper.class, mapperModel);
-        ProviderFactory factory = session.getKeycloakSessionFactory().getProviderFactory(LDAPStorageProvider.class, parentModel.getProviderId());
+        ProviderFactory factory = session.getKeycloakSessionFactory().getProviderFactory(UserStorageProvider.class, parentModel.getProviderId());
 
         LDAPStorageProviderFactory providerFactory = (LDAPStorageProviderFactory)factory;
         LDAPStorageProvider federationProvider = providerFactory.create(session, parentModel);
@@ -154,7 +155,7 @@ public class UserStorageProviderResource {
         } else if ("keycloakToFed".equals(direction)) {
             syncResult = mapper.syncDataFromKeycloakToFederationProvider(mapperModel, federationProvider, session, realm);
         } else {
-            throw new NotFoundException("Unknown direction: " + direction);
+            throw new BadRequestException("Unknown direction: " + direction);
         }
 
         Map<String, Object> eventRep = new HashMap<>();
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/storage/ldap/LDAPGroupMapperSyncTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/storage/ldap/LDAPGroupMapperSyncTest.java
index e5a9ff3..9b41bb6 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/storage/ldap/LDAPGroupMapperSyncTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/storage/ldap/LDAPGroupMapperSyncTest.java
@@ -25,8 +25,11 @@ import org.junit.Test;
 import org.junit.rules.RuleChain;
 import org.junit.rules.TestRule;
 import org.junit.runners.MethodSorters;
+import org.keycloak.admin.client.Keycloak;
 import org.keycloak.common.util.MultivaluedHashMap;
 import org.keycloak.component.ComponentModel;
+import org.keycloak.models.Constants;
+import org.keycloak.representations.idm.SynchronizationResultRepresentation;
 import org.keycloak.storage.UserStorageProvider;
 import org.keycloak.storage.UserStorageProviderModel;
 import org.keycloak.storage.ldap.LDAPStorageProvider;
@@ -50,9 +53,14 @@ import org.keycloak.storage.user.SynchronizationResult;
 import org.keycloak.testsuite.rule.KeycloakRule;
 import org.keycloak.testsuite.rule.LDAPRule;
 
+import javax.ws.rs.BadRequestException;
 import java.util.List;
 import java.util.Set;
 
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.MASTER;
+import static org.keycloak.models.AdminRoles.ADMIN;
+import static org.keycloak.testsuite.Constants.AUTH_SERVER_ROOT;
+
 /**
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
  */
@@ -106,8 +114,12 @@ public class LDAPGroupMapperSyncTest {
             .outerRule(ldapRule)
             .around(keycloakRule);
 
+    protected Keycloak adminClient;
+
     @Before
     public void before() {
+        adminClient = Keycloak.getInstance(AUTH_SERVER_ROOT, MASTER, ADMIN, ADMIN, Constants.ADMIN_CLI_CLIENT_ID);
+
         KeycloakSession session = keycloakRule.startSession();
         try {
             RealmModel realm = session.realms().getRealmByName("test");
@@ -167,6 +179,24 @@ public class LDAPGroupMapperSyncTest {
     }
 
     @Test
+    public void testSyncRestAPI() {
+        KeycloakSession session = keycloakRule.startSession();
+        try {
+            RealmModel realm = session.realms().getRealmByName("test");
+            ComponentModel mapperModel = LDAPTestUtils.getSubcomponentByName(realm,ldapModel, "groupsMapper");
+            try {
+                // testing KEYCLOAK-3980 which threw an NPE because I was looking up the factory wrong.
+                SynchronizationResultRepresentation syncResultRep = adminClient.realm("test").userStorage().syncMapperData(ldapModel.getId(), mapperModel.getId(), "error");
+                Assert.fail("Should throw 400");
+            } catch (BadRequestException e) {
+            }
+        } finally {
+            keycloakRule.stopSession(session, false);
+        }
+
+    }
+
+    @Test
     public void test02_syncWithGroupInheritance() throws Exception {
         KeycloakSession session = keycloakRule.startSession();
         try {
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/storage/ldap/LDAPTestUtils.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/storage/ldap/LDAPTestUtils.java
index df86f1f..db69be7 100644
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/storage/ldap/LDAPTestUtils.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/storage/ldap/LDAPTestUtils.java
@@ -29,6 +29,7 @@ import org.keycloak.models.UserProvider;
 import org.keycloak.models.utils.KeycloakModelUtils;
 import org.keycloak.models.utils.UserModelDelegate;
 import org.keycloak.representations.idm.CredentialRepresentation;
+import org.keycloak.representations.idm.SynchronizationResultRepresentation;
 import org.keycloak.storage.UserStorageProvider;
 import org.keycloak.storage.ldap.LDAPStorageProvider;
 import org.keycloak.storage.ldap.LDAPUtils;
@@ -309,4 +310,10 @@ public class LDAPTestUtils {
         Assert.assertEquals(expectedRemoved, syncResult.getRemoved());
         Assert.assertEquals(expectedFailed, syncResult.getFailed());
     }
+    public static void assertSyncEquals(SynchronizationResultRepresentation syncResult, int expectedAdded, int expectedUpdated, int expectedRemoved, int expectedFailed) {
+        Assert.assertEquals(expectedAdded, syncResult.getAdded());
+        Assert.assertEquals(expectedUpdated, syncResult.getUpdated());
+        Assert.assertEquals(expectedRemoved, syncResult.getRemoved());
+        Assert.assertEquals(expectedFailed, syncResult.getFailed());
+    }
 }
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserStorageMapperTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserStorageMapperTest.java
index fa7eb14..933861a 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserStorageMapperTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserStorageMapperTest.java
@@ -17,31 +17,7 @@
 
 package org.keycloak.testsuite.admin;
 
-import org.junit.After;
-import org.junit.Before;
 import org.junit.Ignore;
-import org.junit.Test;
-import org.keycloak.admin.client.resource.UserFederationProviderResource;
-import org.keycloak.events.admin.OperationType;
-import org.keycloak.events.admin.ResourceType;
-import org.keycloak.representations.idm.ConfigPropertyRepresentation;
-import org.keycloak.representations.idm.UserFederationMapperRepresentation;
-import org.keycloak.representations.idm.UserFederationMapperTypeRepresentation;
-import org.keycloak.representations.idm.UserFederationProviderRepresentation;
-import org.keycloak.representations.idm.UserFederationSyncResultRepresentation;
-import org.keycloak.testsuite.Assert;
-import org.keycloak.testsuite.util.AdminEventPaths;
-import org.keycloak.testsuite.util.UserFederationProviderBuilder;
-
-import javax.ws.rs.BadRequestException;
-import javax.ws.rs.NotFoundException;
-import javax.ws.rs.core.Response;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
 /**
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserStorageRestTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserStorageRestTest.java
index 315bc8b..9d5fdb6 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserStorageRestTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/UserStorageRestTest.java
@@ -18,37 +18,13 @@
 package org.keycloak.testsuite.admin;
 
 import org.junit.Ignore;
-import org.junit.Test;
-import org.keycloak.admin.client.resource.UserFederationProvidersResource;
-import org.keycloak.common.constants.KerberosConstants;
-import org.keycloak.events.admin.OperationType;
-import org.keycloak.events.admin.ResourceType;
-import org.keycloak.models.AuthenticationExecutionModel;
-import org.keycloak.models.LDAPConstants;
-import org.keycloak.provider.ProviderConfigProperty;
-import org.keycloak.representations.idm.AuthenticationExecutionInfoRepresentation;
-import org.keycloak.representations.idm.UserFederationProviderFactoryRepresentation;
-import org.keycloak.representations.idm.UserFederationProviderRepresentation;
-import org.keycloak.representations.idm.UserFederationSyncResultRepresentation;
-import org.keycloak.testsuite.Assert;
-import org.keycloak.testsuite.admin.authentication.AbstractAuthenticationTest;
-import org.keycloak.testsuite.util.AdminEventPaths;
-import org.keycloak.testsuite.util.UserFederationProviderBuilder;
-
-import javax.ws.rs.BadRequestException;
-import javax.ws.rs.NotFoundException;
-import javax.ws.rs.core.Response;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
 
 /**
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
  */
 @Ignore
 public class UserStorageRestTest extends AbstractAdminTest {
-
+/*
     @Test
     public void testProviderFactories() {
         List<UserFederationProviderFactoryRepresentation> providerFactories = userFederation().getProviderFactories();
@@ -339,7 +315,7 @@ public class UserStorageRestTest extends AbstractAdminTest {
         Assert.assertEquals(-1, userFederation().get(id1).toRepresentation().getLastSync());
 
         // Sync and assert it happened
-        UserFederationSyncResultRepresentation syncResult = userFederation().get(id1).syncUsers("triggerFullSync");
+        SynchronizationResultRepresentation syncResult = userFederation().get(id1).syncUsers("triggerFullSync");
         Assert.assertEquals("0 imported users, 0 updated users", syncResult.getStatus());
 
         Map<String, Object> eventRep = new HashMap<>();
@@ -404,4 +380,5 @@ public class UserStorageRestTest extends AbstractAdminTest {
         Assert.assertNotNull(kerberosExecution);
         return kerberosExecution;
     }
+    */
 }
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/util/AdminEventPaths.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/util/AdminEventPaths.java
index 74e0046..5e61d00 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/util/AdminEventPaths.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/util/AdminEventPaths.java
@@ -35,8 +35,6 @@ import org.keycloak.admin.client.resource.RoleByIdResource;
 import org.keycloak.admin.client.resource.RoleMappingResource;
 import org.keycloak.admin.client.resource.RoleResource;
 import org.keycloak.admin.client.resource.RolesResource;
-import org.keycloak.admin.client.resource.UserFederationProviderResource;
-import org.keycloak.admin.client.resource.UserFederationProvidersResource;
 import org.keycloak.admin.client.resource.UserResource;
 import org.keycloak.admin.client.resource.UsersResource;
 
@@ -284,29 +282,6 @@ public class AdminEventPaths {
         return uri.toString();
     }
 
-    // USER FEDERATION PROVIDERS AND MAPPERS
-
-    public static String userFederationsResourcePath() {
-        URI uri = UriBuilder.fromUri("").path(RealmResource.class, "userFederation").build();
-        return uri.toString();
-    }
-
-    public static String userFederationCreateResourcePath() {
-        URI uri = UriBuilder.fromUri(userFederationsResourcePath()).path(UserFederationProvidersResource.class, "create").build();
-        return uri.toString();
-    }
-
-    public static String userFederationResourcePath(String userFederationId) {
-        URI uri = UriBuilder.fromUri(userFederationsResourcePath()).path(UserFederationProvidersResource.class, "get").build(userFederationId);
-        return uri.toString();
-    }
-
-    public static String userFederationMapperResourcePath(String userFederationId, String userFederationMapperId) {
-        URI uri = UriBuilder.fromUri(userFederationResourcePath(userFederationId))
-                .path(UserFederationProviderResource.class, "getMapperById").build(userFederationMapperId);
-        return uri.toString();
-    }
-
     // CLIENT INITIAL ACCESS
 
     public static String clientInitialAccessPath(String clientInitialAccessId) {