/* * Copyright 2016 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"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.keycloak.testsuite.federation.storage; import org.junit.After; import org.junit.Assert; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.keycloak.OAuth2Constants; import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.resource.RealmResource; import org.keycloak.common.util.Time; import org.keycloak.component.ComponentModel; import org.keycloak.models.Constants; import org.keycloak.models.GroupModel; import org.keycloak.models.KeycloakSession; import org.keycloak.models.RealmModel; import org.keycloak.models.RoleModel; import org.keycloak.models.UserCredentialModel; import org.keycloak.models.UserModel; import org.keycloak.models.cache.CachedUserModel; import org.keycloak.models.cache.infinispan.UserAdapter; import org.keycloak.models.jpa.RealmAdapter; import org.keycloak.representations.idm.ComponentRepresentation; import org.keycloak.services.managers.RealmManager; import org.keycloak.storage.StorageId; import org.keycloak.storage.UserStorageProvider; import org.keycloak.storage.UserStorageProviderModel; import org.keycloak.testsuite.ApplicationServlet; import org.keycloak.testsuite.OAuthClient; import org.keycloak.testsuite.pages.AppPage; import org.keycloak.testsuite.pages.LoginPage; import org.keycloak.testsuite.rule.KeycloakRule; import org.keycloak.testsuite.rule.WebResource; import org.keycloak.testsuite.rule.WebRule; import org.openqa.selenium.WebDriver; import java.util.Calendar; import java.util.HashSet; import java.util.List; import java.util.Set; /** * KEYCLOAK-3903 and KEYCLOAK-3620 * * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class BrokenUserStorageTest { @ClassRule public static KeycloakRule keycloakRule = new KeycloakRule(); @Rule public WebRule webRule = new WebRule(this); @WebResource protected OAuthClient oauth; @WebResource protected WebDriver driver; @WebResource protected AppPage appPage; @WebResource protected LoginPage loginPage; private void loginSuccessAndLogout(String username, String password) { loginPage.open(); loginPage.login(username, password); Assert.assertEquals(AppPage.RequestType.AUTH_RESPONSE, appPage.getRequestType()); Assert.assertNotNull(oauth.getCurrentQuery().get(OAuth2Constants.CODE)); oauth.openLogout(); } protected String AUTH_SERVER_URL = "http://localhost:8081/auth"; @Test public void testBootWithBadProviderId() throws Exception { KeycloakSession session = keycloakRule.startSession(); // set this system property System.setProperty(RealmAdapter.COMPONENT_PROVIDER_EXISTS_DISABLED, "true"); RealmModel realm = session.realms().getRealmByName("master"); String masterId = realm.getId(); UserStorageProviderModel model; model = new UserStorageProviderModel(); model.setName("bad-provider-id"); model.setPriority(2); model.setParentId(realm.getId()); model.setProviderId("error"); ComponentModel component = realm.importComponentModel(model); keycloakRule.stopSession(session, true); keycloakRule.restartServer(); keycloakRule.deployServlet("app", "/app", ApplicationServlet.class); loginSuccessAndLogout("test-user@localhost", "password"); // make sure we can list components and delete provider as this is an admin console operation Keycloak keycloakAdmin = Keycloak.getInstance(AUTH_SERVER_URL, "master", "admin", "admin", Constants.ADMIN_CLI_CLIENT_ID); RealmResource master = keycloakAdmin.realms().realm("master"); List<ComponentRepresentation> components = master.components().query(masterId, UserStorageProvider.class.getName()); boolean found = false; for (ComponentRepresentation rep : components) { if (rep.getName().equals("bad-provider-id")) { found = true; } } Assert.assertTrue(found); master.components().component(component.getId()).remove(); List<ComponentRepresentation> components2 = master.components().query(masterId, UserStorageProvider.class.getName()); Assert.assertEquals(components.size() - 1, components2.size()); } @After public void resetTimeoffset() { Time.setOffset(0); } }