You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2010/01/06 19:27:19 UTC
svn commit: r896599 [13/30] - in /directory/apacheds/trunk: ./
avl-partition/ avl-partition/src/ avl-partition/src/main/
avl-partition/src/main/java/ avl-partition/src/main/java/org/
avl-partition/src/main/java/org/apache/ avl-partition/src/main/java/o...
Modified: directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java (original)
+++ directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java Wed Jan 6 18:26:43 2010
@@ -20,12 +20,34 @@
package org.apache.directory.server.core.jndi;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import javax.naming.Context;
+import javax.naming.InvalidNameException;
+import javax.naming.Name;
+import javax.naming.NameNotFoundException;
+import javax.naming.NameParser;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.Reference;
+import javax.naming.Referenceable;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.SearchControls;
+import javax.naming.event.EventContext;
+import javax.naming.event.NamingListener;
+import javax.naming.ldap.Control;
+import javax.naming.spi.DirStateFactory;
+import javax.naming.spi.DirectoryManager;
+
import org.apache.directory.server.core.CoreSession;
import org.apache.directory.server.core.DefaultCoreSession;
import org.apache.directory.server.core.DirectoryService;
+import org.apache.directory.server.core.LdapPrincipal;
import org.apache.directory.server.core.OperationManager;
-import org.apache.directory.server.core.authn.LdapPrincipal;
-import org.apache.directory.shared.ldap.entry.EntryAttribute;
import org.apache.directory.server.core.entry.ClonedServerEntry;
import org.apache.directory.server.core.entry.DefaultServerEntry;
import org.apache.directory.server.core.entry.ServerEntry;
@@ -52,6 +74,7 @@
import org.apache.directory.shared.ldap.constants.SchemaConstants;
import org.apache.directory.shared.ldap.cursor.EmptyCursor;
import org.apache.directory.shared.ldap.cursor.SingletonCursor;
+import org.apache.directory.shared.ldap.entry.EntryAttribute;
import org.apache.directory.shared.ldap.entry.Modification;
import org.apache.directory.shared.ldap.exception.LdapNoPermissionException;
import org.apache.directory.shared.ldap.exception.LdapSchemaViolationException;
@@ -61,34 +84,12 @@
import org.apache.directory.shared.ldap.filter.SearchScope;
import org.apache.directory.shared.ldap.message.AliasDerefMode;
import org.apache.directory.shared.ldap.message.ResultCodeEnum;
-import org.apache.directory.shared.ldap.name.AttributeTypeAndValue;
+import org.apache.directory.shared.ldap.name.AVA;
import org.apache.directory.shared.ldap.name.LdapDN;
import org.apache.directory.shared.ldap.name.Rdn;
import org.apache.directory.shared.ldap.util.AttributeUtils;
import org.apache.directory.shared.ldap.util.StringTools;
-import javax.naming.Context;
-import javax.naming.InvalidNameException;
-import javax.naming.Name;
-import javax.naming.NameNotFoundException;
-import javax.naming.NameParser;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.naming.Reference;
-import javax.naming.Referenceable;
-import javax.naming.directory.DirContext;
-import javax.naming.directory.SearchControls;
-import javax.naming.event.EventContext;
-import javax.naming.event.NamingListener;
-import javax.naming.ldap.Control;
-import javax.naming.spi.DirStateFactory;
-import javax.naming.spi.DirectoryManager;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-
/**
* A non-federated abstract Context implementation.
@@ -148,7 +149,6 @@
* @throws NamingException if the environment parameters are not set
* correctly.
*/
- @SuppressWarnings(value = { "unchecked" })
protected ServerContext( DirectoryService service, Hashtable<String, Object> env ) throws Exception
{
this.service = service;
@@ -338,7 +338,7 @@
if ( result )
{
- ServerEntry emptyEntry = new DefaultServerEntry( service.getRegistries(), LdapDN.EMPTY_LDAPDN );
+ ServerEntry emptyEntry = new DefaultServerEntry( service.getSchemaManager(), LdapDN.EMPTY_LDAPDN );
return new BaseEntryFilteringCursor( new SingletonCursor<ServerEntry>( emptyEntry ), (SearchOperationContext)opContext );
}
else
@@ -484,7 +484,7 @@
/**
* Used to encapsulate [de]marshalling of controls before and after moveAndRename operations.
*/
- protected void doMoveAndRenameOperation( LdapDN oldDn, LdapDN parent, String newRdn, boolean delOldDn )
+ protected void doMoveAndRenameOperation( LdapDN oldDn, LdapDN parent, Rdn newRdn, boolean delOldDn )
throws Exception
{
// setup the op context and populate with request controls
@@ -552,10 +552,10 @@
/**
* Used to encapsulate [de]marshalling of controls before and after rename operations.
*/
- protected void doRename( LdapDN oldDn, String newRdn, boolean delOldRdn ) throws Exception
+ protected void doRename( LdapDN oldDn, Rdn newRdn, boolean delOldRdn ) throws Exception
{
// setup the op context and populate with request controls
- RenameOperationContext opCtx = new RenameOperationContext( session, oldDn, new Rdn( newRdn ), delOldRdn );
+ RenameOperationContext opCtx = new RenameOperationContext( session, oldDn, newRdn, delOldRdn );
opCtx.addRequestControls( requestControls );
// Inject the referral handling into the operation context
@@ -653,7 +653,7 @@
*/
public String getNameInNamespace() throws NamingException
{
- return dn.getUpName();
+ return dn.getName();
}
@@ -807,11 +807,11 @@
if ( rdn.size() == 1 )
{
- serverEntry.put( rdn.getUpType(), ( String ) rdn.getValue() );
+ serverEntry.put( rdn.getUpType(), ( String ) rdn.getNormValue() );
}
else
{
- for ( AttributeTypeAndValue atav : rdn )
+ for ( AVA atav : rdn )
{
serverEntry.put( atav.getUpType(), atav.getNormValue().getString() );
}
@@ -831,7 +831,7 @@
// let's be sure that the Attributes is case insensitive
ServerEntry outServerEntry = ServerEntryUtils.toServerEntry( AttributeUtils.toCaseInsensitive( res
- .getAttributes() ), target, service.getRegistries() );
+ .getAttributes() ), target, service.getSchemaManager() );
if ( outServerEntry != null )
{
@@ -885,7 +885,7 @@
injectRdnAttributeValues( target, serverEntry );
// Serialize object into entry attributes and add it.
- JavaLdapSupport.serialize( serverEntry, obj, service.getRegistries() );
+ JavaLdapSupport.serialize( serverEntry, obj, service.getSchemaManager() );
try
{
doAddOperation( target, serverEntry );
@@ -899,7 +899,7 @@
{
// Grab attributes and merge with outAttrs
ServerEntry serverEntry = ServerEntryUtils.toServerEntry( ( ( DirContext ) obj ).getAttributes( "" ),
- target, service.getRegistries() );
+ target, service.getSchemaManager() );
if ( ( outServerEntry != null ) && ( outServerEntry.size() > 0 ) )
{
@@ -949,13 +949,13 @@
}
// calculate parents
- LdapDN oldBase = ( LdapDN ) oldName.clone();
- oldBase.remove( oldName.size() - 1 );
- LdapDN newBase = ( LdapDN ) newName.clone();
- newBase.remove( newName.size() - 1 );
+ LdapDN oldParent = (LdapDN)oldDn.clone();
+ oldParent.remove( oldDn.size() - 1 );
+ LdapDN newParent = ( LdapDN ) newDn.clone();
+ newParent.remove( newDn.size() - 1 );
- String newRdn = newName.get( newName.size() - 1 );
- String oldRdn = oldName.get( oldName.size() - 1 );
+ Rdn oldRdn = oldDn.getRdn();
+ Rdn newRdn = newDn.getRdn();
boolean delOldRdn = true;
/*
@@ -977,7 +977,7 @@
* a move operation. Furthermore if the RDN in the move operation
* changes it is both an RDN change and a move operation.
*/
- if ( ( oldName.size() == newName.size() ) && oldBase.equals( newBase ) )
+ if ( oldParent.equals( newParent ) )
{
try
{
@@ -990,14 +990,11 @@
}
else
{
- LdapDN target = ( LdapDN ) newDn.clone();
- target.remove( newDn.size() - 1 );
-
- if ( newRdn.equalsIgnoreCase( oldRdn ) )
+ if ( newRdn.equals( oldRdn ) )
{
try
{
- doMove( oldDn, target );
+ doMove( oldDn, newParent );
}
catch ( Exception e )
{
@@ -1008,7 +1005,7 @@
{
try
{
- doMoveAndRenameOperation( oldDn, target, newRdn, delOldRdn );
+ doMoveAndRenameOperation( oldDn, newParent, newRdn, delOldRdn );
}
catch ( Exception e )
{
Modified: directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java (original)
+++ directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java Wed Jan 6 18:26:43 2010
@@ -20,9 +20,33 @@
package org.apache.directory.server.core.jndi;
+import java.io.Serializable;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.naming.Name;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.Reference;
+import javax.naming.Referenceable;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.InvalidSearchFilterException;
+import javax.naming.directory.ModificationItem;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+import javax.naming.event.EventDirContext;
+import javax.naming.event.NamingListener;
+import javax.naming.spi.DirStateFactory;
+import javax.naming.spi.DirectoryManager;
+
import org.apache.directory.server.core.CoreSession;
import org.apache.directory.server.core.DirectoryService;
-import org.apache.directory.server.core.authn.LdapPrincipal;
+import org.apache.directory.server.core.LdapPrincipal;
import org.apache.directory.server.core.entry.ServerEntry;
import org.apache.directory.server.core.entry.ServerEntryUtils;
import org.apache.directory.server.core.event.DirectoryListener;
@@ -43,35 +67,12 @@
import org.apache.directory.shared.ldap.filter.SearchScope;
import org.apache.directory.shared.ldap.filter.SimpleNode;
import org.apache.directory.shared.ldap.message.AliasDerefMode;
-import org.apache.directory.shared.ldap.name.AttributeTypeAndValue;
+import org.apache.directory.shared.ldap.name.AVA;
import org.apache.directory.shared.ldap.name.LdapDN;
import org.apache.directory.shared.ldap.name.Rdn;
import org.apache.directory.shared.ldap.util.AttributeUtils;
import org.apache.directory.shared.ldap.util.StringTools;
-import javax.naming.Name;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.naming.Reference;
-import javax.naming.Referenceable;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.Attributes;
-import javax.naming.directory.DirContext;
-import javax.naming.directory.InvalidSearchFilterException;
-import javax.naming.directory.ModificationItem;
-import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
-import javax.naming.event.EventDirContext;
-import javax.naming.event.NamingListener;
-import javax.naming.spi.DirStateFactory;
-import javax.naming.spi.DirectoryManager;
-import java.io.Serializable;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-
/**
* The DirContext implementation for the Server Side JNDI LDAP provider.
@@ -213,7 +214,7 @@
List<Modification> newMods = ServerEntryUtils.convertToServerModification(
modItems,
- getDirectoryService().getRegistries().getAttributeTypeRegistry() );
+ getDirectoryService().getSchemaManager() );
try
{
@@ -250,7 +251,7 @@
public void modifyAttributes( Name name, ModificationItem[] mods ) throws NamingException
{
List<Modification> newMods = ServerEntryUtils
- .toServerModification( mods, getDirectoryService().getRegistries().getAttributeTypeRegistry() );
+ .toServerModification( mods, getDirectoryService().getSchemaManager() );
try
{
doModifyOperation( buildTarget( new LdapDN( name ) ), newMods );
@@ -270,7 +271,7 @@
{
List<Modification> newMods = ServerEntryUtils
.convertToServerModification( mods,
- getDirectoryService().getRegistries().getAttributeTypeRegistry() );
+ getDirectoryService().getSchemaManager() );
try
{
doModifyOperation( buildTarget( new LdapDN( name ) ), newMods );
@@ -314,7 +315,7 @@
LdapDN target = buildTarget( name );
ServerEntry serverEntry = ServerEntryUtils.toServerEntry( AttributeUtils.toCaseInsensitive( attrs ), target,
- getDirectoryService().getRegistries() );
+ getDirectoryService().getSchemaManager() );
// No object binding so we just add the attributes
if ( null == obj )
@@ -334,7 +335,7 @@
// First, use state factories to do a transformation
DirStateFactory.Result res = DirectoryManager.getStateToBind( obj, name, this, getEnvironment(), attrs );
ServerEntry outServerEntry = ServerEntryUtils.toServerEntry(
- res.getAttributes(), target, getDirectoryService().getRegistries() );
+ res.getAttributes(), target, getDirectoryService().getSchemaManager() );
if ( outServerEntry != serverEntry )
{
@@ -386,7 +387,7 @@
}
// Serialize object into entry attributes and add it.
- JavaLdapSupport.serialize( serverEntry, obj, getDirectoryService().getRegistries() );
+ JavaLdapSupport.serialize( serverEntry, obj, getDirectoryService().getSchemaManager() );
try
{
// setup the op context
@@ -401,7 +402,7 @@
{
// Grab attributes and merge with outAttrs
ServerEntry entry = ServerEntryUtils.toServerEntry( ( ( DirContext ) obj ).getAttributes( "" ), target,
- getDirectoryService().getRegistries() );
+ getDirectoryService().getSchemaManager() );
if ( ( outServerEntry != null ) && ( outServerEntry.size() > 0 ) )
{
@@ -468,7 +469,9 @@
*/
public DirContext createSubcontext( String name, Attributes attrs ) throws NamingException
{
- return createSubcontext( new LdapDN( name ), AttributeUtils.toCaseInsensitive( attrs ) );
+ LdapDN dn = new LdapDN( name );
+ Attributes attributes = AttributeUtils.toCaseInsensitive( attrs );
+ return createSubcontext( dn, attributes );
}
@@ -492,7 +495,7 @@
if ( rdn.size() == 1 )
{
String rdnAttribute = rdn.getUpType();
- String rdnValue = ( String ) rdn.getValue();
+ String rdnValue = ( String ) rdn.getNormValue();
// Add the Rdn attribute
boolean doRdnPut = attributes.get( rdnAttribute ) == null;
@@ -508,9 +511,9 @@
}
else
{
- for ( Iterator<AttributeTypeAndValue> ii = rdn.iterator(); ii.hasNext(); /**/)
+ for ( Iterator<AVA> ii = rdn.iterator(); ii.hasNext(); /**/)
{
- AttributeTypeAndValue atav = ii.next();
+ AVA atav = ii.next();
// Add the Rdn attribute
boolean doRdnPut = attributes.get( atav.getNormType() ) == null;
@@ -530,7 +533,7 @@
try
{
ServerEntry serverEntry = ServerEntryUtils.toServerEntry( attributes,
- target, getDirectoryService().getRegistries() );
+ target, getDirectoryService().getSchemaManager() );
doAddOperation( target, serverEntry );
}
catch ( Exception e )
Modified: directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerLdapContext.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerLdapContext.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerLdapContext.java (original)
+++ directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerLdapContext.java Wed Jan 6 18:26:43 2010
@@ -30,7 +30,7 @@
import org.apache.directory.server.core.CoreSession;
import org.apache.directory.server.core.DirectoryService;
-import org.apache.directory.server.core.authn.LdapPrincipal;
+import org.apache.directory.server.core.LdapPrincipal;
import org.apache.directory.server.core.entry.ServerBinaryValue;
import org.apache.directory.server.core.entry.ServerStringValue;
import org.apache.directory.server.core.interceptor.context.CompareOperationContext;
@@ -181,7 +181,7 @@
{
Value<?> val = null;
- AttributeType attributeType = getService().getRegistries().getAttributeTypeRegistry().lookup( oid );
+ AttributeType attributeType = getService().getSchemaManager().lookupAttributeTypeRegistry( oid );
// make sure we add the request controls to operation
if ( attributeType.getSyntax().isHumanReadable() )
Modified: directory/apacheds/trunk/core-jndi/src/test/java/org/apache/directory/server/core/jndi/LdapJndiPropertiesTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-jndi/src/test/java/org/apache/directory/server/core/jndi/LdapJndiPropertiesTest.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core-jndi/src/test/java/org/apache/directory/server/core/jndi/LdapJndiPropertiesTest.java (original)
+++ directory/apacheds/trunk/core-jndi/src/test/java/org/apache/directory/server/core/jndi/LdapJndiPropertiesTest.java Wed Jan 6 18:26:43 2010
@@ -29,9 +29,11 @@
import org.apache.directory.shared.ldap.constants.AuthenticationLevel;
import org.apache.directory.shared.ldap.exception.LdapConfigurationException;
import org.apache.directory.shared.ldap.util.StringTools;
+import org.junit.Test;
-import junit.framework.TestCase;
-
+import static org.junit.Assert.fail;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
/**
* Tests the LdapJndiProperties.
@@ -39,8 +41,9 @@
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$
*/
-public class LdapJndiPropertiesTest extends TestCase
+public class LdapJndiPropertiesTest
{
+ @Test
public void testEmptyEnv() throws Exception
{
try
@@ -54,6 +57,7 @@
}
+ @Test
public void testNullEnv() throws Exception
{
try
@@ -67,6 +71,7 @@
}
+ @Test
public void testNoAuthWithCredsEnv() throws Exception
{
Hashtable<String,Object> env = new Hashtable<String,Object>();
@@ -79,6 +84,7 @@
}
+ @Test
public void testNoAuthWithNoCredsEnv() throws Exception
{
Hashtable<String,Object> env = new Hashtable<String,Object>();
@@ -90,6 +96,7 @@
}
+ @Test
public void testAuthWithNoCredsEnv() throws Exception
{
Hashtable<String,Object> env = new Hashtable<String,Object>();
@@ -106,6 +113,7 @@
}
+ @Test
public void testAuthWithNoCredsStrong() throws Exception
{
Hashtable<String,Object> env = new Hashtable<String,Object>();
@@ -118,6 +126,7 @@
}
+ @Test
public void testAuthWithCredsStrong() throws Exception
{
Hashtable<String,Object> env = new Hashtable<String,Object>();
Modified: directory/apacheds/trunk/core-jndi/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-jndi/src/test/resources/log4j.properties?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core-jndi/src/test/resources/log4j.properties (original)
+++ directory/apacheds/trunk/core-jndi/src/test/resources/log4j.properties Wed Jan 6 18:26:43 2010
@@ -14,7 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#############################################################################
-log4j.rootCategory=ERROR, stdout
+log4j.rootCategory=OFF, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
Propchange: directory/apacheds/trunk/core-mock/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Jan 6 18:26:43 2010
@@ -0,0 +1,16 @@
+target
+.clover
+.wtpmodules
+.settings
+.deployables
+apache.org
+.metadata
+*.md5
+*.log
+*.iml
+*.ipr
+*.iws
+.project
+.classpath
+nbproject
+schema
Modified: directory/apacheds/trunk/core/pom.xml
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/pom.xml?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core/pom.xml (original)
+++ directory/apacheds/trunk/core/pom.xml Wed Jan 6 18:26:43 2010
@@ -51,31 +51,31 @@
<dependency>
<groupId>org.apache.directory.server</groupId>
- <artifactId>apacheds-xdbm-tools</artifactId>
+ <artifactId>apacheds-core-api</artifactId>
<version>${pom.version}</version>
</dependency>
<dependency>
- <groupId>org.apache.directory.server</groupId>
- <artifactId>apacheds-schema-bootstrap</artifactId>
- <version>${pom.version}</version>
+ <groupId>org.apache.directory.shared</groupId>
+ <artifactId>shared-ldap-schema</artifactId>
+ <version>${org.apache.directory.shared.version}</version>
</dependency>
<dependency>
- <groupId>org.apache.directory.server</groupId>
- <artifactId>apacheds-core-entry</artifactId>
- <version>${pom.version}</version>
+ <groupId>org.apache.directory.shared</groupId>
+ <artifactId>shared-ldap-schema-manager</artifactId>
+ <version>${org.apache.directory.shared.version}</version>
</dependency>
<dependency>
<groupId>org.apache.directory.server</groupId>
- <artifactId>apacheds-schema-registries</artifactId>
+ <artifactId>apacheds-xdbm-tools</artifactId>
<version>${pom.version}</version>
</dependency>
<dependency>
<groupId>org.apache.directory.server</groupId>
- <artifactId>apacheds-core-shared</artifactId>
+ <artifactId>apacheds-core-entry</artifactId>
<version>${pom.version}</version>
</dependency>
@@ -104,19 +104,6 @@
</dependency>
<dependency>
- <groupId>org.apache.directory.server</groupId>
- <artifactId>apacheds-bootstrap-extract</artifactId>
- <version>${pom.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.apache.directory.server</groupId>
- <artifactId>apacheds-bootstrap-partition</artifactId>
- <version>${pom.version}</version>
- <scope>test</scope>
- </dependency>
-
- <dependency>
<groupId>org.apache.directory.shared</groupId>
<version>${org.apache.directory.shared.version}</version>
<artifactId>shared-cursor</artifactId>
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultCoreSession.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultCoreSession.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultCoreSession.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultCoreSession.java Wed Jan 6 18:26:43 2010
@@ -29,8 +29,7 @@
import javax.naming.ldap.Control;
import org.apache.directory.server.constants.ServerDNConstants;
-import org.apache.directory.server.core.DefaultDirectoryService.LogChange;
-import org.apache.directory.server.core.authn.LdapPrincipal;
+import org.apache.directory.server.core.changelog.LogChange;
import org.apache.directory.server.core.entry.ClonedServerEntry;
import org.apache.directory.server.core.entry.ServerBinaryValue;
import org.apache.directory.server.core.entry.ServerEntry;
@@ -57,8 +56,8 @@
import org.apache.directory.shared.ldap.filter.ExprNode;
import org.apache.directory.shared.ldap.filter.FilterParser;
import org.apache.directory.shared.ldap.filter.SearchScope;
-import org.apache.directory.shared.ldap.message.InternalAddRequest;
import org.apache.directory.shared.ldap.message.AliasDerefMode;
+import org.apache.directory.shared.ldap.message.InternalAddRequest;
import org.apache.directory.shared.ldap.message.InternalCompareRequest;
import org.apache.directory.shared.ldap.message.InternalDeleteRequest;
import org.apache.directory.shared.ldap.message.InternalModifyDnRequest;
@@ -189,7 +188,7 @@
{
Value<?> val = null;
- AttributeType attributeType = directoryService.getRegistries().getAttributeTypeRegistry().lookup( oid );
+ AttributeType attributeType = directoryService.getSchemaManager().lookupAttributeTypeRegistry( oid );
// make sure we add the request controls to operation
if ( attributeType.getSyntax().isHumanReadable() )
@@ -508,7 +507,7 @@
for ( Modification mod:mods )
{
- serverModifications.add( new ServerModification( directoryService.getRegistries(), mod ) );
+ serverModifications.add( new ServerModification( directoryService.getSchemaManager(), mod ) );
}
ModifyOperationContext opContext = new ModifyOperationContext( this, dn, serverModifications );
@@ -543,7 +542,7 @@
for ( Modification mod:mods )
{
- serverModifications.add( new ServerModification( directoryService.getRegistries(), mod ) );
+ serverModifications.add( new ServerModification( directoryService.getSchemaManager(), mod ) );
}
ModifyOperationContext opContext = new ModifyOperationContext( this, dn, serverModifications );
@@ -670,6 +669,7 @@
opContext.setLogChange( log );
OperationManager operationManager = directoryService.getOperationManager();
+
operationManager.rename( opContext );
}
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java Wed Jan 6 18:26:43 2010
@@ -20,9 +20,22 @@
package org.apache.directory.server.core;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.naming.NamingException;
+
import org.apache.directory.server.constants.ServerDNConstants;
import org.apache.directory.server.core.authn.AuthenticationInterceptor;
-import org.apache.directory.server.core.authn.LdapPrincipal;
import org.apache.directory.server.core.authz.AciAuthorizationInterceptor;
import org.apache.directory.server.core.authz.DefaultAuthorizationInterceptor;
import org.apache.directory.server.core.changelog.ChangeLog;
@@ -53,33 +66,14 @@
import org.apache.directory.server.core.partition.DefaultPartitionNexus;
import org.apache.directory.server.core.partition.Partition;
import org.apache.directory.server.core.partition.PartitionNexus;
-import org.apache.directory.server.core.partition.impl.btree.BTreePartition;
-import org.apache.directory.server.xdbm.Index;
-import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmIndex;
-import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmPartition;
import org.apache.directory.server.core.referral.ReferralInterceptor;
import org.apache.directory.server.core.replication.ReplicationConfiguration;
-import org.apache.directory.server.core.schema.PartitionSchemaLoader;
+import org.apache.directory.server.core.schema.DefaultSchemaService;
import org.apache.directory.server.core.schema.SchemaInterceptor;
-import org.apache.directory.server.core.schema.SchemaOperationControl;
-import org.apache.directory.server.core.schema.SchemaPartitionDao;
import org.apache.directory.server.core.schema.SchemaService;
import org.apache.directory.server.core.security.TlsKeyGenerator;
import org.apache.directory.server.core.subtree.SubentryInterceptor;
import org.apache.directory.server.core.trigger.TriggerInterceptor;
-import org.apache.directory.server.schema.SerializableComparator;
-import org.apache.directory.server.schema.bootstrap.ApacheSchema;
-import org.apache.directory.server.schema.bootstrap.ApachemetaSchema;
-import org.apache.directory.server.schema.bootstrap.BootstrapSchemaLoader;
-import org.apache.directory.server.schema.bootstrap.CoreSchema;
-import org.apache.directory.server.schema.bootstrap.Schema;
-import org.apache.directory.server.schema.bootstrap.SystemSchema;
-import org.apache.directory.server.schema.bootstrap.partition.DbFileListing;
-import org.apache.directory.server.schema.bootstrap.partition.SchemaPartitionExtractor;
-import org.apache.directory.server.schema.registries.DefaultOidRegistry;
-import org.apache.directory.server.schema.registries.DefaultRegistries;
-import org.apache.directory.server.schema.registries.OidRegistry;
-import org.apache.directory.server.schema.registries.Registries;
import org.apache.directory.shared.ldap.NotImplementedException;
import org.apache.directory.shared.ldap.constants.AuthenticationLevel;
import org.apache.directory.shared.ldap.constants.SchemaConstants;
@@ -90,15 +84,13 @@
import org.apache.directory.shared.ldap.entry.EntryAttribute;
import org.apache.directory.shared.ldap.entry.Modification;
import org.apache.directory.shared.ldap.entry.client.DefaultClientEntry;
-import org.apache.directory.shared.ldap.exception.LdapNamingException;
import org.apache.directory.shared.ldap.exception.LdapNoPermissionException;
import org.apache.directory.shared.ldap.ldif.ChangeType;
import org.apache.directory.shared.ldap.ldif.LdifEntry;
import org.apache.directory.shared.ldap.ldif.LdifReader;
-import org.apache.directory.shared.ldap.message.ResultCodeEnum;
import org.apache.directory.shared.ldap.name.LdapDN;
import org.apache.directory.shared.ldap.name.Rdn;
-import org.apache.directory.shared.ldap.schema.AttributeType;
+import org.apache.directory.shared.ldap.schema.SchemaManager;
import org.apache.directory.shared.ldap.schema.SchemaUtils;
import org.apache.directory.shared.ldap.schema.normalizers.OidNormalizer;
import org.apache.directory.shared.ldap.util.AttributeUtils;
@@ -107,20 +99,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.naming.NamingException;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-
/**
* Default implementation of {@link DirectoryService}.
@@ -132,15 +110,11 @@
{
/** The logger */
private static final Logger LOG = LoggerFactory.getLogger( DefaultDirectoryService.class );
-
- private static final String ILLEGAL_STATE_MSG = "Something has got to be severely " +
- "wrong with the core packaging\nor the build to have " +
- "resulted in this exception.";
private SchemaService schemaService;
-
- /** the registries for system schema objects */
- private Registries registries;
+
+ /** A reference on the SchemaManager */
+ private SchemaManager schemaManager;
/** the root nexus */
private DefaultPartitionNexus partitionNexus;
@@ -195,13 +169,6 @@
"all taken into account";
- /** A structure telling the changeLog what to do with the incoming change */
- public enum LogChange
- {
- TRUE, // The change must me stored
- FALSE // The change must not be stred
- };
-
/** The delay to wait between each sync on disk */
private long syncPeriodMillis;
@@ -312,60 +279,27 @@
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
+
+
/**
* Creates a new instance of the directory service.
*/
- public DefaultDirectoryService()
+ public DefaultDirectoryService() throws Exception
{
setDefaultInterceptorConfigurations();
changeLog = new DefaultChangeLog();
journal = new DefaultJournal();
syncPeriodMillis = DEFAULT_SYNC_PERIOD;
-
- // --------------------------------------------------------------------
- // Load the bootstrap schemas to start up the schema partition
- // --------------------------------------------------------------------
-
- // setup temporary loader and temp registry
- BootstrapSchemaLoader loader = new BootstrapSchemaLoader();
- OidRegistry oidRegistry = new DefaultOidRegistry();
- registries = new DefaultRegistries( "bootstrap", loader, oidRegistry );
-
- // load essential bootstrap schemas
- Set<Schema> bootstrapSchemas = new HashSet<Schema>();
- bootstrapSchemas.add( new ApachemetaSchema() );
- bootstrapSchemas.add( new ApacheSchema() );
- bootstrapSchemas.add( new CoreSchema() );
- bootstrapSchemas.add( new SystemSchema() );
-
- try
- {
- loader.loadWithDependencies( bootstrapSchemas, registries );
- }
- catch ( Exception e )
- {
- throw new IllegalStateException( ILLEGAL_STATE_MSG, e );
- }
-
- // run referential integrity tests
- List<Throwable> errors = registries.checkRefInteg();
-
- if ( !errors.isEmpty() )
- {
- NamingException e = new NamingException();
- e.setRootCause( errors.get( 0 ) );
- throw new IllegalStateException( ILLEGAL_STATE_MSG, e );
- }
-
- SerializableComparator.setRegistry( registries.getComparatorRegistry() );
-
csnFactory = new CsnFactory( replicaId );
+ schemaService = new DefaultSchemaService();
}
// ------------------------------------------------------------------------
// C O N F I G U R A T I O N M E T H O D S
// ------------------------------------------------------------------------
+
+
public void setInstanceId( String instanceId )
{
this.instanceId = instanceId;
@@ -401,13 +335,16 @@
Set<Partition> cloned = new HashSet<Partition>();
cloned.addAll( partitions );
Set<String> names = new HashSet<String>();
+
for ( Partition partition : cloned )
{
String id = partition.getId();
+
if ( names.contains( id ) )
{
LOG.warn( "Encountered duplicate partition {} identifier.", id );
}
+
names.add( id );
}
@@ -645,9 +582,10 @@
}
- public void addPartition( Partition parition ) throws Exception
+ public void addPartition( Partition partition ) throws Exception
{
- partitions.add( parition );
+ partition.setSchemaManager( schemaManager );
+ partitions.add( partition );
if ( ! started )
{
@@ -655,7 +593,7 @@
}
AddContextPartitionOperationContext addPartitionCtx =
- new AddContextPartitionOperationContext( adminSession, parition );
+ new AddContextPartitionOperationContext( adminSession, partition );
partitionNexus.addContextPartition( addPartitionCtx );
}
@@ -882,7 +820,7 @@
{
case ChangeType.ADD_ORDINAL :
adminSession.add(
- new DefaultServerEntry( registries, reverse.getEntry() ), true );
+ new DefaultServerEntry( schemaManager, reverse.getEntry() ), true );
break;
case ChangeType.DELETE_ORDINAL :
@@ -1024,6 +962,7 @@
// --------------------------------------------------------------------
// Shutdown the partition
// --------------------------------------------------------------------
+
partitionNexus.sync();
partitionNexus.destroy();
@@ -1075,17 +1014,22 @@
/**
- * @return the registries
+ * @return the SchemaManager
*/
- public Registries getRegistries()
+ public SchemaManager getSchemaManager()
{
- return registries;
+ return schemaManager;
}
-
-
- public void setRegistries( Registries registries )
+
+
+ /**
+ * Set the SchemaManager instance.
+ *
+ * @param schemaManager The schemaManager
+ */
+ public void setSchemaManager( SchemaManager schemaManager )
{
- this.registries = registries;
+ this.schemaManager = schemaManager;
}
@@ -1101,7 +1045,7 @@
}
- public PartitionNexus getPartitionNexus()
+ public DefaultPartitionNexus getPartitionNexus()
{
return partitionNexus;
}
@@ -1127,7 +1071,7 @@
public ServerEntry newEntry( LdapDN dn )
{
- return new DefaultServerEntry( registries, dn );
+ return new DefaultServerEntry( schemaManager, dn );
}
@@ -1150,11 +1094,11 @@
/*
* If the admin entry is there, then the database was already created
*/
- if ( !partitionNexus.hasEntry( new EntryOperationContext( adminSession, PartitionNexus.getAdminName() ) ) )
+ if ( !partitionNexus.hasEntry( new EntryOperationContext( adminSession, adminDn ) ) )
{
firstStart = true;
- ServerEntry serverEntry = new DefaultServerEntry( registries, PartitionNexus.getAdminName() );
+ ServerEntry serverEntry = new DefaultServerEntry( schemaManager, adminDn );
serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
SchemaConstants.TOP_OC,
@@ -1181,7 +1125,7 @@
// create system users area
// -------------------------------------------------------------------
- Map<String,OidNormalizer> oidsMap = registries.getAttributeTypeRegistry().getNormalizerMapping();
+ Map<String,OidNormalizer> oidsMap = schemaManager.getNormalizerMapping();
LdapDN userDn = new LdapDN( ServerDNConstants.USERS_SYSTEM_DN );
userDn.normalize( oidsMap );
@@ -1189,7 +1133,7 @@
{
firstStart = true;
- ServerEntry serverEntry = new DefaultServerEntry( registries, userDn );
+ ServerEntry serverEntry = new DefaultServerEntry( schemaManager, userDn );
serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
SchemaConstants.TOP_OC,
@@ -1215,7 +1159,7 @@
{
firstStart = true;
- ServerEntry serverEntry = new DefaultServerEntry( registries, groupDn );
+ ServerEntry serverEntry = new DefaultServerEntry( schemaManager, groupDn );
serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
SchemaConstants.TOP_OC,
@@ -1241,7 +1185,7 @@
{
firstStart = true;
- ServerEntry serverEntry = new DefaultServerEntry( registries, name );
+ ServerEntry serverEntry = new DefaultServerEntry( schemaManager, name );
serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
SchemaConstants.TOP_OC,
@@ -1291,7 +1235,7 @@
{
firstStart = true;
- ServerEntry serverEntry = new DefaultServerEntry( registries, configurationDn );
+ ServerEntry serverEntry = new DefaultServerEntry( schemaManager, configurationDn );
serverEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, SchemaConstants.ORGANIZATIONAL_UNIT_OC );
serverEntry.put( SchemaConstants.OU_AT, "configuration" );
@@ -1314,7 +1258,7 @@
{
firstStart = true;
- ServerEntry serverEntry = new DefaultServerEntry( registries, partitionsDn );
+ ServerEntry serverEntry = new DefaultServerEntry( schemaManager, partitionsDn );
serverEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, SchemaConstants.ORGANIZATIONAL_UNIT_OC );
serverEntry.put( SchemaConstants.OU_AT, "partitions" );
serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
@@ -1336,7 +1280,7 @@
{
firstStart = true;
- ServerEntry serverEntry = new DefaultServerEntry( registries, servicesDn );
+ ServerEntry serverEntry = new DefaultServerEntry( schemaManager, servicesDn );
serverEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, SchemaConstants.ORGANIZATIONAL_UNIT_OC );
serverEntry.put( SchemaConstants.OU_AT, "services" );
@@ -1359,7 +1303,7 @@
{
firstStart = true;
- ServerEntry serverEntry = new DefaultServerEntry( registries, interceptorsDn );
+ ServerEntry serverEntry = new DefaultServerEntry( schemaManager, interceptorsDn );
serverEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, SchemaConstants.ORGANIZATIONAL_UNIT_OC );
serverEntry.put( SchemaConstants.OU_AT, "interceptors" );
@@ -1382,7 +1326,7 @@
{
firstStart = true;
- ServerEntry serverEntry = new DefaultServerEntry( registries, sysPrefRootDn );
+ ServerEntry serverEntry = new DefaultServerEntry( schemaManager, sysPrefRootDn );
serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
SchemaConstants.TOP_OC,
SchemaConstants.ORGANIZATIONAL_UNIT_OC,
@@ -1411,7 +1355,7 @@
boolean needToChangeAdminPassword = false;
LdapDN adminDn = new LdapDN( ServerDNConstants.ADMIN_SYSTEM_DN );
- adminDn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() );
+ adminDn.normalize( schemaManager.getNormalizerMapping() );
ServerEntry adminEntry = partitionNexus.lookup( new LookupOperationContext( adminSession, adminDn ) );
Object userPassword = adminEntry.get( SchemaConstants.USER_PASSWORD_AT ).get();
@@ -1448,12 +1392,11 @@
{
LdifEntry ldifEntry = testEntry.clone();
Entry entry = ldifEntry.getEntry();
- String dn = ldifEntry.getDn().getUpName();
+ String dn = ldifEntry.getDn().getName();
try
{
- getAdminSession().add(
- new DefaultServerEntry( registries, entry ) );
+ getAdminSession().add( new DefaultServerEntry( schemaManager, entry ) );
}
catch ( Exception e )
{
@@ -1480,137 +1423,26 @@
LOG.debug( "---> Initializing the DefaultDirectoryService " );
}
- // --------------------------------------------------------------------
- // If not present extract schema partition from jar
- // --------------------------------------------------------------------
-
- File schemaDirectory = new File( workingDirectory, "schema" );
- SchemaPartitionExtractor extractor;
-
- if ( ! schemaDirectory.exists() )
- {
- try
- {
- extractor = new SchemaPartitionExtractor( workingDirectory );
- extractor.extract();
- }
- catch ( IOException e )
- {
- NamingException ne = new NamingException( "Failed to extract pre-loaded schema partition." );
- ne.setRootCause( e );
- throw ne;
- }
- }
-
- // --------------------------------------------------------------------
- // Initialize schema partition
- // --------------------------------------------------------------------
-
- JdbmPartition schemaPartition = new JdbmPartition();
- schemaPartition.setId( "schema" );
- schemaPartition.setCacheSize( 1000 );
-
- DbFileListing listing;
-
- try
- {
- listing = new DbFileListing();
- }
- catch( IOException e )
- {
- throw new LdapNamingException( "Got IOException while trying to read DBFileListing: " + e.getMessage(),
- ResultCodeEnum.OTHER );
- }
-
- Set<Index<?,ServerEntry>> indexedAttributes = new HashSet<Index<?,ServerEntry>>();
-
- for ( String attributeId : listing.getIndexedAttributes() )
- {
- indexedAttributes.add( new JdbmIndex<Object,ServerEntry>( attributeId ) );
- }
-
- schemaPartition.setIndexedAttributes( indexedAttributes );
- schemaPartition.setSuffix( ServerDNConstants.OU_SCHEMA_DN );
- schemaPartition.init( this );
+ // triggers partition to load schema fully from schema partition
+ schemaService.initialize();
+ schemaService.getSchemaPartition().initialize();
+ partitions.add( schemaService.getSchemaPartition() );
+ systemPartition.getSuffixDn().normalize( schemaManager.getNormalizerMapping() );
- // --------------------------------------------------------------------
- // Enable schemas of all indices of partition configurations
- // --------------------------------------------------------------------
-
- /*
- * We need to make sure that every attribute indexed by a partition is
- * loaded into the registries on the next step. So here we must enable
- * the schemas of those attributes so they are loaded into the global
- * registries.
- */
-
- SchemaPartitionDao dao = new SchemaPartitionDao( schemaPartition, registries );
- Map<String,Schema> schemaMap = dao.getSchemas();
- Set<Partition> partitions = new HashSet<Partition>();
- partitions.add( systemPartition );
- partitions.addAll( this.partitions );
-
- for ( Partition partition : partitions )
- {
- if ( partition instanceof BTreePartition )
- {
- JdbmPartition btpconf = ( JdbmPartition ) partition;
- for ( Index<?,ServerEntry> index : btpconf.getIndexedAttributes() )
- {
- String schemaName = null;
-
- try
- {
- // Try to retrieve the AT in the registries
- AttributeType at = registries.getAttributeTypeRegistry().lookup( index.getAttributeId() );
- schemaName = dao.findSchema( at.getOid() );
- }
- catch ( Exception e )
- {
- // It does not exists: just use the attribute ID
- schemaName = dao.findSchema( index.getAttributeId() );
- }
-
- if ( schemaName == null )
- {
- throw new NamingException( "Index on unidentified attribute: " + index.toString() );
- }
-
- Schema schema = schemaMap.get( schemaName );
- if ( schema.isDisabled() )
- {
- dao.enableSchema( schemaName );
- }
- }
- }
- }
-
- // --------------------------------------------------------------------
- // Initialize schema subsystem and reset registries
- // --------------------------------------------------------------------
-
- PartitionSchemaLoader schemaLoader = new PartitionSchemaLoader( schemaPartition, registries );
- Registries globalRegistries = new DefaultRegistries( "global", schemaLoader, registries.getOidRegistry() );
- schemaLoader.loadEnabled( globalRegistries );
- registries = globalRegistries;
- SerializableComparator.setRegistry( globalRegistries.getComparatorRegistry() );
-
- SchemaOperationControl schemaControl = new SchemaOperationControl( registries, schemaLoader,
- new SchemaPartitionDao( schemaPartition, registries ) );
-
- schemaService = new SchemaService( this, schemaPartition, schemaControl );
-
- adminDn = new LdapDN( ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
- adminDn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() );
+ adminDn = new LdapDN( ServerDNConstants.ADMIN_SYSTEM_DN ).normalize( schemaManager.getNormalizerMapping() );
+ adminDn.normalize( schemaManager.getNormalizerMapping() );
adminSession = new DefaultCoreSession( new LdapPrincipal( adminDn, AuthenticationLevel.STRONG ), this );
-
- partitionNexus = new DefaultPartitionNexus( new DefaultServerEntry( registries, LdapDN.EMPTY_LDAPDN ) );
- partitionNexus.init( this );
- partitionNexus.addContextPartition( new AddContextPartitionOperationContext( adminSession, schemaPartition ) );
+
+ // @TODO - NOTE: Need to find a way to instantiate without dependency on DPN
+ partitionNexus = new DefaultPartitionNexus( new DefaultServerEntry( schemaManager, LdapDN.EMPTY_LDAPDN ) );
+ partitionNexus.setDirectoryService( this );
+ partitionNexus.initialize( );
+ //partitionNexus.addContextPartition( new AddContextPartitionOperationContext( adminSession, schemaService.getSchemaPartition() ) );
// --------------------------------------------------------------------
// Create all the bootstrap entries before initializing chain
// --------------------------------------------------------------------
+
firstStart = createBootstrapEntries();
interceptorChain = new InterceptorChain();
@@ -1619,13 +1451,14 @@
// --------------------------------------------------------------------
// Initialize the changeLog if it's enabled
// --------------------------------------------------------------------
+
if ( changeLog.isEnabled() )
{
changeLog.init( this );
if( changeLog.isExposed() && changeLog.isTagSearchSupported() )
{
- String clSuffix = ( ( TaggableSearchableChangeLogStore ) changeLog.getChangeLogStore() ).getPartition().getSuffix();
+ String clSuffix = ( ( TaggableSearchableChangeLogStore ) changeLog.getChangeLogStore() ).getPartition().getSuffixDn().getName();
partitionNexus.getRootDSE( null ).getOriginalEntry().add( SchemaConstants.CHANGELOG_CONTEXT_AT, clSuffix );
}
}
@@ -1729,7 +1562,7 @@
entry.setDn( ldapDn );
// TODO Let's get rid of this Attributes crap
- ServerEntry serverEntry = new DefaultServerEntry( registries, entry );
+ ServerEntry serverEntry = new DefaultServerEntry( schemaManager, entry );
return serverEntry;
}
catch ( Exception e )
@@ -1765,7 +1598,7 @@
/**
* {@inheritDoc}
*/
- public void setPassordHidden( boolean passwordHidden )
+ public void setPasswordHidden( boolean passwordHidden )
{
this.passwordHidden = passwordHidden;
}
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultOperationManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultOperationManager.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultOperationManager.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/DefaultOperationManager.java Wed Jan 6 18:26:43 2010
@@ -222,7 +222,7 @@
{
// Normalize the opContext DN
LdapDN dn = opContext.getDn();
- dn.normalize( directoryService.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+ dn.normalize( directoryService.getSchemaManager().getNormalizerMapping() );
// We have to deal with the referral first
directoryService.getReferralManager().lockRead();
@@ -307,7 +307,7 @@
{
// Normalize the opContext DN
LdapDN dn = opContext.getDn();
- dn.normalize( directoryService.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+ dn.normalize( directoryService.getSchemaManager().getNormalizerMapping() );
// We have to deal with the referral first
directoryService.getReferralManager().lockRead();
@@ -387,7 +387,7 @@
{
// Normalize the opContext DN
LdapDN dn = opContext.getDn();
- dn.normalize( directoryService.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+ dn.normalize( directoryService.getSchemaManager().getNormalizerMapping() );
// We have to deal with the referral first
directoryService.getReferralManager().lockRead();
@@ -632,7 +632,7 @@
{
// Normalize the opContext DN
LdapDN dn = opContext.getDn();
- dn.normalize( directoryService.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+ dn.normalize( directoryService.getSchemaManager().getNormalizerMapping() );
// We have to deal with the referral first
directoryService.getReferralManager().lockRead();
@@ -715,7 +715,7 @@
{
// Normalize the opContext DN
LdapDN dn = opContext.getDn();
- dn.normalize( directoryService.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+ dn.normalize( directoryService.getSchemaManager().getNormalizerMapping() );
// We have to deal with the referral first
directoryService.getReferralManager().lockRead();
@@ -769,7 +769,7 @@
// Now, check the destination
// Normalize the opContext DN
LdapDN parentDn = opContext.getParent();
- parentDn.normalize( directoryService.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+ parentDn.normalize( directoryService.getSchemaManager().getNormalizerMapping() );
// If he parent DN is a referral, or has a referral ancestor, we have to issue a AffectMultipleDsas result
// as stated by RFC 3296 Section 5.6.2
@@ -817,7 +817,7 @@
{
// Normalize the opContext DN
LdapDN dn = opContext.getDn();
- dn.normalize( directoryService.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+ dn.normalize( directoryService.getSchemaManager().getNormalizerMapping() );
// We have to deal with the referral first
directoryService.getReferralManager().lockRead();
@@ -871,7 +871,7 @@
// Now, check the destination
// Normalize the opContext DN
LdapDN parentDn = opContext.getParent();
- parentDn.normalize( directoryService.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+ parentDn.normalize( directoryService.getSchemaManager().getNormalizerMapping() );
// If he parent DN is a referral, or has a referral ancestor, we have to issue a AffectMultipleDsas result
// as stated by RFC 3296 Section 5.6.2
@@ -921,8 +921,18 @@
{
// Normalize the opContext DN
LdapDN dn = opContext.getDn();
- dn.normalize( directoryService.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+ dn.normalize( directoryService.getSchemaManager().getNormalizerMapping() );
+ // Inject the newDn into the operation context
+ // Inject the new DN into the context
+ if ( !dn.isEmpty() )
+ {
+ LdapDN newDn = (LdapDN)dn.clone();
+ newDn.remove( dn.size() - 1 );
+ newDn.add( opContext.getNewRdn() );
+ opContext.setNewDn( newDn );
+ }
+
// We have to deal with the referral first
directoryService.getReferralManager().lockRead();
@@ -1003,7 +1013,7 @@
{
// Normalize the opContext DN
LdapDN dn = opContext.getDn();
- dn.normalize( directoryService.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+ dn.normalize( directoryService.getSchemaManager().getNormalizerMapping() );
// We have to deal with the referral first
directoryService.getReferralManager().lockRead();
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/ReferralManagerImpl.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/ReferralManagerImpl.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/ReferralManagerImpl.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/ReferralManagerImpl.java Wed Jan 6 18:26:43 2010
@@ -19,6 +19,7 @@
*/
package org.apache.directory.server.core;
+
import java.util.Set;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -29,13 +30,14 @@
import org.apache.directory.server.core.filtering.EntryFilteringCursor;
import org.apache.directory.server.core.interceptor.context.SearchOperationContext;
import org.apache.directory.server.core.partition.PartitionNexus;
-import org.apache.directory.shared.ldap.message.AliasDerefMode;
-import org.apache.directory.shared.ldap.name.LdapDN;
-import org.apache.directory.shared.ldap.util.tree.DnBranchNode;
import org.apache.directory.shared.ldap.constants.SchemaConstants;
import org.apache.directory.shared.ldap.entry.client.ClientStringValue;
import org.apache.directory.shared.ldap.filter.EqualityNode;
import org.apache.directory.shared.ldap.filter.ExprNode;
+import org.apache.directory.shared.ldap.message.AliasDerefMode;
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.util.tree.DnBranchNode;
+
/**
* Implement a referral Manager, handling the requests from the LDAP protocol.
@@ -153,6 +155,7 @@
{
// We will store each entry's DN into the Referral tree
LdapDN suffixDn = new LdapDN( suffix );
+ suffixDn.normalize( directoryService.getSchemaManager().getNormalizerMapping() );
EntryFilteringCursor cursor = nexus.search( new SearchOperationContext( adminSession, suffixDn, AliasDerefMode.DEREF_ALWAYS,
referralFilter, searchControl ) );
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/AnonymousAuthenticator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/AnonymousAuthenticator.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/AnonymousAuthenticator.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/AnonymousAuthenticator.java Wed Jan 6 18:26:43 2010
@@ -22,6 +22,7 @@
import javax.naming.NamingException;
+import org.apache.directory.server.core.LdapPrincipal;
import org.apache.directory.server.core.interceptor.context.BindOperationContext;
import org.apache.directory.shared.ldap.constants.AuthenticationLevel;
import org.apache.directory.shared.ldap.exception.LdapNoPermissionException;
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/AuthenticationInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/AuthenticationInterceptor.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/AuthenticationInterceptor.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/AuthenticationInterceptor.java Wed Jan 6 18:26:43 2010
@@ -30,6 +30,7 @@
import org.apache.directory.server.core.CoreSession;
import org.apache.directory.server.core.DefaultCoreSession;
import org.apache.directory.server.core.DirectoryService;
+import org.apache.directory.server.core.LdapPrincipal;
import org.apache.directory.server.core.entry.ClonedServerEntry;
import org.apache.directory.server.core.filtering.EntryFilteringCursor;
import org.apache.directory.server.core.interceptor.BaseInterceptor;
@@ -59,7 +60,6 @@
import org.apache.directory.shared.ldap.message.ResultCodeEnum;
import org.apache.directory.shared.ldap.name.LdapDN;
import org.apache.directory.shared.ldap.util.StringTools;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -443,7 +443,7 @@
// This is a case where the Bind request contains a DN, but no password.
// We don't check the DN, we just return a UnwillingToPerform error
// Cf RFC 4513, chap. 5.1.2
- throw new LdapOperationNotSupportedException( "Cannot Bind for DN " + opContext.getDn().getUpName(), ResultCodeEnum.UNWILLING_TO_PERFORM );
+ throw new LdapOperationNotSupportedException( "Cannot Bind for DN " + opContext.getDn().getName(), ResultCodeEnum.UNWILLING_TO_PERFORM );
}
Collection<Authenticator> authenticators = getAuthenticators( level.getName() );
@@ -513,7 +513,7 @@
}
LdapDN dn = opContext.getDn();
- String upDn = ( dn == null ? "" : dn.getUpName() );
+ String upDn = ( dn == null ? "" : dn.getName() );
throw new LdapAuthenticationException( "Cannot authenticate user " + upDn );
}
}
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/Authenticator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/Authenticator.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/Authenticator.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/Authenticator.java Wed Jan 6 18:26:43 2010
@@ -23,13 +23,14 @@
import javax.naming.Context;
import org.apache.directory.server.core.DirectoryService;
+import org.apache.directory.server.core.LdapPrincipal;
import org.apache.directory.server.core.interceptor.context.BindOperationContext;
-import org.apache.directory.server.core.partition.PartitionNexus;
+import org.apache.directory.server.core.partition.DefaultPartitionNexus;
import org.apache.directory.shared.ldap.name.LdapDN;
/**
- * Authenticates users who access {@link PartitionNexus}.
+ * Authenticates users who access {@link DefaultPartitionNexus}.
* <p>
* {@link Authenticator}s are registered to and configured by
* {@link AuthenticationInterceptor} interceptor.
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/SimpleAuthenticator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/SimpleAuthenticator.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/SimpleAuthenticator.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/SimpleAuthenticator.java Wed Jan 6 18:26:43 2010
@@ -34,6 +34,7 @@
import javax.naming.NamingException;
import org.apache.commons.collections.map.LRUMap;
+import org.apache.directory.server.core.LdapPrincipal;
import org.apache.directory.server.core.authz.AciAuthorizationInterceptor;
import org.apache.directory.server.core.authz.DefaultAuthorizationInterceptor;
import org.apache.directory.server.core.collective.CollectiveAttributeInterceptor;
@@ -58,7 +59,6 @@
import org.apache.directory.shared.ldap.util.Base64;
import org.apache.directory.shared.ldap.util.StringTools;
import org.apache.directory.shared.ldap.util.UnixCrypt;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -76,10 +76,10 @@
public class SimpleAuthenticator extends AbstractAuthenticator
{
private static final Logger LOG = LoggerFactory.getLogger( SimpleAuthenticator.class );
-
+
/** A speedup for logger in debug mode */
private static final boolean IS_DEBUG = LOG.isDebugEnabled();
-
+
/** The SHA1 hash length */
private static final int SHA1_LENGTH = 20;
@@ -101,19 +101,18 @@
*
* We need to be sure that frequently used passwords be always in cache, and not discarded.
* We will use a LRU cache for this purpose.
- */
+ */
private final LRUMap credentialCache;
-
+
/** Declare a default for this cache. 100 entries seems to be enough */
private static final int DEFAULT_CACHE_SIZE = 100;
-
+
/**
* Define the interceptors we should *not* go through when we will have to request the backend
* about a userPassword.
*/
private static final Collection<String> USERLOOKUP_BYPASS;
-
-
+
static
{
Set<String> c = new HashSet<String>();
@@ -142,7 +141,7 @@
credentialCache = new LRUMap( DEFAULT_CACHE_SIZE );
}
-
+
/**
* Creates a new instance, with an initial cache size
* @param cacheSize the size of the credential cache
@@ -154,7 +153,6 @@
credentialCache = new LRUMap( cacheSize > 0 ? cacheSize : DEFAULT_CACHE_SIZE );
}
-
/**
* A private class to store all informations about the existing
* password found in the cache or get from the backend.
@@ -177,15 +175,16 @@
{
private byte[] salt;
private LdapSecurityConstants algorithm;
-
+
+
private EncryptionMethod( LdapSecurityConstants algorithm, byte[] salt )
{
this.algorithm = algorithm;
this.salt = salt;
}
}
-
-
+
+
/**
* Get the password either from cache or from backend.
* @param principalDN The DN from which we want the password
@@ -195,21 +194,20 @@
private LdapPrincipal getStoredPassword( BindOperationContext opContext ) throws Exception
{
LdapPrincipal principal = null;
-
- synchronized( credentialCache )
+
+ synchronized ( credentialCache )
{
principal = ( LdapPrincipal ) credentialCache.get( opContext.getDn().getNormName() );
}
-
+
byte[] storedPassword;
-
+
if ( principal == null )
{
// Not found in the cache
// Get the user password from the backend
storedPassword = lookupUserPassword( opContext );
-
-
+
// Deal with the special case where the user didn't enter a password
// We will compare the empty array with the credentials. Sometime,
// a user does not set a password. This is bad, but there is nothing
@@ -221,47 +219,57 @@
// Create the new principal before storing it in the cache
principal = new LdapPrincipal( opContext.getDn(), AuthenticationLevel.SIMPLE, storedPassword );
-
+
// Now, update the local cache.
- synchronized( credentialCache )
+ synchronized ( credentialCache )
{
credentialCache.put( opContext.getDn().getNormName(), principal );
}
}
-
+
return principal;
}
/**
+ * <p>
* Looks up <tt>userPassword</tt> attribute of the entry whose name is the
* value of {@link Context#SECURITY_PRINCIPAL} environment variable, and
* authenticates a user with the plain-text password.
- *
+ * </p>
* We have at least 6 algorithms to encrypt the password :
- * - SHA
- * - SSHA (salted SHA)
- * - MD5
- * - SMD5 (slated MD5)
- * - crypt (unix crypt)
- * - plain text, ie no encryption.
- *
+ * <ul>
+ * <li>- SHA</li>
+ * <li>- SSHA (salted SHA)</li>
+ * <li>- MD5</li>
+ * <li>- SMD5 (slated MD5)</li>
+ * <li>- crypt (unix crypt)</li>
+ * <li>- plain text, ie no encryption.</li>
+ * </ul>
+ * <p>
* If we get an encrypted password, it is prefixed by the used algorithm, between
* brackets : {SSHA}password ...
- *
+ * </p>
* If the password is using SSHA, SMD5 or crypt, some 'salt' is added to the password :
- * - length(password) - 20, starting at 21th position for SSHA
- * - length(password) - 16, starting at 16th position for SMD5
- * - length(password) - 2, starting at 3rd position for crypt
- *
+ * <ul>
+ * <li>- length(password) - 20, starting at 21th position for SSHA</li>
+ * <li>- length(password) - 16, starting at 16th position for SMD5</li>
+ * <li>- length(password) - 2, starting at 3rd position for crypt</li>
+ * </ul>
+ * <p>
* For (S)SHA and (S)MD5, we have to transform the password from Base64 encoded text
* to a byte[] before comparing the password with the stored one.
+ * </p>
+ * <p>
* For crypt, we only have to remove the salt.
- *
+ * </p>
+ * <p>
* At the end, we use the digest() method for (S)SHA and (S)MD5, the crypt() method for
* the CRYPT algorithm and a straight comparison for PLAIN TEXT passwords.
- *
+ * </p>
+ * <p>
* The stored password is always using the unsalted form, and is stored as a bytes array.
+ * </p>
*/
public LdapPrincipal authenticate( BindOperationContext opContext ) throws Exception
{
@@ -269,15 +277,15 @@
{
LOG.debug( "Authenticating {}", opContext.getDn() );
}
-
+
// ---- extract password from JNDI environment
byte[] credentials = opContext.getCredentials();
-
+
LdapPrincipal principal = getStoredPassword( opContext );
-
+
// Get the stored password, either from cache or from backend
byte[] storedPassword = principal.getUserPassword();
-
+
// Short circuit for PLAIN TEXT passwords : we compare the byte array directly
// Are the passwords equal ?
if ( Arrays.equals( credentials, storedPassword ) )
@@ -286,28 +294,28 @@
{
LOG.debug( "{} Authenticated", opContext.getDn() );
}
-
+
return principal;
}
-
+
// Let's see if the stored password was encrypted
LdapSecurityConstants algorithm = findAlgorithm( storedPassword );
-
+
if ( algorithm != null )
{
EncryptionMethod encryptionMethod = new EncryptionMethod( algorithm, null );
-
+
// Let's get the encrypted part of the stored password
// We should just keep the password, excluding the algorithm
// and the salt, if any.
// But we should also get the algorithm and salt to
// be able to encrypt the submitted user password in the next step
byte[] encryptedStored = splitCredentials( storedPassword, encryptionMethod );
-
+
// Reuse the saltedPassword informations to construct the encrypted
// password given by the user.
byte[] userPassword = encryptPassword( credentials, encryptionMethod );
-
+
// Now, compare the two passwords.
if ( Arrays.equals( userPassword, encryptedStored ) )
{
@@ -321,28 +329,28 @@
else
{
// Bad password ...
- String message = "Password not correct for user '" + opContext.getDn().getUpName() + "'";
+ String message = "Password not correct for user '" + opContext.getDn().getName() + "'";
LOG.info( message );
- throw new LdapAuthenticationException(message);
+ throw new LdapAuthenticationException( message );
}
}
else
{
// Bad password ...
- String message = "Password not correct for user '" + opContext.getDn().getUpName() + "'";
+ String message = "Password not correct for user '" + opContext.getDn().getName() + "'";
LOG.info( message );
- throw new LdapAuthenticationException(message);
+ throw new LdapAuthenticationException( message );
}
}
-
-
+
+
private static void split( byte[] all, int offset, byte[] left, byte[] right )
{
System.arraycopy( all, offset, left, 0, left.length );
System.arraycopy( all, offset + left.length, right, 0, right.length );
}
-
+
/**
* Decompose the stored password in an algorithm, an eventual salt
* and the password itself.
@@ -357,38 +365,40 @@
private byte[] splitCredentials( byte[] credentials, EncryptionMethod encryptionMethod )
{
int algoLength = encryptionMethod.algorithm.getName().length() + 2;
-
+
switch ( encryptionMethod.algorithm )
{
- case HASH_METHOD_MD5 :
- case HASH_METHOD_SHA :
+ case HASH_METHOD_MD5:
+ case HASH_METHOD_SHA:
try
{
// We just have the password just after the algorithm, base64 encoded.
// Just decode the password and return it.
- return Base64.decode( new String( credentials, algoLength, credentials.length - algoLength, "UTF-8" ).toCharArray() );
+ return Base64
+ .decode( new String( credentials, algoLength, credentials.length - algoLength, "UTF-8" )
+ .toCharArray() );
}
catch ( UnsupportedEncodingException uee )
{
// do nothing
return credentials;
}
-
- case HASH_METHOD_SMD5 :
+
+ case HASH_METHOD_SMD5:
try
{
// The password is associated with a salt. Decompose it
// in two parts, after having decoded the password.
// The salt will be stored into the EncryptionMethod structure
// The salt is at the end of the credentials, and is 8 bytes long
- byte[] passwordAndSalt = Base64.decode( new String( credentials, algoLength, credentials.length - algoLength, "UTF-8" ).
- toCharArray() );
-
+ byte[] passwordAndSalt = Base64.decode( new String( credentials, algoLength, credentials.length
+ - algoLength, "UTF-8" ).toCharArray() );
+
int saltLength = passwordAndSalt.length - MD5_LENGTH;
encryptionMethod.salt = new byte[saltLength];
byte[] password = new byte[MD5_LENGTH];
split( passwordAndSalt, 0, password, encryptionMethod.salt );
-
+
return password;
}
catch ( UnsupportedEncodingException uee )
@@ -396,22 +406,22 @@
// do nothing
return credentials;
}
-
- case HASH_METHOD_SSHA :
+
+ case HASH_METHOD_SSHA:
try
{
// The password is associated with a salt. Decompose it
// in two parts, after having decoded the password.
// The salt will be stored into the EncryptionMethod structure
// The salt is at the end of the credentials, and is 8 bytes long
- byte[] passwordAndSalt = Base64.decode( new String( credentials, algoLength, credentials.length - algoLength, "UTF-8" ).
- toCharArray() );
-
+ byte[] passwordAndSalt = Base64.decode( new String( credentials, algoLength, credentials.length
+ - algoLength, "UTF-8" ).toCharArray() );
+
int saltLength = passwordAndSalt.length - SHA1_LENGTH;
encryptionMethod.salt = new byte[saltLength];
byte[] password = new byte[SHA1_LENGTH];
split( passwordAndSalt, 0, password, encryptionMethod.salt );
-
+
return password;
}
catch ( UnsupportedEncodingException uee )
@@ -419,25 +429,25 @@
// do nothing
return credentials;
}
-
- case HASH_METHOD_CRYPT :
+
+ case HASH_METHOD_CRYPT:
// The password is associated with a salt. Decompose it
// in two parts, storing the salt into the EncryptionMethod structure.
// The salt comes first, not like for SSHA and SMD5, and is 2 bytes long
encryptionMethod.salt = new byte[2];
byte[] password = new byte[credentials.length - encryptionMethod.salt.length - algoLength];
split( credentials, algoLength, encryptionMethod.salt, password );
-
+
return password;
-
- default :
+
+ default:
// unknown method
return credentials;
-
+
}
}
-
-
+
+
/**
* Get the algorithm from the stored password.
* It can be found on the beginning of the stored password, between
@@ -452,22 +462,22 @@
{
return null;
}
-
+
if ( credentials[0] == '{' )
{
// get the algorithm
int pos = 1;
-
+
while ( pos < credentials.length )
{
if ( credentials[pos] == '}' )
{
break;
}
-
+
pos++;
}
-
+
if ( pos < credentials.length )
{
if ( pos == 1 )
@@ -475,9 +485,9 @@
// We don't have an algorithm : return the credentials as is
return null;
}
-
+
String algorithm = new String( credentials, 1, pos - 1 ).toLowerCase();
-
+
return LdapSecurityConstants.getAlgorithm( algorithm );
}
else
@@ -493,7 +503,7 @@
}
}
-
+
/**
* Compute the hashed password given an algorithm, the credentials and
* an optional salt.
@@ -528,45 +538,45 @@
}
}
-
+
private byte[] encryptPassword( byte[] credentials, EncryptionMethod encryptionMethod )
{
byte[] salt = encryptionMethod.salt;
-
+
switch ( encryptionMethod.algorithm )
{
- case HASH_METHOD_SHA :
- case HASH_METHOD_SSHA :
+ case HASH_METHOD_SHA:
+ case HASH_METHOD_SSHA:
return digest( LdapSecurityConstants.HASH_METHOD_SHA, credentials, salt );
- case HASH_METHOD_MD5 :
- case HASH_METHOD_SMD5 :
+ case HASH_METHOD_MD5:
+ case HASH_METHOD_SMD5:
return digest( LdapSecurityConstants.HASH_METHOD_MD5, credentials, salt );
- case HASH_METHOD_CRYPT :
+ case HASH_METHOD_CRYPT:
if ( salt == null )
{
salt = new byte[2];
SecureRandom sr = new SecureRandom();
int i1 = sr.nextInt( 64 );
int i2 = sr.nextInt( 64 );
-
+
salt[0] = ( byte ) ( i1 < 12 ? ( i1 + '.' ) : i1 < 38 ? ( i1 + 'A' - 12 ) : ( i1 + 'a' - 38 ) );
salt[1] = ( byte ) ( i2 < 12 ? ( i2 + '.' ) : i2 < 38 ? ( i2 + 'A' - 12 ) : ( i2 + 'a' - 38 ) );
}
- String saltWithCrypted = UnixCrypt.crypt( StringTools.utf8ToString( credentials ),
- StringTools.utf8ToString( salt ) );
+ String saltWithCrypted = UnixCrypt.crypt( StringTools.utf8ToString( credentials ), StringTools
+ .utf8ToString( salt ) );
String crypted = saltWithCrypted.substring( 2 );
-
+
return StringTools.getBytesUtf8( crypted );
-
- default :
+
+ default:
return credentials;
}
}
-
+
/**
* Local function which request the password from the backend
* @param principalDn the principal to lookup
@@ -587,18 +597,17 @@
* case where we cannot rely on the opContext to perform a new
* sub operation.
*/
- LookupOperationContext lookupContext =
- new LookupOperationContext( getDirectoryService().getAdminSession(), opContext.getDn() );
+ LookupOperationContext lookupContext = new LookupOperationContext( getDirectoryService().getAdminSession(),
+ opContext.getDn() );
lookupContext.setByPassed( USERLOOKUP_BYPASS );
userEntry = getDirectoryService().getOperationManager().lookup( lookupContext );
if ( userEntry == null )
{
- LdapDN dn = opContext.getDn();
- String upDn = ( dn == null ? "" : dn.getUpName() );
-
- throw new LdapAuthenticationException( "Failed to lookup user for authentication: "
- + upDn );
+ LdapDN dn = opContext.getDn();
+ String upDn = ( dn == null ? "" : dn.getName() );
+
+ throw new LdapAuthenticationException( "Failed to lookup user for authentication: " + upDn );
}
}
catch ( Exception cause )
@@ -626,7 +635,7 @@
}
}
-
+
/**
* Get the algorithm of a password, which is stored in the form "{XYZ}...".
* The method returns null, if the argument is not in this form. It returns
@@ -645,9 +654,7 @@
String sPassword = StringTools.utf8ToString( password );
int rightParen = sPassword.indexOf( '}' );
- if ( ( sPassword.length() > 2 ) &&
- ( sPassword.charAt( 0 ) == '{' ) &&
- ( rightParen > -1 ) )
+ if ( ( sPassword.length() > 2 ) && ( sPassword.charAt( 0 ) == '{' ) && ( rightParen > -1 ) )
{
String algorithm = sPassword.substring( 1, rightParen );
@@ -655,7 +662,7 @@
{
return algorithm;
}
-
+
try
{
MessageDigest.getInstance( algorithm );
@@ -705,7 +712,7 @@
else
{
MessageDigest digest = MessageDigest.getInstance( algorithm );
-
+
// calculate hashed value of password
byte[] fingerPrint = digest.digest( password );
char[] encoded = Base64.encode( fingerPrint );
@@ -721,14 +728,14 @@
}
}
-
+
/**
* Remove the principal form the cache. This is used when the user changes
* his password.
*/
public void invalidateCache( LdapDN bindDn )
{
- synchronized( credentialCache )
+ synchronized ( credentialCache )
{
credentialCache.remove( bindDn.getNormName() );
}
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/StrongAuthenticator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/StrongAuthenticator.java?rev=896599&r1=896598&r2=896599&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/StrongAuthenticator.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authn/StrongAuthenticator.java Wed Jan 6 18:26:43 2010
@@ -22,6 +22,7 @@
import javax.naming.NamingException;
+import org.apache.directory.server.core.LdapPrincipal;
import org.apache.directory.server.core.interceptor.context.BindOperationContext;
import org.apache.directory.shared.ldap.constants.AuthenticationLevel;