keycloak-uncached
Changes
testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/federation/FailableHardcodedStorageProvider.java 4(+2 -2)
testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/federation/FailableHardcodedStorageProviderFactory.java 4(+2 -2)
testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/federation/sync/SyncDummyUserFederationProviderFactory.java 8(+4 -4)
testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/federation/UserMapStorageFactory.java 17(+17 -0)
testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory 2(+2 -0)
testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/TestContext.java 2(+1 -1)
testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/TestCleanup.java 13(+9 -4)
testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/BrokenUserStorageTest.java 130(+60 -70)
testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/ComponentExportImportTest.java 80(+60 -20)
testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/FederatedStorageExportImportTest.java 335(+165 -170)
testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/UserStorageFailureTest.java 285(+157 -128)
testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/UserStorageTest.java 68(+63 -5)
testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/sync/SyncFederationTest.java 292(+158 -134)
testsuite/integration-arquillian/tests/base/src/test/resources/run-on-server-jboss-deployment-structure.xml 2(+2 -0)
testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/ComponentExportImportTest.java 159(+0 -159)
testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorage.java 52(+34 -18)
testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorageFactory.java 29(+23 -6)
testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorage.java 16(+7 -9)
testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorageFactory.java 77(+58 -19)
testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserStorageTest.java 570(+0 -570)
testsuite/integration-deprecated/src/test/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory 4(+0 -4)
Details
diff --git a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/federation/UserMapStorageFactory.java b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/federation/UserMapStorageFactory.java
index 885c316..5cb6cf0 100644
--- a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/federation/UserMapStorageFactory.java
+++ b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/federation/UserMapStorageFactory.java
@@ -16,13 +16,16 @@
*/
package org.keycloak.testsuite.federation;
+import java.util.ArrayList;
import java.util.HashMap;
import org.keycloak.Config;
import org.keycloak.component.ComponentModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
+import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.storage.UserStorageProviderFactory;
+import java.util.List;
import java.util.Map;
/**
@@ -34,9 +37,23 @@ public class UserMapStorageFactory implements UserStorageProviderFactory<UserMap
public static final String PROVIDER_ID = "user-password-map-arq";
+ protected static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
+
+ static {
+ ProviderConfigProperty attr = new ProviderConfigProperty("attr", "attr",
+ "This is some attribute",
+ ProviderConfigProperty.STRING_TYPE, null);
+ configProperties.add(attr);
+ }
+
protected Map<String, String> userPasswords = new HashMap<>();
@Override
+ public List<ProviderConfigProperty> getConfigProperties() {
+ return configProperties;
+ }
+
+ @Override
public UserMapStorage create(KeycloakSession session, ComponentModel model) {
return new UserMapStorage(session, model, userPasswords);
}
diff --git a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory
index 7b57770..9d5abba 100644
--- a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory
+++ b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory
@@ -1,4 +1,6 @@
org.keycloak.testsuite.federation.DummyUserFederationProviderFactory
+org.keycloak.testsuite.federation.FailableHardcodedStorageProviderFactory
org.keycloak.testsuite.federation.UserMapStorageFactory
org.keycloak.testsuite.federation.UserPropertyFileStorageFactory
org.keycloak.testsuite.federation.PassThroughFederatedUserStorageProviderFactory
+org.keycloak.testsuite.federation.sync.SyncDummyUserFederationProviderFactory
diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/TestContext.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/TestContext.java
index c11b158..d083eb5 100644
--- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/TestContext.java
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/TestContext.java
@@ -171,7 +171,7 @@ public final class TestContext {
public TestCleanup getOrCreateCleanup(String realmName) {
TestCleanup cleanup = cleanups.get(realmName);
if (cleanup == null) {
- cleanup = new TestCleanup(adminClient, realmName);
+ cleanup = new TestCleanup(this, realmName);
TestCleanup existing = cleanups.putIfAbsent(realmName, cleanup);
if (existing != null) {
diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/TestCleanup.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/TestCleanup.java
index 76e37b0..96626d7 100644
--- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/TestCleanup.java
+++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/TestCleanup.java
@@ -24,6 +24,7 @@ import javax.ws.rs.NotFoundException;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.admin.client.resource.RealmResource;
import org.keycloak.common.util.ConcurrentMultivaluedHashMap;
+import org.keycloak.testsuite.arquillian.TestContext;
/**
* Enlist resources to be cleaned after test method
@@ -42,15 +43,15 @@ public class TestCleanup {
private static final String AUTH_FLOW_IDS = "AUTH_FLOW_IDS";
private static final String AUTH_CONFIG_IDS = "AUTH_CONFIG_IDS";
- private final Keycloak adminClient;
+ private final TestContext testContext;
private final String realmName;
// Key is kind of entity (eg. "client", "role", "user" etc), Values are all kind of entities of given type to cleanup
private ConcurrentMultivaluedHashMap<String, String> entities = new ConcurrentMultivaluedHashMap<>();
- public TestCleanup(Keycloak adminClient, String realmName) {
- this.adminClient = adminClient;
+ public TestCleanup(TestContext testContext, String realmName) {
+ this.testContext = testContext;
this.realmName = realmName;
}
@@ -101,7 +102,7 @@ public class TestCleanup {
public void executeCleanup() {
- RealmResource realm = adminClient.realm(realmName);
+ RealmResource realm = getAdminClient().realm(realmName);
List<String> userIds = entities.get(USER_IDS);
if (userIds != null) {
@@ -204,4 +205,8 @@ public class TestCleanup {
}
}
+ private Keycloak getAdminClient() {
+ return testContext.getAdminClient();
+ }
+
}
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/ComponentExportImportTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/ComponentExportImportTest.java
index cc57b8e..7fa431f 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/ComponentExportImportTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/ComponentExportImportTest.java
@@ -18,19 +18,26 @@ import org.keycloak.common.util.MultivaluedHashMap;
import org.keycloak.exportimport.ExportImportConfig;
import org.keycloak.exportimport.ExportImportManager;
import org.keycloak.exportimport.singlefile.SingleFileExportProviderFactory;
+import org.keycloak.models.RealmModel;
import org.keycloak.representations.idm.ComponentRepresentation;
+import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.storage.UserStorageProvider;
import org.keycloak.testsuite.AbstractAuthTest;
import org.keycloak.testsuite.admin.ApiUtil;
import static org.keycloak.testsuite.auth.page.AuthRealm.TEST;
+
+import org.keycloak.testsuite.client.KeycloakTestingClient;
import org.keycloak.testsuite.federation.UserMapStorageFactory;
import org.keycloak.testsuite.runonserver.RunOnServerDeployment;
+import org.keycloak.testsuite.util.RealmBuilder;
/**
*
* @author tkyjovsk
*/
-public class ComponentExportImportTest extends AbstractAuthTest implements Serializable {
+public class ComponentExportImportTest extends AbstractAuthTest {
+
+ private static final String REALM_NAME = "exported-component";
private File exportFile;
@@ -44,35 +51,55 @@ public class ComponentExportImportTest extends AbstractAuthTest implements Seria
public void setDirs() {
exportFile = new File (new File(System.getProperty("auth.server.config.dir", "target")), "singleFile-full.json");
log.infof("Export file: %s", exportFile);
+
+ // Remove realm if exists
+ testingClient.server().run(session -> {
+ RealmModel realm = session.realms().getRealmByName(REALM_NAME);
+ if (realm != null) {
+ session.realms().removeRealm(realm.getId());
+ }
+ });
}
- public void clearExportImportProperties() {
- // Clear export/import properties after test
- Properties systemProps = System.getProperties();
- Set<String> propsToRemove = new HashSet<>();
- for (Object key : systemProps.keySet()) {
- if (key.toString().startsWith(ExportImportConfig.PREFIX)) {
- propsToRemove.add(key.toString());
+ @Override
+ public RealmResource testRealmResource() {
+ return adminClient.realm(REALM_NAME);
+ }
+
+
+ static void clearExportImportProperties(KeycloakTestingClient testingClient) {
+ testingClient.server().run(session -> {
+ // Clear export/import properties after test
+ Properties systemProps = System.getProperties();
+ Set<String> propsToRemove = new HashSet<>();
+
+ for (Object key : systemProps.keySet()) {
+ if (key.toString().startsWith(ExportImportConfig.PREFIX)) {
+ propsToRemove.add(key.toString());
+ }
}
- }
- for (String propToRemove : propsToRemove) {
- systemProps.remove(propToRemove);
- }
+ for (String propToRemove : propsToRemove) {
+ systemProps.remove(propToRemove);
+ }
+ });
}
+
protected String addComponent(ComponentRepresentation component) {
return ApiUtil.getCreatedId(testRealmResource().components().add(component));
}
@Test
- @Ignore
public void testSingleFile() {
- clearExportImportProperties();
+ clearExportImportProperties(testingClient);
+ RealmRepresentation realmRep = RealmBuilder.create()
+ .name(REALM_NAME)
+ .build();
+ adminClient.realms().create(realmRep);
String realmId = testRealmResource().toRepresentation().getId();
- String realmName = testRealmResource().toRepresentation().getRealm();
ComponentRepresentation parentComponent = new ComponentRepresentation();
parentComponent.setParentId(realmId);
@@ -96,23 +123,36 @@ public class ComponentExportImportTest extends AbstractAuthTest implements Seria
subcomponent.getConfig().putSingle("attr", "value2");
String subcomponentId = addComponent(subcomponent);
+ final String exportFilePath = exportFile.getAbsolutePath();
+
// export
testingClient.server().run(session -> {
ExportImportConfig.setProvider(SingleFileExportProviderFactory.PROVIDER_ID);
- ExportImportConfig.setFile(exportFile.getAbsolutePath());
- ExportImportConfig.setRealmName(realmName);
+ ExportImportConfig.setFile(exportFilePath);
+ ExportImportConfig.setRealmName(REALM_NAME);
ExportImportConfig.setAction(ExportImportConfig.ACTION_EXPORT);
new ExportImportManager(session).runExport();
});
+ testRealmResource().remove();
+
+ try {
+ testRealmResource().toRepresentation();
+ Assert.fail("Realm wasn't expected to be found");
+ } catch (NotFoundException nfe) {
+ // Expected
+ }
+
// import
testingClient.server().run(session -> {
- Assert.assertNull(session.realms().getRealmByName(TEST));
+ Assert.assertNull(session.realms().getRealmByName(REALM_NAME));
ExportImportConfig.setAction(ExportImportConfig.ACTION_IMPORT);
new ExportImportManager(session).runImport();
- Assert.assertNotNull(session.realms().getRealmByName(TEST));
});
+ // Assert realm was imported
+ Assert.assertNotNull(testRealmResource().toRepresentation());
+
try {
parentComponent = testRealmResource().components().component(parentComponentId).toRepresentation();
subcomponent = testRealmResource().components().component(subcomponentId).toRepresentation();
@@ -127,7 +167,7 @@ public class ComponentExportImportTest extends AbstractAuthTest implements Seria
Assert.assertEquals(parentComponent.getProviderType(), UserStorageProvider.class.getName());
Assert.assertEquals(parentComponent.getConfig().getFirst("attr"), "value");
- Assert.assertEquals(subcomponent.getParentId(), realmId);
+ Assert.assertEquals(subcomponent.getParentId(), parentComponent.getId());
Assert.assertEquals(subcomponent.getName(), "child");
Assert.assertEquals(subcomponent.getSubType(), "subtype2");
Assert.assertEquals(subcomponent.getProviderId(), UserMapStorageFactory.PROVIDER_ID);
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/UserStorageTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/UserStorageTest.java
index 413e9cf..25a3eb5 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/UserStorageTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/storage/UserStorageTest.java
@@ -28,8 +28,13 @@ import static org.junit.Assert.fail;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
+import org.keycloak.admin.client.resource.RealmResource;
import org.keycloak.admin.client.resource.UserResource;
import org.keycloak.common.util.MultivaluedHashMap;
+import org.keycloak.component.ComponentModel;
+import org.keycloak.credential.CredentialAuthentication;
+import org.keycloak.credential.UserCredentialStoreManager;
+import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import static org.keycloak.models.UserModel.RequiredAction.UPDATE_PROFILE;
@@ -48,6 +53,7 @@ import static org.keycloak.storage.UserStorageProviderModel.EVICTION_MINUTE;
import static org.keycloak.storage.UserStorageProviderModel.MAX_LIFESPAN;
import org.keycloak.testsuite.AbstractAuthTest;
import org.keycloak.testsuite.admin.ApiUtil;
+import org.keycloak.testsuite.arquillian.annotation.ModelTest;
import org.keycloak.testsuite.federation.UserMapStorage;
import org.keycloak.testsuite.federation.UserMapStorageFactory;
import org.keycloak.testsuite.federation.UserPropertyFileStorageFactory;
@@ -61,6 +67,8 @@ import java.util.Map;
import javax.mail.internet.MimeMessage;
import org.jboss.arquillian.graphene.page.Page;
import org.junit.Rule;
+import org.keycloak.testsuite.util.TestCleanup;
+
import static org.keycloak.testsuite.actions.RequiredActionEmailVerificationTest.getPasswordResetEmailLink;
import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlDoesntStartWith;
import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlStartsWith;
@@ -154,11 +162,15 @@ public class UserStorageTest extends AbstractAuthTest {
return propProviderRW;
}
- protected String addComponent(ComponentRepresentation component) {
- Response resp = testRealmResource().components().add(component);
+ private String addComponent(ComponentRepresentation component) {
+ return addComponent(testRealmResource(), getCleanup(), component);
+ }
+
+ static String addComponent(RealmResource realmResource, TestCleanup testCleanup, ComponentRepresentation component) {
+ Response resp = realmResource.components().add(component);
resp.close();
String id = ApiUtil.getCreatedId(resp);
- getCleanup().addComponentId(id);
+ testCleanup.addComponentId(id);
return id;
}
@@ -183,6 +195,17 @@ public class UserStorageTest extends AbstractAuthTest {
});
}
+ /**
+ * KEYCLOAK-4013
+ *
+ * @throws Exception
+ */
+ @Test
+ @ModelTest
+ public void testCast(KeycloakSession session) throws Exception {
+ List<CredentialAuthentication> list = UserCredentialStoreManager.getCredentialProviders(session, null, CredentialAuthentication.class);
+ }
+
@Test
public void testLoginSuccess() {
loginSuccessAndLogout("tbrady", "goat");
@@ -416,13 +439,28 @@ public class UserStorageTest extends AbstractAuthTest {
Assert.assertTrue(usernames.contains("thor"));
// search by single attribute
- // FIXME - no equivalent for model in REST
+ testingClient.server().run(session -> {
+ System.out.println("search by single attribute");
+
+ RealmModel realm = session.realms().getRealmByName("test");
+ UserModel userModel = session.users().getUserByUsername("thor", realm);
+ userModel.setSingleAttribute("weapon", "hammer");
+
+ List<UserModel> userModels = session.users().searchForUserByUserAttribute("weapon", "hammer", realm);
+ for (UserModel u : userModels) {
+ System.out.println(u.getUsername());
+
+ }
+ Assert.assertEquals(1, userModels.size());
+ Assert.assertEquals("thor", userModels.get(0).getUsername());
+ });
}
@Deployment
public static WebArchive deploy() {
return RunOnServerDeployment.create(UserResource.class)
- .addPackages(true, "org.keycloak.testsuite");
+ .addPackages(true, "org.keycloak.testsuite")
+ .addPackages(true, "org.keycloak.admin.client.resource");
}
private void setDailyEvictionTime(int hour, int minutes) {
@@ -677,6 +715,26 @@ public class UserStorageTest extends AbstractAuthTest {
System.out.println("User class: " + user.getClass());
Assert.assertFalse(user instanceof CachedUserModel); // should be evicted
});
+
+
+ testingClient.server().run(session -> {
+ RealmModel realm = session.realms().getRealmByName("test");
+ UserModel thor2 = session.users().getUserByUsername("thor", realm);
+ Assert.assertFalse(thor2 instanceof CachedUserModel);
+ });
+
+ propProviderRW = testRealmResource().components().component(propProviderRWId).toRepresentation();
+ propProviderRW.getConfig().putSingle(CACHE_POLICY, CachePolicy.DEFAULT.name());
+ propProviderRW.getConfig().remove("evictionHour");
+ propProviderRW.getConfig().remove("evictionMinute");
+ propProviderRW.getConfig().remove("evictionDay");
+ testRealmResource().components().component(propProviderRWId).update(propProviderRW);
+
+ testingClient.server().run(session -> {
+ RealmModel realm = session.realms().getRealmByName("test");
+ UserModel thor = session.users().getUserByUsername("thor", realm);
+ System.out.println("Foo");
+ });
}
@Test
diff --git a/testsuite/integration-arquillian/tests/base/src/test/resources/run-on-server-jboss-deployment-structure.xml b/testsuite/integration-arquillian/tests/base/src/test/resources/run-on-server-jboss-deployment-structure.xml
index 24d714a..95ff75e 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/resources/run-on-server-jboss-deployment-structure.xml
+++ b/testsuite/integration-arquillian/tests/base/src/test/resources/run-on-server-jboss-deployment-structure.xml
@@ -13,6 +13,8 @@
<module name="org.keycloak.keycloak-kerberos-federation"/>
<module name="org.keycloak.keycloak-ldap-federation"/>
<module name="org.infinispan"/>
+ <module name="org.apache.commons.io"/>
+ <module name="org.apache.httpcomponents.core"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
diff --git a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorage.java b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorage.java
index cf19917..7af2a7b 100644
--- a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorage.java
+++ b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorage.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2016 Red Hat, Inc. and/or its affiliates
+ * Copyright 2017 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +16,12 @@
*/
package org.keycloak.testsuite.federation.storage;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.jboss.logging.Logger;
import org.keycloak.component.ComponentModel;
import org.keycloak.credential.CredentialInput;
import org.keycloak.credential.CredentialInputUpdater;
@@ -33,23 +39,23 @@ import org.keycloak.storage.adapter.AbstractUserAdapterFederatedStorage;
import org.keycloak.storage.user.UserLookupProvider;
import org.keycloak.storage.user.UserRegistrationProvider;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class UserMapStorage implements UserLookupProvider, UserStorageProvider, UserRegistrationProvider, CredentialInputUpdater, CredentialInputValidator {
+ private static final Logger log = Logger.getLogger(UserMapStorage.class);
+
protected Map<String, String> userPasswords;
protected ComponentModel model;
protected KeycloakSession session;
public static final AtomicInteger allocations = new AtomicInteger(0);
public static final AtomicInteger closings = new AtomicInteger(0);
+ public static final AtomicInteger realmRemovals = new AtomicInteger(0);
+ public static final AtomicInteger groupRemovals = new AtomicInteger(0);
+ public static final AtomicInteger roleRemovals = new AtomicInteger(0);
public UserMapStorage(KeycloakSession session, ComponentModel model, Map<String, String> userPasswords) {
this.session = session;
@@ -58,18 +64,19 @@ public class UserMapStorage implements UserLookupProvider, UserStorageProvider,
allocations.incrementAndGet();
}
-
@Override
public UserModel getUserById(String id, RealmModel realm) {
StorageId storageId = new StorageId(id);
final String username = storageId.getExternalId();
- if (!userPasswords.containsKey(username)) return null;
+ if (!userPasswords.containsKey(username)) {
+ return null;
+ }
return createUser(realm, username);
}
private UserModel createUser(RealmModel realm, String username) {
- return new AbstractUserAdapterFederatedStorage(session, realm, model) {
+ return new AbstractUserAdapterFederatedStorage(session, realm, model) {
@Override
public String getUsername() {
return username;
@@ -90,9 +97,11 @@ public class UserMapStorage implements UserLookupProvider, UserStorageProvider,
@Override
public boolean updateCredential(RealmModel realm, UserModel user, CredentialInput input) {
- if (!(input instanceof UserCredentialModel)) return false;
+ if (!(input instanceof UserCredentialModel)) {
+ return false;
+ }
if (input.getType().equals(UserCredentialModel.PASSWORD)) {
- userPasswords.put(user.getUsername(), ((UserCredentialModel)input).getValue());
+ userPasswords.put(user.getUsername(), ((UserCredentialModel) input).getValue());
return true;
} else {
@@ -117,10 +126,12 @@ public class UserMapStorage implements UserLookupProvider, UserStorageProvider,
@Override
public boolean isValid(RealmModel realm, UserModel user, CredentialInput input) {
- if (!(input instanceof UserCredentialModel)) return false;
+ if (!(input instanceof UserCredentialModel)) {
+ return false;
+ }
if (input.getType().equals(UserCredentialModel.PASSWORD)) {
String pw = userPasswords.get(user.getUsername());
- return pw != null && pw.equals( ((UserCredentialModel)input).getValue());
+ return pw != null && pw.equals(((UserCredentialModel) input).getValue());
} else {
return false;
}
@@ -128,7 +139,9 @@ public class UserMapStorage implements UserLookupProvider, UserStorageProvider,
@Override
public UserModel getUserByUsername(String username, RealmModel realm) {
- if (!userPasswords.containsKey(username)) return null;
+ if (!userPasswords.containsKey(username)) {
+ return null;
+ }
return createUser(realm, username);
}
@@ -151,22 +164,25 @@ public class UserMapStorage implements UserLookupProvider, UserStorageProvider,
@Override
public void preRemove(RealmModel realm) {
-
+ log.infof("preRemove: realm=%s", realm.getName());
+ realmRemovals.incrementAndGet();
}
@Override
public void preRemove(RealmModel realm, GroupModel group) {
-
+ log.infof("preRemove: realm=%s, group=%s", realm.getName(), group.getName());
+ groupRemovals.incrementAndGet();
}
@Override
public void preRemove(RealmModel realm, RoleModel role) {
-
+ log.infof("preRemove: realm=%s, role=%s", realm.getName(), role.getName());
+ roleRemovals.incrementAndGet();
}
@Override
public void close() {
closings.incrementAndGet();
-
}
+
}
diff --git a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorageFactory.java b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorageFactory.java
index 79e9261..b904f22 100644
--- a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorageFactory.java
+++ b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserMapStorageFactory.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2016 Red Hat, Inc. and/or its affiliates
+ * Copyright 2017 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,15 +16,18 @@
*/
package org.keycloak.testsuite.federation.storage;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
import org.keycloak.Config;
import org.keycloak.component.ComponentModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
+import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.storage.UserStorageProviderFactory;
-import java.util.Hashtable;
-import java.util.Map;
-
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
@@ -32,9 +35,23 @@ import java.util.Map;
public class UserMapStorageFactory implements UserStorageProviderFactory<UserMapStorage> {
- public static final String PROVIDER_ID = "user-password-map";
+ public static final String PROVIDER_ID = "user-password-map-arq";
+
+ protected static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
- protected Map<String, String> userPasswords = new Hashtable<>();
+ static {
+ ProviderConfigProperty attr = new ProviderConfigProperty("attr", "attr",
+ "This is some attribute",
+ ProviderConfigProperty.STRING_TYPE, null);
+ configProperties.add(attr);
+ }
+
+ protected Map<String, String> userPasswords = new HashMap<>();
+
+ @Override
+ public List<ProviderConfigProperty> getConfigProperties() {
+ return configProperties;
+ }
@Override
public UserMapStorage create(KeycloakSession session, ComponentModel model) {
diff --git a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorage.java b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorage.java
index bab2c4a..e83937f 100644
--- a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorage.java
+++ b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorage.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2016 Red Hat, Inc. and/or its affiliates
+ * Copyright 2017 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +16,12 @@
*/
package org.keycloak.testsuite.federation.storage;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
import org.keycloak.component.ComponentModel;
import org.keycloak.credential.CredentialInput;
import org.keycloak.credential.CredentialInputValidator;
@@ -32,12 +38,6 @@ import org.keycloak.storage.adapter.AbstractUserAdapterFederatedStorage;
import org.keycloak.storage.user.UserLookupProvider;
import org.keycloak.storage.user.UserQueryProvider;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
@@ -137,7 +137,6 @@ public class UserPropertyFileStorage implements UserLookupProvider, UserStorageP
}
}
-
@Override
public int getUsersCount(RealmModel realm) {
return userPasswords.size();
@@ -191,7 +190,6 @@ public class UserPropertyFileStorage implements UserLookupProvider, UserStorageP
@Override
public List<UserModel> searchForUser(Map<String, String> attributes, RealmModel realm, int firstResult, int maxResults) {
- if (attributes.size() != 1) return Collections.EMPTY_LIST;
String username = attributes.get(UserModel.USERNAME);
if (username == null) return Collections.EMPTY_LIST;
return searchForUser(username, realm, firstResult, maxResults);
diff --git a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorageFactory.java b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorageFactory.java
index 02f97cd..a829ef9 100644
--- a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorageFactory.java
+++ b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/federation/storage/UserPropertyFileStorageFactory.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2016 Red Hat, Inc. and/or its affiliates
+ * Copyright 2017 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,39 +16,85 @@
*/
package org.keycloak.testsuite.federation.storage;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.List;
+import java.util.Properties;
+
import org.keycloak.Config;
+import org.keycloak.common.util.EnvUtil;
import org.keycloak.component.ComponentModel;
+import org.keycloak.component.ComponentValidationException;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
+import org.keycloak.models.RealmModel;
import org.keycloak.provider.ProviderConfigProperty;
+import org.keycloak.provider.ProviderConfigurationBuilder;
import org.keycloak.storage.UserStorageProviderFactory;
import org.keycloak.storage.UserStorageProviderModel;
import org.keycloak.storage.user.ImportSynchronization;
import org.keycloak.storage.user.SynchronizationResult;
-import java.io.IOException;
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class UserPropertyFileStorageFactory implements UserStorageProviderFactory<UserPropertyFileStorage>, ImportSynchronization {
+ public static final String PROVIDER_ID = "user-password-props-arq";
+ public static final String PROPERTY_FILE = "propertyFile";
- public static final String PROVIDER_ID = "user-password-props";
+ public static final String VALIDATION_PROP_FILE_NOT_CONFIGURED = "user property file is not configured";
+ public static final String VALIDATION_PROP_FILE_DOESNT_EXIST = "user property file does not exist";
+
+ protected static final List<ProviderConfigProperty> CONFIG_PROPERTIES;
+
+ static {
+ CONFIG_PROPERTIES = ProviderConfigurationBuilder.create()
+ .property().name(PROPERTY_FILE)
+ .type(ProviderConfigProperty.STRING_TYPE)
+ .label("Property File")
+ .helpText("File that contains name value pairs")
+ .defaultValue(null)
+ .add()
+ .property().name("federatedStorage")
+ .type(ProviderConfigProperty.BOOLEAN_TYPE)
+ .label("User Federated Storage")
+ .helpText("User Federated Storage")
+ .defaultValue(null)
+ .add()
+ .build();
+ }
+
+ @Override
+ public void validateConfiguration(KeycloakSession session, RealmModel realm, ComponentModel config) throws ComponentValidationException {
+ String fp = config.getConfig().getFirst(PROPERTY_FILE);
+ if (fp == null) {
+ throw new ComponentValidationException(VALIDATION_PROP_FILE_NOT_CONFIGURED);
+ }
+ fp = EnvUtil.replace(fp);
+ File file = new File(fp);
+ if (!file.exists()) {
+ throw new ComponentValidationException(VALIDATION_PROP_FILE_DOESNT_EXIST);
+ }
+ }
@Override
public UserPropertyFileStorage create(KeycloakSession session, ComponentModel model) {
+ String path = model.getConfig().getFirst(PROPERTY_FILE);
+ path = EnvUtil.replace(path);
+
Properties props = new Properties();
- try {
- props.load(getClass().getResourceAsStream(model.getConfig().getFirst("propertyFile")));
+ try (InputStream is = new FileInputStream(path)) {
+ props.load(is);
+ is.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
+
return new UserPropertyFileStorage(session, model, props);
}
@@ -57,17 +103,9 @@ public class UserPropertyFileStorageFactory implements UserStorageProviderFactor
return PROVIDER_ID;
}
- static List<ProviderConfigProperty> OPTIONS = new LinkedList<>();
- static {
- ProviderConfigProperty prop = new ProviderConfigProperty("propertyFile", "Property File", "file that contains name value pairs", ProviderConfigProperty.STRING_TYPE, null);
- OPTIONS.add(prop);
- prop = new ProviderConfigProperty("federatedStorage", "User Federated Storage", "use federated storage?", ProviderConfigProperty.BOOLEAN_TYPE, null);
- OPTIONS.add(prop);
-
- }
@Override
public List<ProviderConfigProperty> getConfigProperties() {
- return OPTIONS;
+ return CONFIG_PROPERTIES;
}
@Override
@@ -94,4 +132,5 @@ public class UserPropertyFileStorageFactory implements UserStorageProviderFactor
public SynchronizationResult syncSince(Date lastSync, KeycloakSessionFactory sessionFactory, String realmId, UserStorageProviderModel model) {
return SynchronizationResult.ignored();
}
+
}