blob: c93a9454d234dd38bb8bb6b61058ffc3620b3d48 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.directory.studio.test.integration.junit5;
import static org.apache.directory.studio.test.integration.junit5.Constants.LOCALHOST;
import java.io.File;
import java.util.Collections;
import java.util.stream.Collectors;
import org.apache.directory.server.core.api.DirectoryService;
import org.apache.directory.server.core.api.partition.Partition;
import org.apache.directory.server.core.factory.DefaultDirectoryServiceFactory;
import org.apache.directory.server.ldap.LdapServer;
import org.apache.directory.server.ldap.handlers.extended.PwdModifyHandler;
import org.apache.directory.server.ldap.handlers.extended.StartTlsHandler;
import org.apache.directory.server.ldap.handlers.extended.WhoAmIHandler;
import org.apache.directory.server.ldap.handlers.sasl.SimpleMechanismHandler;
import org.apache.directory.server.ldap.handlers.sasl.cramMD5.CramMd5MechanismHandler;
import org.apache.directory.server.ldap.handlers.sasl.digestMD5.DigestMd5MechanismHandler;
import org.apache.directory.server.protocol.shared.transport.TcpTransport;
import org.apache.directory.server.protocol.shared.transport.Transport;
import org.apache.mina.util.AvailablePortFinder;
/**
* An ApacheDS implementation of a test LDAP server.
*
* This implementation starts an embedded ApacheDS and adds a partition dc=example,dc=org.
*/
public class ApacheDirectoryServer extends TestLdapServer
{
private static ApacheDirectoryServer instance;
private DirectoryService service;
private LdapServer server;
private String defaultKeyStoreFile;
public static synchronized ApacheDirectoryServer getInstance()
{
if ( instance == null )
{
int port = AvailablePortFinder.getNextAvailable( 1024 );
int portSSL = AvailablePortFinder.getNextAvailable( port + 1 );
instance = new ApacheDirectoryServer( port, portSSL );
instance.startServer();
}
return instance;
}
private void startServer()
{
try
{
DefaultDirectoryServiceFactory factory = new DefaultDirectoryServiceFactory();
factory.init( "test" );
service = factory.getDirectoryService();
Partition partition = factory.getPartitionFactory().createPartition( service.getSchemaManager(),
service.getDnFactory(), "example.org", "dc=example,dc=org", 1024,
new File( service.getInstanceLayout().getPartitionsDirectory(), "example.org" ) );
partition.initialize();
service.addPartition( partition );
service.getSchemaManager().enable( "nis", "krb5kdc" );
service.getInterceptor( "passwordHashingInterceptor" );
service.setInterceptors( service.getInterceptors().stream()
.filter( i -> !i.getName().equals( "ConfigurableHashingInterceptor" ) )
.collect( Collectors.toList() ) );
service.setAllowAnonymousAccess( true );
server = new LdapServer();
server.setDirectoryService( service );
Transport ldap = new TcpTransport( port );
server.addTransports( ldap );
Transport ldaps = new TcpTransport( portSSL );
ldaps.setEnableSSL( true );
server.addTransports( ldaps );
server.addSaslMechanismHandler( "SIMPLE", new SimpleMechanismHandler() );
server.addSaslMechanismHandler( "CRAM-MD5", new CramMd5MechanismHandler() );
server.addSaslMechanismHandler( "DIGEST-MD5", new DigestMd5MechanismHandler() );
server.setSaslRealms( Collections.singletonList( "EXAMPLE.ORG" ) );
server.setSaslHost( getHost() );
server.setSearchBaseDn( TestFixture.CONTEXT_DN.getName() );
server.addExtendedOperationHandler( new StartTlsHandler() );
server.addExtendedOperationHandler( new PwdModifyHandler() );
server.addExtendedOperationHandler( new WhoAmIHandler() );
defaultKeyStoreFile = CertificateUtil.createTempKeyStore( "testStore", "changeit".toCharArray() )
.getAbsolutePath();
server.setKeystoreFile( defaultKeyStoreFile );
server.setCertificatePassword( "changeit" );
server.start();
}
catch ( Exception e )
{
throw new RuntimeException( e );
}
}
@Override
public void prepare()
{
super.prepare();
try
{
if ( !defaultKeyStoreFile.equals( server.getKeystoreFile() ) )
{
server.setKeystoreFile( defaultKeyStoreFile );
server.reloadSslContext();
}
}
catch ( Exception e )
{
throw new RuntimeException( e );
}
}
public void setKeystore( String keystorePath ) throws Exception
{
server.setKeystoreFile( keystorePath );
server.reloadSslContext();
}
public DirectoryService getService()
{
return service;
}
@Override
public void setConfidentialityRequired( boolean confidentialityRequired )
{
server.setConfidentialityRequired( confidentialityRequired );
}
private ApacheDirectoryServer( int port, int portSSL )
{
super( LdapServerType.ApacheDS, LOCALHOST, port, portSSL, "uid=admin,ou=system", "secret" );
}
}