]> git.sur5r.net Git - openldap/commitdiff
Ensure that, when an entry is actually being added to the directory,
authorLuke Howard <lukeh@openldap.org>
Wed, 29 Jan 2003 22:43:19 +0000 (22:43 +0000)
committerLuke Howard <lukeh@openldap.org>
Wed, 29 Jan 2003 22:43:19 +0000 (22:43 +0000)
the entry specified by SLAPI_ADD_ENTRY contains the attributes to be
added.

servers/slapd/add.c

index c9bb697f978252723ed71c14ad0204acf7279658..4f3af2341da259e38dde12f3afc9d5ff4e0d1fd2 100644 (file)
 #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 */