]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/modify.c
allow proxying of dynamic objects (irrespective of the support provided to dynamic...
[openldap] / servers / slapd / modify.c
index 5e45e20fbd88332491d3d7139deb0ad5071e0c19..05891b3dbef9e8be60367ff572ea9329f5105e2f 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2005 The OpenLDAP Foundation.
+ * Copyright 1998-2006 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -214,14 +214,11 @@ fe_op_modify( Operation *op, SlapReply *rs )
        Modifications   *tmp;
 #endif
        int             manageDSAit;
-       Modifications   *modlist = op->orm_modlist;
-       Modifications   **modtail = &modlist;
-       int             increment = op->orm_increment;
-       BackendDB *op_be;
+       BackendDB       *op_be;
        char            textbuf[ SLAP_TEXT_BUFLEN ];
        size_t          textlen = sizeof( textbuf );
        
-       if( op->o_req_ndn.bv_len == 0 ) {
+       if ( BER_BVISEMPTY( &op->o_req_ndn ) ) {
                Debug( LDAP_DEBUG_ANY, "do_modify: root dse!\n", 0, 0, 0 );
 
                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
@@ -239,7 +236,7 @@ fe_op_modify( Operation *op, SlapReply *rs )
 #ifdef LDAP_DEBUG
        Debug( LDAP_DEBUG_ARGS, "modifications:\n", 0, 0, 0 );
 
-       for ( tmp = modlist; tmp != NULL; tmp = tmp->sml_next ) {
+       for ( tmp = op->orm_modlist; tmp != NULL; tmp = tmp->sml_next ) {
                Debug( LDAP_DEBUG_ARGS, "\t%s: %s\n",
                        tmp->sml_op == LDAP_MOD_ADD ? "add" :
                                (tmp->sml_op == LDAP_MOD_INCREMENT ? "increment" :
@@ -268,7 +265,7 @@ fe_op_modify( Operation *op, SlapReply *rs )
                Statslog( LDAP_DEBUG_STATS, "%s MOD dn=\"%s\"\n",
                        op->o_log_prefix, op->o_req_dn.bv_val, 0, 0, 0 );
 
-               for ( tmp = modlist; tmp != NULL; tmp = tmp->sml_next ) {
+               for ( tmp = op->orm_modlist; tmp != NULL; tmp = tmp->sml_next ) {
                        if (len + 1 + tmp->sml_type.bv_len > sizeof(abuf)) {
                                Statslog( LDAP_DEBUG_STATS, "%s MOD attr=%s\n",
                                    op->o_log_prefix, abuf, 0, 0, 0 );
@@ -307,15 +304,20 @@ fe_op_modify( Operation *op, SlapReply *rs )
        if ( op->o_bd == NULL ) {
                rs->sr_ref = referral_rewrite( default_referral,
                        NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT );
-               if (!rs->sr_ref) rs->sr_ref = default_referral;
+               if ( !rs->sr_ref ) {
+                       rs->sr_ref = default_referral;
+               }
 
-               if (rs->sr_ref != NULL ) {
+               if ( rs->sr_ref != NULL ) {
                        rs->sr_err = LDAP_REFERRAL;
                        op->o_bd = frontendDB;
                        send_ldap_result( op, rs );
                        op->o_bd = NULL;
 
-                       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 {
                        op->o_bd = frontendDB;
                        send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
@@ -332,17 +334,17 @@ fe_op_modify( Operation *op, SlapReply *rs )
        }
 
        /* check restrictions */
-       if( backend_check_restrictions( op, rs, NULL ) != LDAP_SUCCESS ) {
+       if ( backend_check_restrictions( op, rs, NULL ) != LDAP_SUCCESS ) {
                send_ldap_result( op, rs );
                goto cleanup;
        }
 
        /* check for referrals */
-       if( backend_check_referrals( op, rs ) != LDAP_SUCCESS ) {
+       if ( backend_check_referrals( op, rs ) != LDAP_SUCCESS ) {
                goto cleanup;
        }
 
-       rs->sr_err = slap_mods_obsolete_check( op, modlist,
+       rs->sr_err = slap_mods_obsolete_check( op, op->orm_modlist,
                &rs->sr_text, textbuf, textlen );
        if ( rs->sr_err != LDAP_SUCCESS ) {
                send_ldap_result( op, rs );
@@ -350,7 +352,7 @@ fe_op_modify( Operation *op, SlapReply *rs )
        }
 
        /* check for modify/increment support */
-       ifincrement && !SLAP_INCREMENT( op->o_bd ) ) {
+       if ( op->orm_increment && !SLAP_INCREMENT( op->o_bd ) ) {
                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                        "modify/increment not supported in context" );
        }
@@ -370,7 +372,7 @@ fe_op_modify( Operation *op, SlapReply *rs )
                 */
 #ifndef SLAPD_MULTIMASTER
                if ( !SLAP_SHADOW(op->o_bd) || repl_user )
-#endif
+#endif /* ! SLAPD_MULTIMASTER */
                {
                        int             update = !BER_BVISEMPTY( &op->o_bd->be_update_ndn );
                        slap_callback   cb = { NULL, slap_replog_cb, NULL, NULL };
@@ -378,7 +380,7 @@ fe_op_modify( Operation *op, SlapReply *rs )
                        op->o_bd = op_be;
 
                        if ( !update ) {
-                               rs->sr_err = slap_mods_no_user_mod_check( op, modlist,
+                               rs->sr_err = slap_mods_no_user_mod_check( op, op->orm_modlist,
                                        &rs->sr_text, textbuf, textlen );
                                if ( rs->sr_err != LDAP_SUCCESS ) {
                                        send_ldap_result( op, rs );
@@ -386,10 +388,9 @@ fe_op_modify( Operation *op, SlapReply *rs )
                                }
                        }
 
-                       op->orm_modlist = modlist;
 #ifdef SLAPD_MULTIMASTER
                        if ( !repl_user )
-#endif
+#endif /* SLAPD_MULTIMASTER */
                        {
                                /* but multimaster slapd logs only the ones 
                                 * not from a replicator user */
@@ -422,7 +423,7 @@ fe_op_modify( Operation *op, SlapReply *rs )
                                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                        "shadow context; no update referral" );
                        }
-#endif
+#endif /* ! SLAPD_MULTIMASTER */
                }
        } else {
                send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
@@ -479,7 +480,9 @@ slap_mods_no_user_mod_check(
        size_t textlen )
 {
        for ( ; ml != NULL; ml = ml->sml_next ) {
-               if ( !is_at_no_user_mod( ml->sml_desc->ad_type ) ) continue;
+               if ( !is_at_no_user_mod( ml->sml_desc->ad_type ) ) {
+                       continue;
+               }
 
                if ( get_manageDIT( op ) ) {
                        if ( ml->sml_desc->ad_type->sat_flags & SLAP_AT_MANAGEABLE ) {
@@ -526,6 +529,7 @@ slap_mods_no_repl_user_mod_check(
                                snprintf( textbuf, textlen,
                                        "attribute '%s' provided more than once",
                                        mods->sml_desc->ad_cname.bv_val );
+                               *text = textbuf;
                                return LDAP_TYPE_OR_VALUE_EXISTS;
                        }
                }
@@ -651,7 +655,7 @@ int slap_mods_check(
                         * check that each value is valid per syntax
                         *      and pretty if appropriate
                         */
-                       for ( nvals = 0; ml->sml_values[nvals].bv_val; nvals++ ) {
+                       for ( nvals = 0; !BER_BVISNULL( &ml->sml_values[nvals] ); nvals++ ) {
                                struct berval pval;
 
                                if ( pretty ) {
@@ -665,7 +669,7 @@ int slap_mods_check(
                                } else {
 #ifdef SLAP_ORDERED_PRETTYNORM
                                        rc = ordered_value_validate( ad,
-                                               &ml->sml_values[nvals] );
+                                               &ml->sml_values[nvals], ml->sml_op );
 #else /* ! SLAP_ORDERED_PRETTYNORM */
                                        rc = validate( ad->ad_type->sat_syntax,
                                                &ml->sml_values[nvals] );
@@ -714,7 +718,7 @@ int slap_mods_check(
                                ml->sml_nvalues = ber_memalloc_x(
                                        (nvals+1)*sizeof(struct berval), ctx );
 
-                               for ( nvals = 0; ml->sml_values[nvals].bv_val; nvals++ ) {
+                               for ( nvals = 0; !BER_BVISNULL( &ml->sml_values[nvals] ); nvals++ ) {
 #ifdef SLAP_ORDERED_PRETTYNORM
                                        rc = ordered_value_normalize(
                                                SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
@@ -811,7 +815,7 @@ void slap_timestamp( time_t *tm, struct berval *bv )
  */
 void slap_mods_opattrs(
        Operation *op,
-       Modifications *mods,
+       Modifications **modsp,
        int manage_ctxcsn )
 {
        struct berval name, timestamp, csn = BER_BVNULL;
@@ -830,12 +834,12 @@ void slap_mods_opattrs(
                } else {
                        csn = op->o_csn;
                }
-               ptr = strchr( csn.bv_val, '#' );
+               ptr = ber_bvchr( &csn, '#' );
                if ( ptr ) {
                        timestamp.bv_len = ptr - csn.bv_val;
-                       if ( timestamp.bv_len >= sizeof( timebuf ))
+                       if ( timestamp.bv_len >= sizeof( timebuf ))     /* ?!? */
                                timestamp.bv_len = sizeof( timebuf ) - 1;
-                       strncpy( timebuf, csn.bv_val, timestamp.bv_len );
+                       AC_MEMCPY( timebuf, csn.bv_val, timestamp.bv_len );
                        timebuf[timestamp.bv_len] = '\0';
                } else {
                        time_t now = slap_get_time();
@@ -853,9 +857,8 @@ void slap_mods_opattrs(
                        nname = op->o_ndn;
                }
 
-               for ( mod = mods; mod->sml_next; mod = mod->sml_next )
+               for ( modtail = modsp; *modtail; modtail = &(*modtail)->sml_next )
                        ;
-               modtail = &mod->sml_next;
 
                mod = (Modifications *) ch_malloc( sizeof( Modifications ) );
                mod->sml_op = LDAP_MOD_REPLACE;
@@ -873,7 +876,7 @@ void slap_mods_opattrs(
                modtail = &mod->sml_next;
        
                if ( get_manageDIT( op ) ) {
-                       for ( mod = mods; mod != modlast; mod = mod->sml_next ) {
+                       for ( mod = *modsp; mod != modlast; mod = mod->sml_next ) {
                                if ( mod->sml_desc == slap_schema.si_ad_modifiersName ) {
                                        break;
                                }
@@ -901,7 +904,7 @@ void slap_mods_opattrs(
                }
 
                if ( get_manageDIT( op ) ) {
-                       for ( mod = mods; mod != modlast; mod = mod->sml_next ) {
+                       for ( mod = *modsp; mod != modlast; mod = mod->sml_next ) {
                                if ( mod->sml_desc == slap_schema.si_ad_modifyTimestamp ) {
                                        break;
                                }