]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/add.c
rework objectClass mucking to use syntax "pretty" routine
[openldap] / servers / slapd / add.c
index 1a9bf13c01668ef86fd4acee6b250f968cf03f0e..c1557adf8e37d99aaa8a402371074722048c0b6d 100644 (file)
@@ -78,7 +78,7 @@ do_add( Operation *op, SlapReply *rs )
 
        e = (Entry *) ch_calloc( 1, sizeof(Entry) );
 
-       rs->sr_err = dnPrettyNormal( NULL, &dn, &e->e_name, &e->e_nname );
+       rs->sr_err = dnPrettyNormal( NULL, &dn, &op->o_req_dn, &op->o_req_ndn, op->o_tmpmemctx );
 
        if( rs->sr_err != LDAP_SUCCESS ) {
 #ifdef NEW_LOGGING
@@ -91,6 +91,9 @@ do_add( Operation *op, SlapReply *rs )
                goto done;
        }
 
+       ber_dupbv( &e->e_name, &op->o_req_dn );
+       ber_dupbv( &e->e_nname, &op->o_req_ndn );
+
 #ifdef NEW_LOGGING
        LDAP_LOG( OPERATION, ARGS, 
                "do_add: conn %d  dn (%s)\n", op->o_connid, e->e_dn, 0 );
@@ -98,9 +101,6 @@ do_add( Operation *op, SlapReply *rs )
        Debug( LDAP_DEBUG_ARGS, "do_add: dn (%s)\n", e->e_dn, 0, 0 );
 #endif
 
-       op->o_req_dn = e->e_name;
-       op->o_req_ndn = e->e_nname;
-
        /* get the attrs */
        for ( tag = ber_first_element( ber, &len, &last ); tag != LBER_DEFAULT;
            tag = ber_next_element( ber, &len, last ) )
@@ -108,9 +108,7 @@ do_add( Operation *op, SlapReply *rs )
                Modifications *mod;
                ber_tag_t rtag;
 
-#ifdef SLAP_NVALUES
                tmp.sml_nvalues = NULL;
-#endif
 
                rtag = ber_scanf( ber, "{m{W}}", &tmp.sml_type, &tmp.sml_values );
 
@@ -145,9 +143,7 @@ do_add( Operation *op, SlapReply *rs )
                mod->sml_desc = NULL;
                mod->sml_type = tmp.sml_type;
                mod->sml_values = tmp.sml_values;
-#ifdef SLAP_NVALUES
                mod->sml_nvalues = NULL;
-#endif
 
                *modtail = mod;
                modtail = &mod->sml_next;
@@ -204,12 +200,16 @@ do_add( Operation *op, SlapReply *rs )
        if ( op->o_bd == NULL ) {
                rs->sr_ref = referral_rewrite( default_referral,
                        NULL, &e->e_name, LDAP_SCOPE_DEFAULT );
-
-               rs->sr_err = LDAP_REFERRAL;
                if (!rs->sr_ref) rs->sr_ref = default_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 done;
        }
 
@@ -246,7 +246,7 @@ do_add( Operation *op, SlapReply *rs )
                        size_t textlen = sizeof textbuf;
 
                        rs->sr_err = slap_mods_check( modlist, update, &rs->sr_text,
-                               textbuf, textlen );
+                               textbuf, textlen, NULL );
 
                        if( rs->sr_err != LDAP_SUCCESS ) {
                                send_ldap_result( op, rs );
@@ -288,7 +288,7 @@ do_add( Operation *op, SlapReply *rs )
                        }
 #endif /* LDAP_SLAPI */
 
