You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ka...@apache.org on 2010/02/28 14:00:21 UTC

svn commit: r917174 - in /directory/apacheds/trunk: server-integ/src/test/java/org/apache/directory/server/operations/modifydn/MoveIT.java xdbm-base/src/main/java/org/apache/directory/server/xdbm/AbstractXdbmPartition.java

Author: kayyagari
Date: Sun Feb 28 13:00:20 2010
New Revision: 917174

URL: http://svn.apache.org/viewvc?rev=917174&view=rev
Log:
fix for DIRSERVER-1401

Modified:
    directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/modifydn/MoveIT.java
    directory/apacheds/trunk/xdbm-base/src/main/java/org/apache/directory/server/xdbm/AbstractXdbmPartition.java

Modified: directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/modifydn/MoveIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/modifydn/MoveIT.java?rev=917174&r1=917173&r2=917174&view=diff
==============================================================================
--- directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/modifydn/MoveIT.java (original)
+++ directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/modifydn/MoveIT.java Sun Feb 28 13:00:20 2010
@@ -20,6 +20,7 @@
 package org.apache.directory.server.operations.modifydn;
 
 
+import static org.apache.directory.server.integ.ServerIntegrationUtils.getClientApiConnection;
 import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -30,11 +31,17 @@
 import javax.naming.directory.SearchResult;
 import javax.naming.ldap.LdapContext;
 
+import org.apache.directory.ldap.client.api.LdapConnection;
+import org.apache.directory.ldap.client.api.message.ModifyDnRequest;
+import org.apache.directory.ldap.client.api.message.ModifyDnResponse;
 import org.apache.directory.server.annotations.CreateLdapServer;
 import org.apache.directory.server.annotations.CreateTransport;
 import org.apache.directory.server.core.annotations.ApplyLdifs;
 import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
 import org.apache.directory.server.core.integ.FrameworkRunner;
+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.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -65,7 +72,19 @@
     "dn: ou=NewSuperior,ou=system",
     "objectClass: organizationalUnit",
     "objectClass: top",
-    "ou: NewSuperior"
+    "ou: NewSuperior",
+    
+    "dn: ou=parent,ou=system",
+    "changetype: add",
+    "objectClass: organizationalUnit",
+    "objectClass: top",
+    "ou: parent",
+    
+    "dn: ou=child,ou=parent,ou=system",
+    "changetype: add",
+    "objectClass: organizationalUnit",
+    "objectClass: top",
+    "ou: child"
     }
 )
 public class MoveIT extends AbstractLdapTestUnit 
@@ -118,9 +137,27 @@
         ctx.close();
     }
     
+    
     @Test
-    public void testDummy()
+    public void testIllegalMove() throws Exception
     {
-        
+
+    	LdapConnection con = getClientApiConnection( ldapServer );
+    
+    	//now do something bad: make the parent a child of its own child 
+    	ModifyDnResponse resp = con.move( "ou=parent,ou=system", "ou=child,ou=parent,ou=system" );
+    	assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, resp.getLdapResult().getResultCode() );
     }
+    
+    
+    @Test
+    public void testIllegalMoveToSameDN() throws Exception
+    {
+
+    	LdapConnection con = getClientApiConnection( ldapServer );
+    
+    	//now do something bad: try to move the entry to the same DN
+    	ModifyDnResponse resp = con.move( "ou=parent,ou=system", "ou=parent,ou=system" );
+        assertEquals( ResultCodeEnum.UNWILLING_TO_PERFORM, resp.getLdapResult().getResultCode() );
+    }    
 }

Modified: directory/apacheds/trunk/xdbm-base/src/main/java/org/apache/directory/server/xdbm/AbstractXdbmPartition.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/xdbm-base/src/main/java/org/apache/directory/server/xdbm/AbstractXdbmPartition.java?rev=917174&r1=917173&r2=917174&view=diff
==============================================================================
--- directory/apacheds/trunk/xdbm-base/src/main/java/org/apache/directory/server/xdbm/AbstractXdbmPartition.java (original)
+++ directory/apacheds/trunk/xdbm-base/src/main/java/org/apache/directory/server/xdbm/AbstractXdbmPartition.java Sun Feb 28 13:00:20 2010
@@ -35,6 +35,7 @@
 import org.apache.directory.server.core.partition.impl.btree.BTreePartition;
 import org.apache.directory.server.i18n.I18n;
 import org.apache.directory.shared.ldap.exception.LdapAuthenticationNotSupportedException;
+import org.apache.directory.shared.ldap.exception.LdapOperationNotSupportedException;
 import org.apache.directory.shared.ldap.message.ResultCodeEnum;
 import org.apache.directory.shared.ldap.name.LdapDN;
 
@@ -370,6 +371,7 @@
 
     public final void moveAndRename( MoveAndRenameOperationContext moveAndRenameContext ) throws Exception
     {
+        checkIsValidMove( moveAndRenameContext.getDn(), moveAndRenameContext.getParent() );
         store.move( moveAndRenameContext.getDn(), moveAndRenameContext.getParent(), moveAndRenameContext.getNewRdn(),
             moveAndRenameContext.getDelOldDn() );
     }
@@ -377,10 +379,52 @@
 
     public final void move( MoveOperationContext moveContext ) throws Exception
     {
+        checkIsValidMove( moveContext.getDn(), moveContext.getParent() );
         store.move( moveContext.getDn(), moveContext.getParent() );
     }
 
+    
+    /**
+     * 
+     * checks whether the moving of given entry is valid
+     *
+     * @param oldChildDn the entry's DN to be moved
+     * @param newParentDn new parent entry's DN
+     * @throws Exception
+     */
+    private void checkIsValidMove( LdapDN oldChildDn, LdapDN newParentDn ) throws Exception
+    {
+        Long newParentId = getEntryId( newParentDn.toString() );
+        Long childId = getEntryId( oldChildDn.toString() );
+        Long oldParentId = getParentId( childId );
+        
+        if( childId.longValue() == newParentId.longValue() )
+        {
+            throw new LdapOperationNotSupportedException( "child entry DN cannot be same as parent entry DN", ResultCodeEnum.UNWILLING_TO_PERFORM );
+        }
+
+        IndexCursor idxCursor = getSubLevelIndex().forwardCursor( childId );
+        boolean invalid = false;
+        while( idxCursor.next() )
+        {
+            ForwardIndexEntry<Long, Long> fwdIdxEntry = ( ForwardIndexEntry<Long, Long> ) idxCursor.get();
+            
+            if( fwdIdxEntry.getId().equals( newParentId ) )
+            {
+                invalid = true;
+                break;
+            }
+        }
+
+        idxCursor.close();
+        
+        if ( invalid )
+        {
+            throw new LdapOperationNotSupportedException( "cannot place an entry below itself", ResultCodeEnum.UNWILLING_TO_PERFORM );
+        }
+    }
 
+    
     public final void bind( LdapDN bindDn, byte[] credentials, List<String> mechanisms, String saslAuthId )
         throws Exception
     {