Index: servers/slapd/modrdn.c =================================================================== RCS file: /repo/OpenLDAP/pkg/ldap/servers/slapd/modrdn.c,v retrieving revision 1.177 diff -u -2 -r1.177 modrdn.c --- servers/slapd/modrdn.c 7 Jan 2008 23:20:08 -0000 1.177 +++ servers/slapd/modrdn.c 30 Jan 2008 10:19:51 -0000 @@ -215,7 +215,7 @@ fe_op_modrdn( Operation *op, SlapReply *rs ) { - Backend *newSuperior_be = NULL; - struct berval pdn = BER_BVNULL; + struct berval dest_ndn = BER_BVNULL, dest_pndn, pdn = BER_BVNULL; BackendDB *op_be, *bd = op->o_bd; + ber_slen_t diff; if( op->o_req_ndn.bv_len == 0 ) { @@ -235,4 +235,21 @@ } + if( op->orr_nnewSup ) { + dest_pndn = *op->orr_nnewSup; + } else { + dnParent( &op->o_req_ndn, &dest_pndn ); + } + build_new_dn( &dest_ndn, &dest_pndn, &op->orr_nnewrdn, op->o_tmpmemctx ); + + diff = (ber_slen_t) dest_ndn.bv_len - (ber_slen_t) op->o_req_ndn.bv_len; + if ( diff > 0 ? dnIsSuffix( &dest_ndn, &op->o_req_ndn ) + : diff < 0 && dnIsSuffix( &op->o_req_ndn, &dest_ndn ) ) + { + send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, + diff > 0 ? "cannot place an entry below itself" + : "cannot place an entry above itself" ); + goto cleanup; + } + /* * We could be serving multiple database backends. Select the @@ -276,17 +293,9 @@ } - /* Make sure that the entry being changed and the newSuperior are in - * the same backend, otherwise we return an error. - */ - if( op->orr_newSup ) { - newSuperior_be = select_backend( op->orr_nnewSup, 0 ); - - if ( newSuperior_be != op->o_bd ) { - /* newSuperior is in different backend */ + /* check that destination DN is in the same backend as source DN */ + if ( select_backend( &dest_ndn, 0 ) != op->o_bd ) { send_ldap_error( op, rs, LDAP_AFFECTS_MULTIPLE_DSAS, "cannot rename between DSAs" ); - goto cleanup; - } } @@ -368,4 +377,6 @@ cleanup:; + if ( dest_ndn.bv_val != NULL ) + ber_memfree_x( dest_ndn.bv_val, op->o_tmpmemctx ); op->o_bd = bd; return rs->sr_err; Index: tests/scripts/defines.sh =================================================================== RCS file: /repo/OpenLDAP/pkg/ldap/tests/scripts/defines.sh,v retrieving revision 1.161 diff -u -2 -r1.161 defines.sh --- tests/scripts/defines.sh 7 Jan 2008 23:20:16 -0000 1.161 +++ tests/scripts/defines.sh 30 Jan 2008 10:30:27 -0000 @@ -78,4 +78,5 @@ CONF=$DATADIR/slapd.conf CONFTWO=$DATADIR/slapd2.conf +CONF2DB=$DATADIR/slapd-2db.conf MCONF=$DATADIR/slapd-master.conf COMPCONF=$DATADIR/slapd-component.conf Index: tests/scripts/test005-modrdn =================================================================== RCS file: /repo/OpenLDAP/pkg/ldap/tests/scripts/test005-modrdn,v retrieving revision 1.53 diff -u -2 -r1.53 test005-modrdn --- tests/scripts/test005-modrdn 11 Jan 2008 02:17:37 -0000 1.53 +++ tests/scripts/test005-modrdn 30 Jan 2008 10:30:27 -0000 @@ -17,9 +17,9 @@ . $SRCDIR/scripts/defines.sh -mkdir -p $TESTDIR $DBDIR1 +mkdir -p $TESTDIR $DBDIR1A $DBDIR1B echo "Running slapadd to build slapd database..." -. $CONFFILTER $BACKEND $MONITORDB < $CONF > $CONF1 -$SLAPADD -f $CONF1 -l $LDIFORDERED +. $CONFFILTER $BACKEND $MONITORDB < $CONF2DB > $CONF1 +$SLAPADD -f $CONF1 -b "$BASEDN" -l $LDIFORDERED RC=$? if test $RC != 0 ; then @@ -222,7 +222,26 @@ fi -echo "Testing modrdn with newSuperior as child of target " +echo "Testing modrdn to another database (should fail with affectsMultipleDSAs)" $LDAPMODRDN -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD > \ - $TESTOUT 2>&1 -s 'cn=Sub1, ou=FooBar, cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example, dc=com' \ + $TESTOUT 2>&1 'cn=All Staff,ou=Groups,dc=example,dc=com' 'cn=Everyone' +RC=$? +case $RC in +0) + echo "ldapmodrdn succeeded, should have failed!" + test $KILLSERVERS != no && kill -HUP $KILLPIDS + exit -1 + ;; +71) + ;; +*) + echo "ldapmodrdn failed ($RC)!" + test $KILLSERVERS != no && kill -HUP $KILLPIDS + exit $RC + ;; +esac + +echo "Testing modrdn with newSuperior = target (should fail with unwillingToPerform)" +$LDAPMODRDN -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD > \ + $TESTOUT 2>&1 -s 'cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example, dc=com' \ 'cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example, dc=com' 'cn=James A Jones 1' @@ -234,6 +253,5 @@ exit -1 ;; -32) - echo "ldapmodrdn failed (noSuchObject)" +53) ;; *) --- /dev/null 2007-10-16 01:18:54 +0200 +++ tests/data/slapd-2db.conf 2008-01-23 01:54:50 +0100 @@ -0,0 +1,52 @@ +# stand-alone slapd config -- for testing (with indexing) +# $OpenLDAP$ +## This work is part of OpenLDAP Software . +## +## Copyright 1998-2008 The OpenLDAP Foundation. +## All rights reserved. +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted only as authorized by the OpenLDAP +## Public License. +## +## A copy of this license is available in the file LICENSE in the +## top-level directory of the distribution or, alternatively, at +## . + +include @SCHEMADIR@/core.schema +include @SCHEMADIR@/cosine.schema +include @SCHEMADIR@/inetorgperson.schema +include @SCHEMADIR@/openldap.schema +# +pidfile @TESTDIR@/slapd.1.pid +argsfile @TESTDIR@/slapd.1.args + +#mod#modulepath ../servers/slapd/back-@BACKEND@/ +#mod#moduleload back_@BACKEND@.la +#monitormod#modulepath ../servers/slapd/back-monitor/ +#monitormod#moduleload back_monitor.la + +####################################################################### +# database definitions +####################################################################### + +database @BACKEND@ +suffix "cn=Everyone,ou=Groups,dc=example,dc=com" +directory @TESTDIR@/db.1.a +subordinate +#bdb#index objectClass eq +#bdb#index cn,sn,uid pres,eq,sub +#hdb#index objectClass eq +#hdb#index cn,sn,uid pres,eq,sub + +database @BACKEND@ +suffix "dc=example,dc=com" +directory @TESTDIR@/db.1.b +rootdn "cn=Manager,dc=example,dc=com" +rootpw secret +#bdb#index objectClass eq +#bdb#index cn,sn,uid pres,eq,sub +#hdb#index objectClass eq +#hdb#index cn,sn,uid pres,eq,sub + +#monitor#database monitor