/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1999-2003 The OpenLDAP Foundation.
+ * Copyright 1999-2004 The OpenLDAP Foundation.
* Portions Copyright 2001-2003 Pierangelo Masarati.
* Portions Copyright 1999-2003 Howard Chu.
* All rights reserved.
ber_int_t msgid;
dncookie dc;
struct metasingleconn *lsc = &lc->conns[ candidate ];
+ LDAPMessage *res;
/*
* Rewrite the bind dn if needed
dc.rwmap = &li->targets[ candidate ]->rwmap;
dc.conn = op->o_conn;
dc.rs = rs;
- dc.ctx = "bindDn";
+ dc.ctx = "bindDN";
if ( ldap_back_dn_massage( &dc, &op->o_req_dn, &mdn ) ) {
send_ldap_result( op, rs );
goto return_results;
}
}
-
- rs->sr_err = ldap_sasl_bind(lsc->ld, mdn.bv_val,
+
+ /* FIXME: this fixes the bind problem right now; we need
+ * to use the asynchronous version to get the "matched"
+ * and more in case of failure ... */
+ rs->sr_err = ldap_sasl_bind_s(lsc->ld, mdn.bv_val,
LDAP_SASL_SIMPLE, &op->oq_bind.rb_cred,
- op->o_ctrls, NULL, &msgid);
+ op->o_ctrls, NULL, NULL);
if ( rs->sr_err != LDAP_SUCCESS ) {
rs->sr_err = ldap_back_map_result( rs );
+ goto return_results;
+ }
- } else {
- /*
- * FIXME: handle response!!!
- */
- if ( lsc->bound_dn.bv_val != NULL ) {
- ber_memfree( lsc->bound_dn.bv_val );
- }
- ber_dupbv( &lsc->bound_dn, &op->o_req_dn );
- lsc->bound = META_BOUND;
- lc->bound_target = candidate;
-
- if ( li->savecred ) {
- if ( lsc->cred.bv_val ) {
- memset( lsc->cred.bv_val, 0, lsc->cred.bv_len );
- ber_memfree( lsc->cred.bv_val );
- }
- ber_dupbv( &lsc->cred, &op->oq_bind.rb_cred );
- ldap_set_rebind_proc( lsc->ld, meta_back_rebind, lsc );
- }
+ /*
+ * FIXME: handle response!!!
+ */
+ if ( lsc->bound_dn.bv_val != NULL ) {
+ ber_memfree( lsc->bound_dn.bv_val );
+ }
+ ber_dupbv( &lsc->bound_dn, &op->o_req_dn );
+ lsc->bound = META_BOUND;
+ lc->bound_target = candidate;
- if ( li->cache.ttl != META_DNCACHE_DISABLED
- && op->o_req_ndn.bv_len != 0 ) {
- ( void )meta_dncache_update_entry( &li->cache,
- &op->o_req_ndn, candidate );
+ if ( li->savecred ) {
+ if ( lsc->cred.bv_val ) {
+ memset( lsc->cred.bv_val, 0, lsc->cred.bv_len );
+ ber_memfree( lsc->cred.bv_val );
}
+ ber_dupbv( &lsc->cred, &op->oq_bind.rb_cred );
+ ldap_set_rebind_proc( lsc->ld, meta_back_rebind, lsc );
+ }
+
+ if ( li->cache.ttl != META_DNCACHE_DISABLED
+ && op->o_req_ndn.bv_len != 0 ) {
+ ( void )meta_dncache_update_entry( &li->cache,
+ &op->o_req_ndn, candidate );
}
return_results:;
}
for ( i = 0, lsc = lc->conns; !META_LAST(lsc); ++i, ++lsc ) {
- int rc;
+ int rc;
+ struct berval cred = BER_BVC("");
/*
* Not a candidate or something wrong with this target ...
lsc->cred.bv_len = 0;
}
- rc = ldap_bind_s( lsc->ld, 0, NULL, LDAP_AUTH_SIMPLE );
+ rc = ldap_sasl_bind_s(lsc->ld, "", LDAP_SASL_SIMPLE, &cred,
+ op->o_ctrls, NULL, NULL);
if ( rc != LDAP_SUCCESS ) {
#ifdef NEW_LOGGING
struct metasingleconn *lsc;
char *rmsg = NULL;
char *rmatch = NULL;
+ int free_rmsg = 0, free_rmatch = 0;
for ( i = 0, lsc = lc->conns; !META_LAST(lsc); ++i, ++lsc ) {
char *msg = NULL;
switch ( rs->sr_err ) {
default:
rerr = rs->sr_err;
+ if ( rmsg ) {
+ ber_memfree( rmsg );
+ }
rmsg = msg;
+ free_rmsg = 1;
msg = NULL;
+ if ( rmatch ) {
+ ber_memfree( rmatch );
+ }
rmatch = match;
+ free_rmatch = 1;
match = NULL;
break;
}
rs->sr_text = rmsg;
rs->sr_matched = rmatch;
send_ldap_result( op, rs );
+ if ( free_rmsg ) {
+ ber_memfree( rmsg );
+ }
+ if ( free_rmatch ) {
+ ber_memfree( rmatch );
+ }
rs->sr_text = NULL;
rs->sr_matched = NULL;