Skip to content
Snippets Groups Projects
Commit 13c48d1f authored by Luke Howard's avatar Luke Howard
Browse files

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.
parent e86fe9ad
No related branches found
No related tags found
No related merge requests found
......@@ -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 */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment