X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmodrdn.c;h=3b413d9cab7da154c1fdc3aac4bc57af036bc744;hb=0a5f1e8516d386784ed7f605e5d03c7ee6d7cedd;hp=cf4f9e2d3130afa5f4f42e83fbace462c4ae9eff;hpb=9f7c48ab54a55953597eb2287648103255fd8b0a;p=openldap diff --git a/servers/slapd/modrdn.c b/servers/slapd/modrdn.c index cf4f9e2d31..3b413d9cab 100644 --- a/servers/slapd/modrdn.c +++ b/servers/slapd/modrdn.c @@ -1,31 +1,34 @@ /* $OpenLDAP$ */ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file - */ -/* - * Copyright (c) 1995 Regents of the University of Michigan. +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2003 The OpenLDAP Foundation. * All rights reserved. * - * Redistribution and use in source and binary forms are permitted - * provided that this notice is preserved and that due credit is given - * to the University of Michigan at Ann Arbor. The name of the University - * may not be used to endorse or promote products derived from this - * software without specific prior written permission. This software - * is provided ``as is'' without express or implied warranty. - */ - -/* - * LDAP v3 newSuperior support. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. * - * Copyright 1999, Juan C. Gomez, All rights reserved. + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Portions Copyright 1999, Juan C. Gomez, All rights reserved. * This software is not subject to any license of Silicon Graphics * Inc. or Purdue University. * * Redistribution and use in source and binary forms are permitted * without restriction or fee of any kind as long as this notice * is preserved. + */ +/* Portions Copyright (c) 1995 Regents of the University of Michigan. + * All rights reserved. * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Michigan at Ann Arbor. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. */ #include "portable.h" @@ -60,10 +63,6 @@ do_modrdn( ber_len_t length; int manageDSAit; -#ifdef LDAP_SLAPI - Slapi_PBlock *pb = op->o_pb; -#endif - #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ENTRY, "do_modrdn: begin\n", 0, 0, 0 ); #else @@ -276,10 +275,15 @@ do_modrdn( NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT ); if (!rs->sr_ref) rs->sr_ref = default_referral; - rs->sr_err = LDAP_REFERRAL; - send_ldap_result( op, rs ); + if ( rs->sr_ref != NULL ) { + rs->sr_err = LDAP_REFERRAL; + send_ldap_result( op, rs ); - if (rs->sr_ref != default_referral) ber_bvarray_free( rs->sr_ref ); + if (rs->sr_ref != default_referral) ber_bvarray_free( rs->sr_ref ); + } else { + send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, + "referral missing" ); + } goto cleanup; } @@ -310,30 +314,35 @@ do_modrdn( } #if defined( LDAP_SLAPI ) - slapi_x_pblock_set_operation( pb, op ); - slapi_pblock_set( pb, SLAPI_MODRDN_TARGET, (void *)dn.bv_val ); - slapi_pblock_set( pb, SLAPI_MODRDN_NEWRDN, (void *)newrdn.bv_val ); - slapi_pblock_set( pb, SLAPI_MODRDN_NEWSUPERIOR, - (void *)newSuperior.bv_val ); - slapi_pblock_set( pb, SLAPI_MODRDN_DELOLDRDN, (void *)deloldrdn ); - slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit ); - - rs->sr_err = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_MODRDN_FN, pb ); - if ( rs->sr_err < 0 ) { - /* - * A preoperation plugin failure will abort the - * entire operation. - */ +#define pb op->o_pb + if ( pb ) { + slapi_x_pblock_set_operation( pb, op ); + slapi_pblock_set( pb, SLAPI_MODRDN_TARGET, (void *)dn.bv_val ); + slapi_pblock_set( pb, SLAPI_MODRDN_NEWRDN, (void *)newrdn.bv_val ); + slapi_pblock_set( pb, SLAPI_MODRDN_NEWSUPERIOR, + (void *)newSuperior.bv_val ); + slapi_pblock_set( pb, SLAPI_MODRDN_DELOLDRDN, (void *)deloldrdn ); + slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit ); + + rs->sr_err = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_MODRDN_FN, pb ); + if ( rs->sr_err < 0 ) { + /* + * A preoperation plugin failure will abort the + * entire operation. + */ #ifdef NEW_LOGGING - LDAP_LOG( OPERATION, INFO, "do_modrdn: modrdn preoperation plugin " - "failed\n", 0, 0, 0 ); + LDAP_LOG( OPERATION, INFO, "do_modrdn: modrdn preoperation plugin " + "failed\n", 0, 0, 0 ); #else - Debug(LDAP_DEBUG_TRACE, "do_modrdn: modrdn preoperation plugin " - "failed.\n", 0, 0, 0); + Debug(LDAP_DEBUG_TRACE, "do_modrdn: modrdn preoperation plugin " + "failed.\n", 0, 0, 0); #endif - if ( slapi_pblock_get( pb, SLAPI_RESULT_CODE, (void *)&rs->sr_err ) != 0) - rs->sr_err = LDAP_OTHER; - goto cleanup; + if ( ( slapi_pblock_get( pb, SLAPI_RESULT_CODE, (void *)&rs->sr_err ) != 0 ) || + rs->sr_err == LDAP_SUCCESS ) { + rs->sr_err = LDAP_OTHER; + } + goto cleanup; + } } #endif /* defined( LDAP_SLAPI ) */ @@ -347,7 +356,10 @@ do_modrdn( /* do the update here */ int repl_user = be_isupdate( op->o_bd, &op->o_ndn ); #ifndef SLAPD_MULTIMASTER - if ( !op->o_bd->be_update_ndn.bv_len || repl_user ) + if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo ) && + ( !op->o_bd->be_update_ndn.bv_len || repl_user )) +#else + if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) #endif { op->orr_deleteoldrdn = deloldrdn; @@ -360,8 +372,18 @@ do_modrdn( } #ifndef SLAPD_MULTIMASTER } else { - BerVarray defref = op->o_bd->be_update_refs - ? op->o_bd->be_update_refs : default_referral; + BerVarray defref = NULL; + if ( !LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) { + syncinfo_t *si; + LDAP_STAILQ_FOREACH( si, &op->o_bd->be_syncinfo, si_next ) { + struct berval tmpbv; + ber_dupbv( &tmpbv, &si->si_provideruri_bv[0] ); + ber_bvarray_add( &defref, &tmpbv ); + } + } else { + defref = op->o_bd->be_update_refs + ? op->o_bd->be_update_refs : default_referral; + } if ( defref != NULL ) { rs->sr_ref = referral_rewrite( defref, NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT ); @@ -384,7 +406,7 @@ do_modrdn( } #if defined( LDAP_SLAPI ) - if ( doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_MODRDN_FN, pb ) < 0 ) { + if ( pb && doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_MODRDN_FN, pb ) < 0 ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "do_modrdn: modrdn postoperation plugins " "failed\n", 0, 0, 0 ); @@ -396,6 +418,9 @@ do_modrdn( #endif /* defined( LDAP_SLAPI ) */ cleanup: + + slap_graduate_commit_csn( op ); + op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx ); op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx ); @@ -418,11 +443,15 @@ slap_modrdn2mods( Modifications **pmod ) { Modifications *mod = NULL; + Modifications **modtail = &mod; int a_cnt, d_cnt; + int repl_user; assert( new_rdn != NULL ); assert( !op->orr_deleteoldrdn || old_rdn != NULL ); + repl_user = be_isupdate( op->o_bd, &op->o_ndn ); + /* Add new attribute values to the entry */ for ( a_cnt = 0; new_rdn[a_cnt]; a_cnt++ ) { AttributeDescription *desc = NULL; @@ -473,7 +502,7 @@ slap_modrdn2mods( if( desc->ad_type->sat_equality->smr_normalize) { mod_tmp->sml_nvalues = &mod_tmp->sml_values[2]; (void) (*desc->ad_type->sat_equality->smr_normalize)( - SLAP_MR_EQUALITY, + SLAP_MR_EQUALITY|SLAP_MR_VALUE_OF_ASSERTION_SYNTAX, desc->ad_type->sat_syntax, desc->ad_type->sat_equality, &mod_tmp->sml_values[0], @@ -542,7 +571,7 @@ slap_modrdn2mods( if( desc->ad_type->sat_equality->smr_normalize) { mod_tmp->sml_nvalues = &mod_tmp->sml_values[2]; (void) (*desc->ad_type->sat_equality->smr_normalize)( - SLAP_MR_EQUALITY, + SLAP_MR_EQUALITY|SLAP_MR_VALUE_OF_ASSERTION_SYNTAX, desc->ad_type->sat_syntax, desc->ad_type->sat_equality, &mod_tmp->sml_values[0], @@ -558,6 +587,21 @@ slap_modrdn2mods( } done: + + if ( !repl_user ) { + char textbuf[ SLAP_TEXT_BUFLEN ]; + size_t textlen = sizeof textbuf; + + for( modtail = &mod; + *modtail != NULL; + modtail = &(*modtail)->sml_next ) + { + /* empty */ + } + + rs->sr_err = slap_mods_opattrs( op, mod, modtail, &rs->sr_text, textbuf, textlen ); + } + /* LDAP v2 supporting correct attribute handling. */ if ( rs->sr_err != LDAP_SUCCESS && mod != NULL ) { Modifications *tmp;