/* * JBoss, Home of Professional Open Source. * Copyright 2013, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.domain.management.security.realms; import java.io.File; import java.io.IOException; import java.io.InputStream; import org.apache.directory.api.ldap.model.entry.DefaultEntry; import org.apache.directory.api.ldap.model.exception.LdapException; import org.apache.directory.api.ldap.model.ldif.LdifEntry; import org.apache.directory.api.ldap.model.ldif.LdifReader; import org.apache.directory.api.ldap.model.schema.SchemaManager; import org.apache.directory.server.core.api.CoreSession; import org.apache.directory.server.core.api.DirectoryService; import org.apache.directory.server.core.api.partition.Partition; import org.apache.directory.server.core.factory.DirectoryServiceFactory; import org.apache.directory.server.core.factory.PartitionFactory; import org.apache.directory.server.ldap.LdapServer; import org.apache.directory.server.protocol.shared.transport.TcpTransport; import org.apache.directory.server.protocol.shared.transport.Transport; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.junit.runners.Suite; /** * Suite for LDAP related tests. * * By using a suite the LDAP server can be started and initialised once and then * used for all test cases executed within the suite. * * @author <a href="mailto:darran.lofthouse@jboss.com">Darran Lofthouse</a> */ @RunWith(Suite.class) @Suite.SuiteClasses({ LdapAuthenticationSuiteTest.class, GroupToPrincipalLdapSuiteTest.class, PrincipalToGroupLdapSuiteTest.class, PrincipalToGroupMissingNameLdapSuiteTest.class, LdapAuthenticationFollowSuiteTest.class, LdapAuthenticationThrowSuiteTest.class, GroupLoadingReferralsSuiteTest.class }) public class LdapTestSuite { static final String HOST_NAME = "localhost"; static int MASTER_LDAP_PORT = 11390; static int SLAVE_LDAP_PORT = 11391; // Note: This port is specified in the ldif files that contain referrals. private static final String MASTER_DIRECTORY_NAME = "Test Service"; private static final String SLAVE_DIRECTORY_NAME = "Test Service (Slave)"; private static boolean initialised; /* * Master */ private static File masterWorkingDir; private static DirectoryService masterDirectoryService; private static LdapServer masterLdapServer; /* * Slave */ private static File slaveWorkingDir; private static DirectoryService slaveDirectoryService; private static LdapServer slaveLdapServer; @BeforeClass public static void startLdapServersForSuite() throws Exception { startLdapServers(true); } public static boolean startLdapServers(final boolean includeSlave) throws Exception { if (initialised == true) { return false; } startMasterLdapServer(); if (includeSlave) { startSlaveLdapServer(); } initialised=true; return true; } private static void startMasterLdapServer() throws Exception { masterWorkingDir = createWorkingDir(masterWorkingDir, "master"); DirectoryServiceFactory dsf = new InMemoryDirectoryServiceFactory(); dsf.init(MASTER_DIRECTORY_NAME); masterDirectoryService = dsf.getDirectoryService(); masterDirectoryService.getChangeLog().setEnabled(false); SchemaManager schemaManager = masterDirectoryService.getSchemaManager(); createPartition(dsf, schemaManager, "simple", "dc=simple,dc=wildfly,dc=org", masterDirectoryService, masterWorkingDir); createPartition(dsf, schemaManager, "group-to-principal", "dc=group-to-principal,dc=wildfly,dc=org", masterDirectoryService, masterWorkingDir); createPartition(dsf, schemaManager, "principal-to-group", "dc=principal-to-group,dc=wildfly,dc=org", masterDirectoryService, masterWorkingDir); CoreSession adminSession = masterDirectoryService.getAdminSession(); processLdif(schemaManager, adminSession, "memberOf-schema.ldif"); processLdif(schemaManager, adminSession, "simple-partition.ldif"); processLdif(schemaManager, adminSession, "group-to-principal.ldif"); processLdif(schemaManager, adminSession, "principal-to-group.ldif"); masterLdapServer = new LdapServer(); masterLdapServer.setServiceName("DefaultLDAP"); Transport ldap = new TcpTransport( "0.0.0.0", MASTER_LDAP_PORT, 3, 5 ); masterLdapServer.addTransports(ldap); masterLdapServer.setDirectoryService(masterDirectoryService); masterLdapServer.start(); } private static void startSlaveLdapServer() throws Exception { slaveWorkingDir = createWorkingDir(slaveWorkingDir, "slave"); DirectoryServiceFactory dsf = new InMemoryDirectoryServiceFactory(); dsf.init(SLAVE_DIRECTORY_NAME); slaveDirectoryService = dsf.getDirectoryService(); slaveDirectoryService.getChangeLog().setEnabled(false); SchemaManager schemaManager = slaveDirectoryService.getSchemaManager(); createPartition(dsf, schemaManager, "simple", "dc=simple,dc=wildfly,dc=org", slaveDirectoryService, slaveWorkingDir); createPartition(dsf, schemaManager, "group-to-principal", "dc=group-to-principal,dc=wildfly,dc=org", slaveDirectoryService, slaveWorkingDir); createPartition(dsf, schemaManager, "principal-to-group", "dc=principal-to-group,dc=wildfly,dc=org", slaveDirectoryService, slaveWorkingDir); CoreSession adminSession = slaveDirectoryService.getAdminSession(); processLdif(schemaManager, adminSession, "memberOf-schema.ldif"); processLdif(schemaManager, adminSession, "simple-partition-slave.ldif"); processLdif(schemaManager, adminSession, "group-to-principal-slave.ldif"); processLdif(schemaManager, adminSession, "principal-to-group-slave.ldif"); slaveLdapServer = new LdapServer(); slaveLdapServer.setServiceName("DefaultLDAP"); Transport ldap = new TcpTransport( "0.0.0.0", SLAVE_LDAP_PORT, 3, 5 ); slaveLdapServer.addTransports(ldap); slaveLdapServer.setDirectoryService(slaveDirectoryService); slaveLdapServer.start(); } private static void createPartition(final DirectoryServiceFactory dsf, final SchemaManager schemaManager, final String id, final String suffix, final DirectoryService directoryService, final File workingDir) throws Exception { PartitionFactory pf = dsf.getPartitionFactory(); Partition p = pf.createPartition(schemaManager, id, suffix, 1000, workingDir); pf.addIndex(p, "uid", 10); pf.addIndex(p, "departmentNumber", 10); pf.addIndex(p, "member", 10); pf.addIndex(p, "memberOf", 10); p.initialize(); directoryService.addPartition(p); } private static void processLdif(final SchemaManager schemaManager, final CoreSession adminSession, final String ldifName) throws LdapException, IOException { InputStream ldifInput = LdapTestSuite.class.getResourceAsStream(ldifName); LdifReader ldifReader = new LdifReader(ldifInput); for (LdifEntry ldifEntry : ldifReader) { adminSession.add(new DefaultEntry(schemaManager, ldifEntry.getEntry())); } ldifReader.close(); ldifInput.close(); } private static File createWorkingDir(final File currentDir, final String node) throws IOException { File workingDir = currentDir; if (workingDir == null) { if (workingDir == null) { workingDir = new File("."); workingDir = new File(workingDir, "target"); workingDir = new File(workingDir, "apacheds_working"); workingDir = new File(workingDir, node).getCanonicalFile(); if (!workingDir.exists()) { workingDir.mkdirs(); } } } for (File current : workingDir.listFiles()) { current.delete(); } return workingDir; } @AfterClass public static void stopLdapServers() throws Exception { if (masterLdapServer != null) { masterLdapServer.stop(); masterLdapServer = null; } if (masterDirectoryService != null) { masterDirectoryService.shutdown(); masterDirectoryService = null; } masterWorkingDir = null; if (slaveLdapServer != null) { slaveLdapServer.stop(); slaveLdapServer = null; } if (slaveDirectoryService != null) { slaveDirectoryService.shutdown(); slaveDirectoryService = null; } slaveWorkingDir = null; initialised = false; } }