Hi Kiran, I've been trying the example.
I also thought it possible that the Authenticator I have could be the problem. So I also ran the same example using other built in Authenticators. Always the same bind problem. Thanks Roy -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Kiran Ayyagari Sent: Tuesday, August 03, 2010 1:03 AM To: Apache Directory Developers List Subject: Re: Startup Error for Embedded ApacheDS Created by ApacheDS archetype hi Roy, more inline On Tue, Aug 3, 2010 at 6:28 AM, Benjamin, Roy <[email protected]> wrote: > I get an error, don't understand why this doesn't work. > > > > in stdout log: > > [17:40:29] ERROR > [org.apache.directory.shared.ldap.schema.loader.ldif.LdifSchemaLoader] > - > ERR_10004 Expecting to find a schema.ldif file in provided > baseDirectory path > 'C:\Tomcat_5_5\work\Catalina\localhost\ApacheDSXX\server-work\schema\ou=schema.ldif' > but no such file found. > > > > Question: > > 1) Is there really supposed to be a file named: 'ou=schema.ldif' ? > > 2) The path > C:\Tomcat_5_5\work\Catalina\localhost\ApacheDSXX\server-work\schema is > valid, > > so why can't the default schema be generated successfully ? yes, those LDIF files are required and also we generate the schema during startup of ApacheDS but it is unable to generate it, cause you are embedding the server in a container and containers have a different classloading mechanism which prevents generating the schema files. However if you followed my earlier mails it can be easily circumvented by setting the property -Dschema.resource.location <snip/> > My use case will require a custom Authenticator class, but if I try to > add an Authenticator > > even at various places in the code I get an exception. I've tried > every place, early in the > > code, late in the code, before startup(), pretty much in each place I > could add it. For each I > > re-check server startup. Everything is OK, except that I always get > the following exception: > > > > javax.servlet.ServletException: Bind requests only tunnel down into > partitions if there are no authenticators to handle the mechanism. > > Check to see if you have correctly configured authenticators for the server. > > ... > > root cause > > ... > > org.apache.directory.shared.ldap.exception.LdapAuthenticationNotSupportedException: > Bind requests only tunnel down into partitions if there are no > authenticators to handle the mechanism. > > Check to see if you have correctly configured authenticators for the server. > > > > I get the exception no matter where I try and add the Authenticator, > or what Authenticator I try to add. > you need to add the authenticator before startup, which I see that you are doing it (shown in the other mail), but I suspect that you are not initializing that custom authenticator properly hence the issue, here I am attaching a modified StartStopListener code. note that it also supports an additional property 'ads-data-dir' to specify the working directory HTH P.S:- appreciate your patience, and sorry if it took long time to solve this. been held up with other issues Kiran Ayyagari ============== pasting the code here (in case if attachment gets stripped ) ============== /* * 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.example; import java.io.File; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.directory.server.constants.ServerDNConstants; import org.apache.directory.server.core.DefaultDirectoryService; import org.apache.directory.server.core.DirectoryService; import org.apache.directory.server.core.LdapPrincipal; import org.apache.directory.server.core.authn.AbstractAuthenticator; import org.apache.directory.server.core.authn.AuthenticationInterceptor; import org.apache.directory.server.core.authn.Authenticator; import org.apache.directory.server.core.authn.SimpleAuthenticator; import org.apache.directory.server.core.factory.JdbmPartitionFactory; import org.apache.directory.server.core.interceptor.context.BindOperationContext; import org.apache.directory.server.core.partition.Partition; import org.apache.directory.server.core.partition.ldif.LdifPartition; import org.apache.directory.server.core.schema.SchemaPartition; import org.apache.directory.server.ldap.LdapServer; import org.apache.directory.server.protocol.shared.transport.TcpTransport; import org.apache.directory.shared.ldap.constants.AuthenticationLevel; import org.apache.directory.shared.ldap.constants.SchemaConstants; import org.apache.directory.shared.ldap.schema.SchemaManager; import org.apache.directory.shared.ldap.schema.ldif.extractor.SchemaLdifExtractor; import org.apache.directory.shared.ldap.schema.ldif.extractor.impl.DefaultSchemaLdifExtractor; import org.apache.directory.shared.ldap.schema.loader.ldif.LdifSchemaLoader; import org.apache.directory.shared.ldap.schema.manager.impl.DefaultSchemaManager; import org.apache.directory.shared.ldap.schema.registries.SchemaLoader; /** * A Servlet context listener to start and stop ApacheDS. * * @author <a href="mailto:[email protected]">Apache Directory * Project</a> */ public class StartStopListener implements ServletContextListener { private DirectoryService directoryService; private LdapServer ldapServer; /** * Startup ApacheDS embedded. */ public void contextInitialized( ServletContextEvent evt ) { try { ServletContext servletContext = evt.getServletContext(); directoryService = new DefaultDirectoryService(); directoryService.setShutdownHookEnabled( true ); ldapServer = new LdapServer(); ldapServer.setDirectoryService( directoryService ); ldapServer.setAllowAnonymousAccess( true ); // Set LDAP port to 10389 TcpTransport ldapTransport = new TcpTransport( 10389 ); ldapServer.setTransports( ldapTransport ); directoryService.setWorkingDirectory( getWorkingDir( servletContext ) ); initSchema(); initSystemPartition(); AuthenticationInterceptor authInterceptor = ( AuthenticationInterceptor ) directoryService .getInterceptor( AuthenticationInterceptor.class.getName() ); Set<Authenticator> authenticators = authInterceptor.getAuthenticators(); if ( authenticators == null ) { authenticators = new HashSet<Authenticator>(); } // add your authenticator authenticators.add( new MyAuthenticator() ); authInterceptor.setAuthenticators( authenticators ); directoryService.startup(); ldapServer.start(); // Store directoryService in context to provide it to servlets etc. servletContext.setAttribute( DirectoryService.JNDI_KEY, directoryService ); } catch ( Exception e ) { throw new RuntimeException( e ); } } /** * Shutdown ApacheDS embedded. */ public void contextDestroyed( ServletContextEvent evt ) { try { ldapServer.stop(); directoryService.shutdown(); } catch ( Exception e ) { throw new RuntimeException( e ); } } /** * Inits the schema and schema partition. */ private void initSchema() throws Exception { SchemaPartition schemaPartition = directoryService.getSchemaService().getSchemaPartition(); // Init the LdifPartition LdifPartition ldifPartition = new LdifPartition(); String workingDirectory = directoryService.getWorkingDirectory().getPath(); ldifPartition.setWorkingDirectory( workingDirectory + "/schema" ); // Extract the schema on disk (a brand new one) and load the registries File serverWorkDirectory = new File( workingDirectory ); File schemaRepository = new File( serverWorkDirectory, "schema" ); SchemaLdifExtractor extractor = new DefaultSchemaLdifExtractor( serverWorkDirectory ); if ( !schemaRepository.exists() ) { // extract only if the schema directory is not present extractor.extractOrCopy(); } else { System.out.println( "schema partition directory exists, skipping schema extraction" ); } schemaPartition.setWrappedPartition( ldifPartition ); SchemaLoader loader = new LdifSchemaLoader( schemaRepository ); SchemaManager schemaManager = new DefaultSchemaManager( loader ); directoryService.setSchemaManager( schemaManager ); // We have to load the schema now, otherwise we won't be able // to initialize the Partitions, as we won't be able to parse // and normalize their suffix DN schemaManager.loadAllEnabled(); schemaPartition.setSchemaManager( schemaManager ); List<Throwable> errors = schemaManager.getErrors(); if ( errors.size() != 0 ) { System.out.println( errors ); throw new RuntimeException( "there were errors while loading schema" ); } } /** * Inits the system partition. * * @throws Exception the exception */ private void initSystemPartition() throws Exception { // change the working directory to something that is unique // on the system and somewhere either under target directory // or somewhere in a temp area of the machine. JdbmPartitionFactory partitionFactory = new JdbmPartitionFactory(); // Inject the System Partition Partition systemPartition = partitionFactory.createPartition( "system", ServerDNConstants.SYSTEM_DN, 500, new File( directoryService.getWorkingDirectory(), "system" ) ); systemPartition.setSchemaManager( directoryService.getSchemaManager() ); partitionFactory.addIndex( systemPartition, SchemaConstants.OBJECT_CLASS_AT, 100 ); directoryService.setSystemPartition( systemPartition ); } private File getWorkingDir( ServletContext servletContext ) { File workingDir = null; String workDirPath = System.getProperty( "ads-data-dir" ); if ( workDirPath == null ) { // Determine an appropriate working directory workingDir = ( File ) servletContext.getAttribute( "javax.servlet.context.tempdir" ); workingDir = new File( workingDir, "server-work" ); System.out.println( "ads-data-dir property is not set storing the ldap data in temporary directory " + workingDir.getAbsolutePath() ); } else { workingDir = new File( workDirPath ); System.out.println( "storing the ldap data in the directory " + workingDir.getAbsolutePath() ); } workingDir.mkdirs(); return workingDir; } } class MyAuthenticator extends AbstractAuthenticator { private SimpleAuthenticator wrappedAuth; public MyAuthenticator() { super( AuthenticationLevel.SIMPLE ); wrappedAuth = new SimpleAuthenticator(); } @Override protected void doInit() { try { wrappedAuth.init( getDirectoryService() ); } catch ( Exception e ) { throw new RuntimeException( e ); } } public LdapPrincipal authenticate( BindOperationContext bindContext ) throws Exception { System.out.println( "++++++++++ authenticating using a custome authenticator '" + MyAuthenticator.class.getName() + "'" ); return wrappedAuth.authenticate( bindContext ); } }
