/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2014 ForgeRock AS. All Rights Reserved * * The contents of this file are subject to the terms * of the Common Development and Distribution License * (the License). You may not use this file except in * compliance with the License. * * You can obtain a copy of the License at * http://forgerock.org/license/CDDLv1.0.html * See the License for the specific language governing * permission and limitations under the License. * * When distributing Covered Code, include this CDDL * Header Notice in each file and include the License file * at http://forgerock.org/license/CDDLv1.0.html * If applicable, add the following below the CDDL Header, * with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" */ package org.forgerock.openicf.connectors; import java.io.IOException; import java.util.Arrays; import org.eclipse.jetty.security.ConstraintMapping; import org.eclipse.jetty.security.ConstraintSecurityHandler; import org.eclipse.jetty.security.MappedLoginService; import org.eclipse.jetty.security.SecurityHandler; import org.eclipse.jetty.security.authentication.BasicAuthenticator; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.UserIdentity; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.util.security.Constraint; import org.eclipse.jetty.util.security.Credential; import org.forgerock.json.resource.servlet.HttpServlet; import org.forgerock.openicf.misc.scriptedcommon.ScriptedConnectorBase; import org.identityconnectors.common.logging.Log; import org.identityconnectors.framework.api.APIConfiguration; import org.identityconnectors.framework.api.ConnectorFacade; import org.identityconnectors.framework.api.ConnectorFacadeFactory; import org.identityconnectors.framework.api.operations.CreateApiOp; import org.identityconnectors.framework.api.operations.DeleteApiOp; import org.identityconnectors.framework.api.operations.UpdateApiOp; import org.identityconnectors.framework.impl.api.local.LocalConnectorFacadeImpl; import org.identityconnectors.framework.spi.Connector; import org.identityconnectors.test.common.PropertyBag; import org.identityconnectors.test.common.TestHelpers; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeSuite; /** * @author Laszlo Hordos */ public abstract class RESTTestBase { /** * Setup logging for the {@link RESTTestBase}. */ private static final Log logger = Log.getLog(RESTTestBase.class); private ConnectorFacade facade = null; private Server server = null; private SecurityHandler getSecurityHandler() throws IOException { Constraint constraint = new Constraint(Constraint.__BASIC_AUTH, "user"); constraint.setAuthenticate(true); ConstraintMapping cm = new ConstraintMapping(); cm.setPathSpec("/*"); cm.setConstraint(constraint); ConstraintSecurityHandler sh = new ConstraintSecurityHandler(); sh.setAuthenticator(new BasicAuthenticator()); sh.setConstraintMappings(Arrays.asList(new ConstraintMapping[]{cm})); MappedLoginService loginService = new MappedLoginService() { @Override protected UserIdentity loadUser(String username) { return null; } @Override protected void loadUsers() throws IOException { Credential credential = Credential.getCredential("Passw0rd"); String[] roles = new String[]{"user"}; putUser("admin", credential, roles); } }; loginService.setName("user"); sh.setLoginService(loginService); sh.setConstraintMappings(Arrays.asList(new ConstraintMapping[]{cm})); return sh; } @BeforeSuite public void startServer() throws Exception { String httpPort = System.getProperty("jetty.http.port", "28080"); System.out.append("Test port: ").println(httpPort); // Create a basic jetty server object that will listen on port 8080. // you can programmatically obtain it for use in test cases. server = new Server(Integer.parseInt(httpPort)); for (org.eclipse.jetty.server.Connector c : server.getConnectors()) { c.setHost("127.0.0.1"); } // Initializing the security handler ServletContextHandler handler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY); // ADD SERVLET // /rest/users/* ServletHolder holder = handler.addServlet(HttpServlet.class, "/rest/users/*"); holder.setInitParameter("connection-factory-class", "org.forgerock.json.resource.servlet.MemoryBackendConnectionFactoryProvider"); holder.setInitParameter("uri-template", ""); // /rest/groups/* holder = handler.addServlet(HttpServlet.class, "/rest/groups/*"); holder.setInitParameter("connection-factory-class", "org.forgerock.json.resource.servlet.MemoryBackendConnectionFactoryProvider"); holder.setInitParameter("uri-template", ""); // /crest/users/* holder = handler.addServlet(HttpServlet.class, "/crest/users/*"); holder.setInitParameter("connection-factory-class", "org.forgerock.json.resource.servlet.MemoryBackendConnectionFactoryProvider"); holder.setInitParameter("uri-template", ""); // /crest/groups/* holder = handler.addServlet(HttpServlet.class, "/crest/groups/*"); holder.setInitParameter("connection-factory-class", "org.forgerock.json.resource.servlet.MemoryBackendConnectionFactoryProvider"); holder.setInitParameter("uri-template", ""); // SECURITY HANDLER SecurityHandler sh = getSecurityHandler(); sh.setHandler(handler); server.setHandler(sh); server.start(); logger.info("Jetty Server Started"); } @AfterSuite public void stopServer() throws Exception { server.stop(); logger.info("Jetty Server Stopped"); } protected abstract ConnectorFacade getFacade(); protected ConnectorFacade getFacade(Class<? extends Connector> clazz, String environment) { if (null == facade) { facade = createConnectorFacade(clazz, environment); } return facade; } @AfterClass public synchronized void afterClass() { if (facade instanceof LocalConnectorFacadeImpl) { ((LocalConnectorFacadeImpl) facade).dispose(); } facade = null; } public static ConnectorFacade createConnectorFacade(Class<? extends Connector> clazz, String environment) { PropertyBag propertyBag = TestHelpers.getProperties(ScriptedConnectorBase.class, environment); APIConfiguration impl = TestHelpers.createTestConfiguration(clazz, propertyBag, "configuration"); impl.setProducerBufferSize(0); impl.getResultsHandlerConfiguration().setEnableAttributesToGetSearchResultsHandler(false); impl.getResultsHandlerConfiguration().setEnableCaseInsensitiveFilter(false); impl.getResultsHandlerConfiguration().setEnableFilteredResultsHandler(false); impl.getResultsHandlerConfiguration().setEnableNormalizingResultsHandler(false); impl.setTimeout(CreateApiOp.class, 25000); impl.setTimeout(UpdateApiOp.class, 25000); impl.setTimeout(DeleteApiOp.class, 25000); return ConnectorFacadeFactory.getInstance().newInstance(impl); } }