]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/add.c
reject registrations when back-monitor is not configured
[openldap] / servers / slapd / add.c
index b877169f4989794d121ac9bed0d4b5cf6265e7a0..7df87348aa1c7b1b5b8740e63044c4b5e5b24230 100644 (file)
@@ -166,6 +166,14 @@ do_add( Operation *op, SlapReply *rs )
        /* temporary; remove if not invoking backend function */
        op->ora_modlist = modlist;
 
+       /* call this so global overlays/SLAPI have access to ora_e */
+       rs->sr_err = slap_mods2entry( op->ora_modlist, &op->ora_e,
+               1, 0, &rs->sr_text, textbuf, textlen );
+       if ( rs->sr_err != LDAP_SUCCESS ) {
+               send_ldap_result( op, rs );
+               goto done;
+       }
+
        op->o_bd = frontendDB;
        rc = frontendDB->be_add( op, rs );
        if ( rc == 0 ) {
@@ -187,8 +195,9 @@ done:;
        slap_graduate_commit_csn( op );
 
        if ( modlist != NULL ) {
-               slap_mods_free( modlist );
+               slap_mods_free( modlist, 0 );
        }
+
        if ( op->ora_e != NULL ) {
                entry_free( op->ora_e );
        }
@@ -302,6 +311,7 @@ fe_op_add( Operation *op, SlapReply *rs )
                                        assert( (*modtail)->sml_desc != NULL );
                                }
 
+
                                rs->sr_err = slap_mods_opattrs( op, modlist,
                                                modtail, &rs->sr_text,
                                                textbuf, textlen, 1 );
@@ -309,13 +319,21 @@ fe_op_add( Operation *op, SlapReply *rs )
                                        send_ldap_result( op, rs );
                                        goto done;
                                }
-                       }
 
-                       rs->sr_err = slap_mods2entry( modlist, &op->ora_e,
-                               repl_user, 0, &rs->sr_text, textbuf, textlen );
-                       if ( rs->sr_err != LDAP_SUCCESS ) {
-                               send_ldap_result( op, rs );
-                               goto done;
+                               /* check for duplicate values */
+                               rs->sr_err = slap_mods_no_repl_user_mod_check( op,
+                                       modlist, &rs->sr_text, textbuf, textlen );
+                               if ( rs->sr_err != LDAP_SUCCESS ) {
+                                       send_ldap_result( op, rs );
+                                       goto done;
+                               }
+
+                               rs->sr_err = slap_mods2entry( *modtail, &op->ora_e,
+                                       0, 0, &rs->sr_text, textbuf, textlen );
+                               if ( rs->sr_err != LDAP_SUCCESS ) {
+                                       send_ldap_result( op, rs );
+                                       goto done;
+                               }
                        }
 
 #ifdef SLAPD_MULTIMASTER
@@ -373,22 +391,25 @@ int
 slap_mods2entry(
        Modifications *mods,
        Entry **e,
-       int repl_user,
+       int initial,
        int dup,
        const char **text,
        char *textbuf, size_t textlen )
 {
-       Attribute **tail = &(*e)->e_attrs;
-       assert( *tail == NULL );
+       Attribute **tail;
+
+       if ( initial ) {
+               assert( (*e)->e_attrs == NULL );
+       }
+
+       for ( tail = &(*e)->e_attrs; *tail != NULL; tail = &(*tail)->a_next )
+               ;
 
        *text = textbuf;
 
        for( ; mods != NULL; mods = mods->sml_next ) {
                Attribute *attr;
 
-               if ( !repl_user ) {
-                       assert( mods->sml_op == LDAP_MOD_ADD );
-               }
                assert( mods->sml_desc != NULL );
 
                attr = attr_find( (*e)->e_attrs, mods->sml_desc );
@@ -398,11 +419,15 @@ slap_mods2entry(
 #ifdef SLURPD_FRIENDLY
                        ber_len_t i,j;
 
-                       if( !repl_user ) {
-                               snprintf( textbuf, textlen,
-                                       "attribute '%s' provided more than once",
-                                       mods->sml_desc->ad_cname.bv_val );
-                               return LDAP_TYPE_OR_VALUE_EXISTS;
+                       if ( !initial ) {
+                               /*      
+                                * This check allows overlays to override operational
+                                * attributes by setting them directly in the entry.
+                                * We assume slap_mods_no_user_mod_check() was called
+                                * with the user modifications.
+                                */
+                               *text = NULL;
+                               return LDAP_SUCCESS;
                        }
 
                        for( i=0; attr->a_vals[i].bv_val; i++ ) {
@@ -422,12 +447,11 @@ slap_mods2entry(
                                for ( j = 0; mods->sml_values[j].bv_val; j++ ) {
                                        ber_dupbv( &attr->a_vals[i+j], &mods->sml_values[j] );
                                }
-                               BER_BVZERO( &attr->a_vals[i+j] );       
+                               BER_BVZERO( &attr->a_vals[i+j] );
+                               j++;
                        } else {
                                AC_MEMCPY( &attr->a_vals[i], mods->sml_values,
                                        sizeof( struct berval ) * j );
-                               ch_free( mods->sml_values );
-                               mods->sml_values = NULL;
                        }
 
                        if( mods->sml_nvalues ) {
@@ -441,8 +465,6 @@ slap_mods2entry(
                                } else {
                                        AC_MEMCPY( &attr->a_nvals[i], mods->sml_nvalues,
                                                sizeof( struct berval ) * j );
-                                       ch_free( mods->sml_nvalues );
-                                       mods->sml_nvalues = NULL;
                                }
                        } else {
                                attr->a_nvals = attr->a_vals;
@@ -496,7 +518,6 @@ slap_mods2entry(
 
                /* move ad to attr structure */
                attr->a_desc = mods->sml_desc;
-               if ( !dup ) mods->sml_desc = NULL;
 
                /* move values to attr structure */
                /*      should check for duplicates */
@@ -510,7 +531,6 @@ slap_mods2entry(
                        BER_BVZERO( &attr->a_vals[i] );
                } else {
                        attr->a_vals = mods->sml_values;
-                       mods->sml_values = NULL;
                }
 
                if ( mods->sml_nvalues ) {
@@ -524,7 +544,6 @@ slap_mods2entry(
                                BER_BVZERO( &attr->a_nvals[i] );
                        } else {
                                attr->a_nvals = mods->sml_nvalues;
-                               mods->sml_nvalues = NULL;
                        }
                } else {
                        attr->a_nvals = attr->a_vals;