X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmodify.c;h=7cb5b6f4524a8fe67c17a84a04e4a6a89a0ece1f;hb=1fbbc1181152a32c1b9b82342ad6d63034ec7fbb;hp=fcbe86a46c490b3d5c6efdcfa031096d4934a71d;hpb=0a2a381d07d47601f4df108a8c482b006e41e1f4;p=openldap diff --git a/servers/slapd/modify.c b/servers/slapd/modify.c index fcbe86a46c..7cb5b6f452 100644 --- a/servers/slapd/modify.c +++ b/servers/slapd/modify.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* @@ -16,6 +16,7 @@ */ #include "portable.h" +#include "slapi_common.h" #include @@ -27,6 +28,7 @@ #include "ldap_pvt.h" #include "slap.h" +#include "slapi.h" int do_modify( @@ -49,9 +51,10 @@ do_modify( const char *text; int manageDSAit; + Slapi_PBlock *pb = op->o_pb; + #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_ENTRY, - "do_modify: enter\n" )); + LDAP_LOG( OPERATION, ENTRY, "do_modify: enter\n", 0, 0, 0 ); #else Debug( LDAP_DEBUG_TRACE, "do_modify\n", 0, 0, 0 ); #endif @@ -77,8 +80,7 @@ do_modify( if ( ber_scanf( op->o_ber, "{m" /*}*/, &dn ) == LBER_ERROR ) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_ERR, - "do_modify: ber_scanf failed\n" )); + LDAP_LOG( OPERATION, ERR, "do_modify: ber_scanf failed\n", 0, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "do_modify: ber_scanf failed\n", 0, 0, 0 ); #endif @@ -89,8 +91,7 @@ do_modify( } #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_ARGS, - "do_modify: dn (%s)\n", dn.bv_val )); + LDAP_LOG( OPERATION, ARGS, "do_modify: dn (%s)\n", dn.bv_val, 0, 0 ); #else Debug( LDAP_DEBUG_ARGS, "do_modify: dn (%s)\n", dn.bv_val, 0, 0 ); #endif @@ -128,9 +129,9 @@ do_modify( case LDAP_MOD_ADD: if ( mod->sml_bvalues == NULL ) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_ERR, + LDAP_LOG( OPERATION, ERR, "do_modify: modify/add operation (%ld) requires values\n", - (long)mop )); + (long)mop, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "do_modify: modify/add operation (%ld) requires values\n", @@ -152,9 +153,8 @@ do_modify( default: { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_ERR, - "do_modify: invalid modify operation (%ld)\n", - (long)mop )); + LDAP_LOG( OPERATION, ERR, + "do_modify: invalid modify operation (%ld)\n", (long)mop, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "do_modify: invalid modify operation (%ld)\n", @@ -174,8 +174,7 @@ do_modify( if( (rc = get_ctrls( conn, op, 1 )) != LDAP_SUCCESS ) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_ERR, - "do_modify: get_ctrls failed\n" )); + LDAP_LOG( OPERATION, ERR, "do_modify: get_ctrls failed\n", 0, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "do_modify: get_ctrls failed\n", 0, 0, 0 ); #endif @@ -186,9 +185,8 @@ do_modify( rc = dnPrettyNormal( NULL, &dn, &pdn, &ndn ); if( rc != LDAP_SUCCESS ) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_INFO, - "do_modify: conn %d invalid dn (%s)\n", - conn->c_connid, dn.bv_val )); + LDAP_LOG( OPERATION, INFO, "do_modify: conn %d invalid dn (%s)\n", + conn->c_connid, dn.bv_val, 0 ); #else Debug( LDAP_DEBUG_ANY, "do_modify: invalid dn (%s)\n", dn.bv_val, 0, 0 ); @@ -200,8 +198,8 @@ do_modify( if( ndn.bv_len == 0 ) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_ERR, - "do_modify: attempt to modify root DSE.\n" )); + LDAP_LOG( OPERATION, ERR, + "do_modify: attempt to modify root DSE.\n",0, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "do_modify: root dse!\n", 0, 0, 0 ); #endif @@ -210,11 +208,10 @@ do_modify( NULL, "modify upon the root DSE not supported", NULL, NULL ); goto cleanup; -#if defined( SLAPD_SCHEMA_DN ) - } else if ( strcasecmp( ndn.bv_val, SLAPD_SCHEMA_DN ) == 0 ) { + } else if ( bvmatch( &ndn, &global_schemandn ) ) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_ERR, - "do_modify: attempt to modify subschema subentry.\n" )); + LDAP_LOG( OPERATION, ERR, + "do_modify: attempt to modify subschema subentry.\n" , 0, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "do_modify: subschema subentry!\n", 0, 0, 0 ); #endif @@ -223,36 +220,30 @@ do_modify( NULL, "modification of subschema subentry not supported", NULL, NULL ); goto cleanup; -#endif } #ifdef LDAP_DEBUG #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_DETAIL1, - "do_modify: modifications:\n" )); + LDAP_LOG( OPERATION, DETAIL1, "do_modify: modifications:\n", 0, 0, 0 ); #else Debug( LDAP_DEBUG_ARGS, "modifications:\n", 0, 0, 0 ); #endif for ( tmp = modlist; tmp != NULL; tmp = tmp->sml_next ) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_DETAIL1, - "\t%s: %s\n", tmp->sml_op == LDAP_MOD_ADD ? - "add" : (tmp->sml_op == LDAP_MOD_DELETE ? - "delete" : "replace"), tmp->sml_type.bv_val )); + LDAP_LOG( OPERATION, DETAIL1, "\t%s: %s\n", + tmp->sml_op == LDAP_MOD_ADD ? + "add" : (tmp->sml_op == LDAP_MOD_DELETE ? + "delete" : "replace"), tmp->sml_type.bv_val, 0 ); if ( tmp->sml_bvalues == NULL ) { - LDAP_LOG(( "operation", LDAP_LEVEL_DETAIL1, - "\t\tno values" )); + LDAP_LOG( OPERATION, DETAIL1, "\t\tno values", 0, 0, 0 ); } else if ( tmp->sml_bvalues[0].bv_val == NULL ) { - LDAP_LOG(( "operation", LDAP_LEVEL_DETAIL1, - "\t\tzero values" )); + LDAP_LOG( OPERATION, DETAIL1, "\t\tzero values", 0, 0, 0 ); } else if ( tmp->sml_bvalues[1].bv_val == NULL ) { - LDAP_LOG(( "operation", LDAP_LEVEL_DETAIL1, - "\t\tone value" )); + LDAP_LOG( OPERATION, DETAIL1, "\t\tone value", 0, 0, 0 ); } else { - LDAP_LOG(( "operation", LDAP_LEVEL_DETAIL1, - "\t\tmultiple values" )); + LDAP_LOG( OPERATION, DETAIL1, "\t\tmultiple values", 0, 0, 0 ); } #else @@ -278,8 +269,32 @@ do_modify( } #endif - Statslog( LDAP_DEBUG_STATS, "conn=%lu op=%lu MOD dn=\"%s\"\n", - op->o_connid, op->o_opid, dn.bv_val, 0, 0 ); + if ( StatslogTest( LDAP_DEBUG_STATS ) ) { + char abuf[BUFSIZ/2], *ptr = abuf; + int len = 0; + + Statslog( LDAP_DEBUG_STATS, "conn=%lu op=%lu MOD dn=\"%s\"\n", + op->o_connid, op->o_opid, dn.bv_val, 0, 0 ); + + for ( tmp = modlist; tmp != NULL; tmp = tmp->sml_next ) { + if (len + 1 + tmp->sml_type.bv_len > sizeof(abuf)) { + Statslog( LDAP_DEBUG_STATS, "conn=%lu op=%lu MOD attr=%s\n", + op->o_connid, op->o_opid, abuf, 0, 0 ); + len = 0; + ptr = abuf; + } + if (len) { + *ptr++ = ' '; + len++; + } + ptr = lutil_strcopy(ptr, tmp->sml_type.bv_val); + len += tmp->sml_type.bv_len; + } + if (len) { + Statslog( LDAP_DEBUG_STATS, "conn=%lu op=%lu MOD attr=%s\n", + op->o_connid, op->o_opid, abuf, 0, 0 ); + } + } manageDSAit = get_manageDSAit( op ); @@ -316,6 +331,32 @@ do_modify( /* deref suffix alias if appropriate */ suffix_alias( be, &ndn ); +#if defined( LDAP_SLAPI ) + slapi_pblock_set( pb, SLAPI_BACKEND, (void *)be ); + slapi_pblock_set( pb, SLAPI_CONNECTION, (void *)conn ); + slapi_pblock_set( pb, SLAPI_OPERATION, (void *)op ); + slapi_pblock_set( pb, SLAPI_BIND_TARGET, (void *)dn.bv_val ); + slapi_pblock_set( pb, SLAPI_REQCONTROLS, (void *)op->o_ctrls ); + slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)(1) ); + + rc = doPluginFNs( be, SLAPI_PLUGIN_PRE_MODIFY_FN, pb ); + if ( rc != 0 && rc != LDAP_OTHER ) { + /* + * either there is no preOp (modify) plugins + * or a plugin failed. Just log it + * + * FIXME: is this correct? + */ +#ifdef NEW_LOGGING + LDAP_LOG( OPERATION, INFO, "do_modify: modify preOps " + "failed\n", 0, 0, 0 ); +#else + Debug(LDAP_DEBUG_TRACE, "do_modify: modify preOps failed.\n", + 0, 0, 0); +#endif + } +#endif /* defined( LDAP_SLAPI ) */ + /* * do the modify if 1 && (2 || 3) * 1) there is a modify function implemented in this backend; @@ -393,6 +434,25 @@ do_modify( NULL, NULL ); } +#if defined( LDAP_SLAPI ) + rc = doPluginFNs( be, SLAPI_PLUGIN_POST_MODIFY_FN, pb ); + if ( rc != 0 && rc != LDAP_OTHER ) { + /* + * either there is no postOp (modify) plugins + * or a plugin failed. Just log it + * + * FIXME: is this correct? + */ +#ifdef NEW_LOGGING + LDAP_LOG( OPERATION, INFO, "do_modify: modify postOps " + "failed\n", 0, 0, 0 ); +#else + Debug(LDAP_DEBUG_TRACE, "do_modify: modify postOps " + "failed.\n", 0, 0, 0); +#endif + } +#endif /* defined( LDAP_SLAPI ) */ + cleanup: free( pdn.bv_val ); free( ndn.bv_val ); @@ -450,10 +510,10 @@ int slap_mods_check( return LDAP_UNDEFINED_TYPE; } - if( slap_ad_is_lang_range( ad )) { + if( slap_ad_is_tag_range( ad )) { /* attribute requires binary transfer */ snprintf( textbuf, textlen, - "%s: inappropriate use of language range option", + "%s: inappropriate use of tag range option", ml->sml_type.bv_val ); *text = textbuf; return LDAP_UNDEFINED_TYPE; @@ -558,8 +618,8 @@ int slap_mods_opattrs( char *textbuf, size_t textlen ) { struct berval name, timestamp, csn; - char timebuf[22]; - char csnbuf[64]; + char timebuf[ LDAP_LUTIL_GENTIME_BUFSIZE ]; + char csnbuf[ LDAP_LUTIL_CSNSTR_BUFSIZE ]; Modifications *mod; int mop = op->o_tag == LDAP_REQ_ADD @@ -574,7 +634,7 @@ int slap_mods_opattrs( ldap_pvt_thread_mutex_lock( &gmtime_mutex ); ltm = gmtime( &now ); - strftime( timebuf, sizeof(timebuf), "%Y%m%d%H%M%SZ", ltm ); + lutil_gentime( timebuf, sizeof(timebuf), ltm ); csn.bv_len = lutil_csnstr( csnbuf, sizeof( csnbuf ), 0, 0 ); ldap_pvt_thread_mutex_unlock( &gmtime_mutex ); @@ -600,22 +660,21 @@ int slap_mods_opattrs( if( rc != LDAP_SUCCESS ) { return rc; } - if ( tmpval.bv_len ) { - mod = (Modifications *) ch_malloc( sizeof( Modifications ) ); - mod->sml_op = mop; - mod->sml_type.bv_val = NULL; - mod->sml_desc = slap_schema.si_ad_structuralObjectClass; - mod->sml_bvalues = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); - ber_dupbv( &mod->sml_bvalues[0], &tmpval ); - mod->sml_bvalues[1].bv_val = NULL; - assert( mod->sml_bvalues[0].bv_val ); - *modtail = mod; - modtail = &mod->sml_next; - } + + mod = (Modifications *) ch_malloc( sizeof( Modifications ) ); + mod->sml_op = mop; + mod->sml_type.bv_val = NULL; + mod->sml_desc = slap_schema.si_ad_structuralObjectClass; + mod->sml_bvalues = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) ); + ber_dupbv( &mod->sml_bvalues[0], &tmpval ); + mod->sml_bvalues[1].bv_val = NULL; + assert( mod->sml_bvalues[0].bv_val ); + *modtail = mod; + modtail = &mod->sml_next; } if( SLAP_LASTMOD(be) ) { - char uuidbuf[40]; + char uuidbuf[ LDAP_LUTIL_UUIDSTR_BUFSIZE ]; tmpval.bv_len = lutil_uuidstr( uuidbuf, sizeof( uuidbuf ) ); tmpval.bv_val = uuidbuf;