/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2003-2006 The OpenLDAP Foundation.
+ * Copyright 2003-2007 The OpenLDAP Foundation.
* Portions Copyright 2003 Pierangelo Masarati.
* All rights reserved.
*
#include "rwm.h"
typedef struct rwm_op_state {
+ ber_tag_t r_tag;
struct berval ro_dn;
struct berval ro_ndn;
struct berval r_dn;
slap_callback *cb = op->o_callback;
rwm_op_state *ros = cb->sc_private;
- if ( rs->sr_type == REP_RESULT || op->o_abandon ||
- rs->sr_err == SLAPD_ABANDON ) {
+ if ( rs->sr_type == REP_RESULT || rs->sr_type == REP_EXTENDED ||
+ op->o_abandon || rs->sr_err == SLAPD_ABANDON ) {
op->o_req_dn = ros->ro_dn;
op->o_req_ndn = ros->ro_ndn;
if ( !BER_BVISEMPTY( &ros->r_dn )) ch_free( ros->r_dn.bv_val );
if ( !BER_BVISEMPTY( &ros->r_ndn )) ch_free( ros->r_ndn.bv_val );
- switch( op->o_tag ) {
+ switch( ros->r_tag ) {
case LDAP_REQ_COMPARE:
if ( op->orc_ava->aa_value.bv_val != ros->orc_ava->aa_value.bv_val )
op->o_tmpfree( op->orc_ava->aa_value.bv_val, op->o_tmpmemctx );
op->ors_filter = ros->ors_filter;
op->ors_filterstr = ros->ors_filterstr;
break;
+ case LDAP_REQ_EXTENDED:
+ if ( op->ore_reqdata != ros->ore_reqdata ) {
+ ber_bvfree( op->ore_reqdata );
+ op->ore_reqdata = ros->ore_reqdata;
+ }
+ break;
default: break;
}
op->o_callback = op->o_callback->sc_next;
roc->cb.sc_response = NULL;
roc->cb.sc_next = op->o_callback;
roc->cb.sc_private = &roc->ros;
+ roc->ros.r_tag = op->o_tag;
roc->ros.ro_dn = op->o_req_dn;
roc->ros.ro_ndn = op->o_req_ndn;
roc->ros.o_request = op->o_request;
struct berval id = BER_BVNULL,
pwold = BER_BVNULL,
pwnew = BER_BVNULL;
+ BerElement *ber = NULL;
if ( !BER_BVISNULL( &op->o_req_ndn ) ) {
return LDAP_SUCCESS;
return -1;
}
- /* TODO: re-encode the request with the massaged DN */
+ ber = ber_alloc_t( LBER_USE_DER );
+ if ( !ber ) {
+ rs->sr_err = LDAP_OTHER;
+ rs->sr_text = "No memory";
+ return rs->sr_err;
+ }
+ ber_printf( ber, "{" );
+ if ( !BER_BVISNULL( &id )) {
+ ber_printf( ber, "tO", LDAP_TAG_EXOP_MODIFY_PASSWD_ID,
+ &op->o_req_dn );
+ }
+ if ( !BER_BVISNULL( &pwold )) {
+ ber_printf( ber, "tO", LDAP_TAG_EXOP_MODIFY_PASSWD_OLD, &pwold );
+ }
+ if ( !BER_BVISNULL( &pwnew )) {
+ ber_printf( ber, "tO", LDAP_TAG_EXOP_MODIFY_PASSWD_NEW, &pwnew );
+ }
+ ber_printf( ber, "N}" );
+ ber_flatten( ber, &op->ore_reqdata );
+ ber_free( ber, 1 );
op->o_callback = &roc->cb;
BackendDB *be )
{
slap_overinst *on = (slap_overinst *) be->bd_info;
- struct ldapmapping *mapping = NULL;
struct ldaprwmap *rwmap;
#ifdef ENABLE_REWRITE
char *rargv[ 3 ];
rewrite_parse( rwmap->rwm_rw, "<suffix massage>", 2, 2, rargv );
#endif /* ENABLE_REWRITE */
- if ( rwm_map_init( &rwmap->rwm_oc, &mapping ) != LDAP_SUCCESS ||
- rwm_map_init( &rwmap->rwm_at, &mapping ) != LDAP_SUCCESS )
- {
- rc = 1;
- goto error_return;
- }
-
error_return:;
on->on_bi.bi_private = (void *)rwmap;