/** * This file is part of git-as-svn. It is subject to the license terms * in the LICENSE file found in the top-level directory of this distribution * and at http://www.gnu.org/licenses/gpl-2.0.html. No part of git-as-svn, * including this file, may be copied, modified, propagated, or distributed * except according to the terms contained in the LICENSE file. */ package svnserver.ldap; import org.apache.directory.api.ldap.model.constants.SchemaConstants; import org.apache.directory.api.ldap.model.constants.SupportedSaslMechanisms; import org.apache.directory.api.ldap.model.name.Dn; import org.apache.directory.api.ldap.model.schema.SchemaManager; import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager; import org.apache.directory.server.core.DefaultDirectoryService; import org.apache.directory.server.core.api.DirectoryService; import org.apache.directory.server.core.api.InstanceLayout; import org.apache.directory.server.core.api.partition.Partition; import org.apache.directory.server.core.api.schema.SchemaPartition; import org.apache.directory.server.core.partition.impl.avl.AvlPartition; import org.apache.directory.server.ldap.LdapServer; import org.apache.directory.server.ldap.handlers.sasl.digestMD5.DigestMd5MechanismHandler; import org.apache.directory.server.protocol.shared.store.LdifFileLoader; import org.apache.directory.server.protocol.shared.transport.TcpTransport; import org.jetbrains.annotations.NotNull; import svnserver.TestHelper; import svnserver.auth.ldap.config.LdapBindSimple; import svnserver.auth.ldap.config.LdapUserDBConfig; import svnserver.config.UserDBConfig; import java.io.File; import java.net.URL; import java.util.Collections; /** * Embedded LDAP server. * * @author Artem V. Navrotskiy (bozaro at buzzsoft.ru) */ public final class EmbeddedDirectoryServer implements AutoCloseable { public static final String HOST = "127.0.0.3"; @NotNull private final DirectoryService service; @NotNull private final LdapServer ldapServer; @NotNull private final Dn baseDn; private EmbeddedDirectoryServer(@NotNull String dn, @NotNull URL ldifStream) throws Exception { // Initialize the LDAP service service = new DefaultDirectoryService(); service.setInstanceLayout(new InstanceLayout(TestHelper.createTempDir("ldap"))); // Disable the ChangeLog system service.getChangeLog().setEnabled(false); final SchemaManager schemaManager = new DefaultSchemaManager(); service.setSchemaManager(schemaManager); final SchemaPartition schemaPartition = new SchemaPartition(schemaManager); schemaPartition.setWrappedPartition(createPartition(new Dn(SchemaConstants.OU_SCHEMA), schemaManager)); service.setSchemaPartition(schemaPartition); service.setSystemPartition(createPartition(new Dn("ou=system"), schemaManager)); // Create a new partition baseDn = new Dn(dn); service.addPartition(createPartition(baseDn, schemaManager)); ldapServer = new LdapServer(); ldapServer.setSaslHost(HOST); ldapServer.setSearchBaseDn(dn); ldapServer.setTransports(new TcpTransport(HOST, 10389)); ldapServer.addSaslMechanismHandler(SupportedSaslMechanisms.DIGEST_MD5, new DigestMd5MechanismHandler()); ldapServer.setDirectoryService(service); // And start the service service.startup(); final LdifFileLoader ldifLoader = new LdifFileLoader(service.getAdminSession(), new File(ldifStream.toURI()), Collections.emptyList()); ldifLoader.execute(); // Bind to port. ldapServer.start(); } @NotNull private Partition createPartition(@NotNull Dn partitionDn, @NotNull SchemaManager schemaManager) throws Exception { // Create a new partition AvlPartition partition = new AvlPartition(schemaManager); partition.setId(partitionDn.getRdn().getNormValue()); partition.setSuffixDn(new Dn(partitionDn.getNormName())); return partition; } @Override public void close() throws Exception { ldapServer.stop(); service.shutdown(); } @NotNull public static EmbeddedDirectoryServer create() throws Exception { return new EmbeddedDirectoryServer("dc=example,dc=com", EmbeddedDirectoryServer.class.getResource("ldap.ldif")); } public UserDBConfig createUserConfig() throws Exception { final LdapUserDBConfig config = new LdapUserDBConfig(); config.setBind(new LdapBindSimple("ldapadmin", "ldapadmin")); config.setConnectionUrl("ldap://" + ldapServer.getSaslHost() + ":" + ldapServer.getPort() + "/" + baseDn.getName()); config.setSearchFilter(""); config.setLoginAttribute("uid"); config.setEmailAttribute("mail"); config.setNameAttribute("givenName"); config.setMaxConnections(3); return config; } }