-                       op->oq_add.rs_e = e;
+                       op->ora_e = e;
                        if ( (op->o_bd->be_add)( op, rs ) == 0 ) {
 #ifdef SLAPD_MULTIMASTER
                                if ( !repl_user )
@@ -303,7 +303,6 @@ do_add( Operation *op, SlapReply *rs )
 #ifndef SLAPD_MULTIMASTER
                } else {
                        BerVarray defref;
-                       BerVarray ref;
 #ifdef LDAP_SLAPI
                        /*
                         * SLAPI_ADD_ENTRY will be empty, but this may be acceptable
@@ -318,14 +317,20 @@ do_add( Operation *op, SlapReply *rs )
 
                        defref = op->o_bd->be_update_refs
                                ? op->o_bd->be_update_refs : default_referral;
-                       rs->sr_ref = referral_rewrite( defref,
-                               NULL, &e->e_name, LDAP_SCOPE_DEFAULT );
-
-                       rs->sr_err = LDAP_REFERRAL;
-                       if (!rs->sr_ref) rs->sr_ref = default_referral;
-                       send_ldap_result( op, rs );
+                       if ( defref != NULL ) {
+                               rs->sr_ref = referral_rewrite( defref,
+                                       NULL, &e->e_name, LDAP_SCOPE_DEFAULT );
+                               if ( rs->sr_ref == NULL ) rs->sr_ref = defref;
+                               rs->sr_err = LDAP_REFERRAL;
+                               if (!rs->sr_ref) rs->sr_ref = default_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" );
+                       }
 #endif /* SLAPD_MULTIMASTER */
                }
        } else {
@@ -357,6 +362,8 @@ done:
        if( e != NULL ) {
                entry_free( e );
        }
+       op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
+       op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
 
        return rs->sr_err;
 }
@@ -414,7 +421,6 @@ slap_mods2entry(
                        ch_free( mods->sml_values );
                        mods->sml_values = NULL;
 
-#ifdef SLAP_NVALUES
                        if( mods->sml_nvalues ) {
                                attr->a_nvals = ch_realloc( attr->a_nvals,
                                        sizeof( struct berval ) * (i+j) );
@@ -428,7 +434,6 @@ slap_mods2entry(
                        } else {
                                attr->a_nvals = attr->a_vals;
                        }
-#endif
 
                        continue;
 #else
@@ -461,15 +466,14 @@ slap_mods2entry(
                                }
 
                        } else {
-                               int             rc;
-#ifdef SLAP_NVALUES
+                               int             rc = LDAP_SUCCESS;
                                int match;
 
                                for ( i = 0; mods->sml_nvalues[i].bv_val != NULL; i++ ) {
                                        /* test asserted values against themselves */
                                        for( j = 0; j < i; j++ ) {
                                                rc = value_match( &match, mods->sml_desc, mr,
-                                                       SLAP_MR_EQUALITY | SLAP_MR_VALUE_OF_ASSERTION_SYNTAX
+                                                       SLAP_MR_EQUALITY | SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX
                                                        | SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH
                                                        | SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH,
                                                        &mods->sml_nvalues[i], &mods->sml_nvalues[j], text );
@@ -482,11 +486,6 @@ slap_mods2entry(
                                                }
                                        }
                                }
-#else
-                               rc = modify_check_duplicates( mods->sml_desc, mr,
-                                               NULL, mods->sml_bvalues, 0,
-                                               text, textbuf, textlen );
-#endif
                                if ( rc != LDAP_SUCCESS ) {
                                        return rc;
                                }
@@ -504,14 +503,12 @@ slap_mods2entry(
                attr->a_vals = mods->sml_values;
                mods->sml_values = NULL;
 
-#ifdef SLAP_NVALUES
                if ( mods->sml_nvalues ) {
                        attr->a_nvals = mods->sml_nvalues;
                        mods->sml_nvalues = NULL;
                } else {
                        attr->a_nvals = attr->a_vals;
                }
-#endif
 
                *tail = attr;
                tail = &attr->a_next;
@@ -535,7 +532,7 @@ static int doPreAddPluginFNs( Operation *op )
        int rc;
 
        rc = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_ADD_FN, op->o_pb );
-       if ( rc != 0 ) {
+       if ( rc < 0 ) {
                /*
                 * A preoperation plugin failure will abort the
                 * entire operation.
@@ -561,12 +558,12 @@ static void doPostAddPluginFNs( Operation *op )
        int rc;
 
        rc = doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_ADD_FN, op->o_pb );
-       if ( rc != 0 ) {
+       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",
+               Debug(LDAP_DEBUG_TRACE, "do_add: add postoperation plugin failed.\n",
                                0, 0, 0);
 #endif
        }