From 13c48d1f76a26db71a90b32d9c73322378dfc636 Mon Sep 17 00:00:00 2001 From: Luke Howard Date: Wed, 29 Jan 2003 22:43:19 +0000 Subject: [PATCH] Ensure that, when an entry is actually being added to the directory, the entry specified by SLAPI_ADD_ENTRY contains the attributes to be added. --- servers/slapd/add.c | 157 +++++++++++++++++++++++++++++++------------- 1 file changed, 111 insertions(+), 46 deletions(-) diff --git a/servers/slapd/add.c b/servers/slapd/add.c index c9bb697f97..4f3af2341d 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -26,6 +26,13 @@ #include "slap.h" #include "slapi.h" +#ifdef LDAP_SLAPI +static Slapi_PBlock *initAddPlugin( Backend *be, Connection *conn, Operation *op, + struct berval *dn, Entry *e, int manageDSAit ); +static int doPreAddPluginFNs( Backend *be, Slapi_PBlock *pb ); +static void doPostAddPluginFNs( Backend *be, Slapi_PBlock *pb ); +#endif /* LDAP_SLAPI */ + int do_add( Connection *conn, Operation *op ) { @@ -44,8 +51,9 @@ do_add( Connection *conn, Operation *op ) int cnt; int rc = LDAP_SUCCESS; int manageDSAit; - - Slapi_PBlock *pb = op->o_pb; +#ifdef LDAP_SLAPI + Slapi_PBlock *pb = NULL; +#endif /* LDAP_SLAPI */ #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ENTRY, "do_add: conn %d enter\n", conn->c_connid,0,0 ); @@ -417,32 +425,9 @@ do_add( Connection *conn, Operation *op ) goto done; } -#if defined( LDAP_SLAPI ) - slapi_x_backend_set_pb( pb, be ); - slapi_x_connection_set_pb( pb, conn ); - slapi_x_operation_set_pb( pb, op ); - slapi_pblock_set( pb, SLAPI_ADD_ENTRY, (void *)e ); - slapi_pblock_set( pb, SLAPI_ADD_TARGET, (void *)dn.bv_val ); - slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit ); - - rc = doPluginFNs( be, SLAPI_PLUGIN_PRE_ADD_FN, pb ); - if ( rc != 0 ) { - /* - * A preoperation plugin failure will abort the - * entire operation. - */ -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, INFO, "do_add: add preoperation plugin failed\n", - 0, 0, 0); -#else - Debug(LDAP_DEBUG_TRACE, "do_add: add preoperation plugin failed.\n", - 0, 0, 0); - if ( slapi_pblock_get( pb, SLAPI_RESULT_CODE, (void *)&rc ) != 0 ) - rc = LDAP_OTHER; - goto done; -#endif - } -#endif /* defined( LDAP_SLAPI ) */ +#ifdef LDAP_SLAPI + pb = initAddPlugin( be, conn, op, &dn, e, manageDSAit ); +#endif /* LDAP_SLAPI */ /* * do the add if 1 && (2 || 3) @@ -495,6 +480,18 @@ do_add( Connection *conn, Operation *op ) goto done; } +#ifdef LDAP_SLAPI + /* + * Call the preoperation plugin here, because the entry + * will actually contain something. + */ + rc = doPreAddPluginFNs( be, pb ); + if ( rc != LDAP_SUCCESS ) { + /* plugin will have sent result */ + goto done; + } +#endif /* LDAP_SLAPI */ + if ( (*be->be_add)( be, conn, op, e ) == 0 ) { #ifdef SLAPD_MULTIMASTER if ( !repl_user ) @@ -508,18 +505,37 @@ do_add( Connection *conn, Operation *op ) #ifndef SLAPD_MULTIMASTER } else { - BerVarray defref = be->be_update_refs + BerVarray defref; + BerVarray ref; +#ifdef LDAP_SLAPI + /* + * SLAPI_ADD_ENTRY will be empty, but this may be acceptable + * on replicas (for now, it involves the minimum code intrusion). + */ + rc = doPreAddPluginFNs( be, pb ); + if ( rc != LDAP_SUCCESS ) { + /* plugin will have sent result */ + goto done; + } +#endif /* LDAP_SLAPI */ + + defref = be->be_update_refs ? be->be_update_refs : default_referral; - BerVarray ref = referral_rewrite( defref, + ref = referral_rewrite( defref, NULL, &e->e_name, LDAP_SCOPE_DEFAULT ); send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL, ref ? ref : defref, NULL ); if ( ref ) ber_bvarray_free( ref ); -#endif +#endif /* SLAPD_MULTIMASTER */ } } else { + rc = doPreAddPluginFNs( be, pb ); + if ( rc != LDAP_SUCCESS ) { + /* plugin will have sent result */ + goto done; + } #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "do_add: conn %d no backend support\n", conn->c_connid, 0, 0 ); @@ -530,21 +546,9 @@ do_add( Connection *conn, Operation *op ) NULL, "operation not supported within namingContext", NULL, NULL ); } -#if defined( LDAP_SLAPI ) - /* - * Postoperation errors are silently ignored; the work has - * been done. - */ - if ( doPluginFNs( be, SLAPI_PLUGIN_POST_ADD_FN, pb ) != 0) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, INFO, "do_add: Add postoperation plugins failed\n", - 0, 0, 0); -#else - Debug(LDAP_DEBUG_TRACE, "do_add: Add postoperation plugins failed.\n", - 0, 0, 0); -#endif - } -#endif /* defined( LDAP_SLAPI ) */ +#ifdef LDAP_SLAPI + doPostAddPluginFNs( be, pb ); +#endif /* LDAP_SLAPI */ done: if( modlist != NULL ) { @@ -673,3 +677,64 @@ slap_mods2entry( return LDAP_SUCCESS; } +#ifdef LDAP_SLAPI +static Slapi_PBlock *initAddPlugin( Backend *be, Connection *conn, Operation *op, + struct berval *dn, Entry *e, int manageDSAit ) +{ + Slapi_PBlock *pb; + + pb = op->o_pb; + + slapi_x_backend_set_pb( pb, be ); + slapi_x_connection_set_pb( pb, conn ); + slapi_x_operation_set_pb( pb, op ); + + slapi_pblock_set( pb, SLAPI_ADD_TARGET, (void *)dn->bv_val ); + slapi_pblock_set( pb, SLAPI_ADD_ENTRY, (void *)e ); + slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit ); + + return pb; +} + +static int doPreAddPluginFNs( Backend *be, Slapi_PBlock *pb ) +{ + int rc; + + rc = doPluginFNs( be, SLAPI_PLUGIN_PRE_ADD_FN, pb ); + if ( rc != 0 ) { + /* + * A preoperation plugin failure will abort the + * entire operation. + */ +#ifdef NEW_LOGGING + LDAP_LOG( OPERATION, INFO, "do_add: add preoperation plugin failed\n", + 0, 0, 0); +#else + Debug(LDAP_DEBUG_TRACE, "do_add: add preoperation plugin failed.\n", + 0, 0, 0); + if ( slapi_pblock_get( pb, SLAPI_RESULT_CODE, (void *)&rc ) != 0 ) + rc = LDAP_OTHER; +#endif + } else { + rc = LDAP_SUCCESS; + } + + return rc; +} + +static void doPostAddPluginFNs( Backend *be, Slapi_PBlock *pb ) +{ + int rc; + + rc = doPluginFNs( be, SLAPI_PLUGIN_POST_ADD_FN, pb ); + if ( rc != 0 ) { +#ifdef NEW_LOGGING + LDAP_LOG( OPERATION, INFO, "do_add: add postoperation plugin failed\n", + 0, 0, 0); +#else + Debug(LDAP_DEBUG_TRACE, "do_add: add preoperation plugin failed.\n", + 0, 0, 0); +#endif + } +} +#endif /* LDAP_SLAPI */ -- 2.39.5