X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-ldap%2Fmodify.c;h=a59d4179ca27452be7703eb4faf90a7844f364ed;hb=a9097044ea91333c5b01939882cd452400fd7231;hp=ff9ac9f6d85096236acbaa94334ecd56c895e090;hpb=c55a82baa24abc4fa63b7dc50de2d3758d69514b;p=openldap diff --git a/servers/slapd/back-ldap/modify.c b/servers/slapd/back-ldap/modify.c index ff9ac9f6d8..a59d4179ca 100644 --- a/servers/slapd/back-ldap/modify.c +++ b/servers/slapd/back-ldap/modify.c @@ -24,6 +24,15 @@ * ever read sources, credits should appear in the documentation. * * 4. This notice may not be removed or altered. + * + * + * + * Copyright 2000, Pierangelo Masarati, All rights reserved. + * + * This software is being modified by Pierangelo Masarati. + * The previously reported conditions apply to the modified code as well. + * Changes in the original code are highlighted where required. + * Credits for the original code go to the author, Howard Chu. */ #include "portable.h" @@ -52,40 +61,97 @@ ldap_back_modify( LDAPMod *mods; Modifications *ml; int i; + char *mdn = NULL, *mapped; lc = ldap_back_getconn(li, conn, op); - if (!lc) + if ( !lc || !ldap_back_dobind( lc, op ) ) { + return( -1 ); + } + + /* + * Rewrite the modify dn, if needed + */ +#ifdef ENABLE_REWRITE + switch ( rewrite_session( li->rwinfo, "modifyDn", dn, conn, &mdn ) ) { + case REWRITE_REGEXEC_OK: + if ( mdn == NULL ) { + mdn = ( char * )dn; + } +#ifdef NEW_LOGGING + LDAP_LOG(( "backend", LDAP_LEVEL_DETAIL1, + "[rw] modifyDn: \"%s\" -> \"%s\"\n", dn, mdn )); +#else /* !NEW_LOGGING */ + Debug( LDAP_DEBUG_ARGS, "rw> modifyDn: \"%s\" -> \"%s\"\n%s", + dn, mdn, "" ); +#endif /* !NEW_LOGGING */ + break; + + case REWRITE_REGEXEC_UNWILLING: + send_ldap_result( conn, op, LDAP_UNWILLING_TO_PERFORM, + NULL, "Unwilling to perform", NULL, NULL ); return( -1 ); - if (!lc->bound) { - ldap_back_dobind(lc, op); - if (!lc->bound) - return( -1 ); + case REWRITE_REGEXEC_ERR: + send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, + NULL, "Operations error", NULL, NULL ); + return( -1 ); } +#else /* !ENABLE_REWRITE */ + mdn = ldap_back_dn_massage( li, ch_strdup( dn ), 0 ); +#endif /* !ENABLE_REWRITE */ for (i=0, ml=modlist; ml; i++,ml=ml->sml_next) ; mods = (LDAPMod *)ch_malloc(i*sizeof(LDAPMod)); - if (mods == NULL) - return( -1 ); + if (mods == NULL) { + goto cleanup; + } modv = (LDAPMod **)ch_malloc((i+1)*sizeof(LDAPMod *)); if (modv == NULL) { - free(mods); - return( -1 ); + goto cleanup; } - modv[i] = 0; + for (i=0, ml=modlist; ml; ml=ml->sml_next) { + mapped = ldap_back_map(&li->at_map, ml->sml_desc->ad_cname->bv_val, 0); + if (mapped == NULL) { + continue; + } - for (i=0, ml=modlist; ml; i++, ml=ml->sml_next) { modv[i] = &mods[i]; - mods[i].mod_op = ml->sml_op; - mods[i].mod_type = ml->sml_desc->ad_cname->bv_val; + mods[i].mod_op = ml->sml_op | LDAP_MOD_BVALUES; + mods[i].mod_type = mapped; + +#ifdef ENABLE_REWRITE + /* + * FIXME: dn-valued attrs should be rewritten + * to allow their use in ACLs at the back-ldap + * level. + */ + if ( strcmp( ml->sml_desc->ad_type->sat_syntax->ssyn_oid, + SLAPD_DN_SYNTAX ) == 0 ) { + ldap_dnattr_rewrite( li->rwinfo, + ml->sml_bvalues, conn ); + } +#endif /* ENABLE_REWRITE */ + mods[i].mod_bvalues = ml->sml_bvalues; + i++; } + modv[i] = 0; - ldap_modify_s( lc->ld, dn, modv ); - free(mods); - free(modv); + ldap_modify_s( lc->ld, mdn, modv ); + +cleanup:; +#ifdef ENABLE_REWRITE + if ( mdn != dn ) { +#endif /* ENABLE_REWRITE */ + free( mdn ); +#ifdef ENABLE_REWRITE + } +#endif /* ENABLE_REWRITE */ + free(mods); + free(modv); return( ldap_back_op_result( lc, op )); } +