new rebind proc

new SASL locking
This commit is contained in:
Kurt Zeilenga 2001-06-15 00:14:56 +00:00
parent 5ac196e3f9
commit 5f25c10980
6 changed files with 51 additions and 16 deletions

View File

@ -16,11 +16,13 @@
#include <ac/ctype.h>
#include "ldap-int.h"
#ifdef LDAP_R_COMPILE
#include "ldap_pvt_thread.h"
#endif
#ifdef HAVE_CYRUS_SASL
#ifdef LDAP_R_COMPILE
ldap_pvt_thread_mutex_t ldap_int_sasl_mutex;
#endif
#include <sasl.h>
/*
@ -62,6 +64,8 @@ int ldap_int_sasl_init( void )
ldap_pvt_sasl_mutex_lock,
ldap_pvt_sasl_mutex_unlock,
ldap_pvt_sasl_mutex_dispose );
ldap_pvt_thread_mutex_init( &ldap_int_sasl_mutex );
#endif
if ( sasl_client_init( client_callbacks ) == SASL_OK ) {

View File

@ -397,7 +397,8 @@ void ldap_int_initialize_global_options( struct ldapoptions *gopts, int *dbglvl
gopts->ldo_defport = LDAP_PORT;
gopts->ldo_refhoplimit = LDAP_DEFAULT_REFHOPLIMIT;
gopts->ldo_rebindproc = NULL;
gopts->ldo_rebind_proc = NULL;
gopts->ldo_rebind_params = NULL;
LDAP_BOOL_ZERO(gopts);

View File

@ -147,7 +147,8 @@ struct ldapoptions {
LDAPControl **ldo_cctrls;
/* LDAP rebind callback function */
LDAP_REBIND_PROC *ldo_rebindproc;
LDAP_REBIND_PROC *ldo_rebind_proc;
void *ldo_rebind_params;
#ifdef HAVE_TLS
/* tls context */
@ -268,7 +269,8 @@ struct ldap {
#define ld_sctrls ld_options.ldo_sctrls
#define ld_cctrls ld_options.ldo_cctrls
#define ld_rebindproc ld_options.ldo_rebindproc
#define ld_rebind_proc ld_options.ldo_rebind_proc
#define ld_rebind_params ld_options.ldo_rebind_params
#define ld_version ld_options.ldo_version
@ -298,10 +300,17 @@ struct ldap {
};
#define LDAP_VALID(ld) ( (ld)->ld_valid == LDAP_VALID_SESSION )
#if defined(HAVE_RES_QUERY) && defined(LDAP_R_COMPILE)
#ifdef LDAP_R_COMPILE
#include <ldap_pvt_thread.h>
#ifdef HAVE_RES_QUERY
LDAP_V ( ldap_pvt_thread_mutex_t ) ldap_int_resolv_mutex;
#endif /* HAVE_RES_QUERY && LDAP_R_COMPILE */
#endif /* HAVE_RES_QUERY */
#ifdef HAVE_CYRUS_SASL
LDAP_V( ldap_pvt_thread_mutex_t ) ldap_int_sasl_mutex;
#endif
#endif
/*
* in init.c
@ -515,6 +524,7 @@ LDAP_F (void) ldap_free_urllist LDAP_P((
/*
* in cyrus.c
*/
LDAP_F (int) ldap_int_sasl_init LDAP_P(( void ));
LDAP_F (int) ldap_int_sasl_open LDAP_P((
@ -543,6 +553,7 @@ LDAP_F (int) ldap_int_sasl_bind LDAP_P((
LDAP_SASL_INTERACT_PROC *interact,
void *defaults ));
/*
* in tls.c
*/

View File

@ -17,6 +17,7 @@
#include "ldap-int.h"
#define LDAP_OPT_REBIND_PROC 0x4e814d
#define LDAP_OPT_REBIND_PARAMS 0x4e814e
static const LDAPAPIFeatureInfo features[] = {
#ifdef LDAP_API_FEATURE_X_OPENLDAP
@ -420,7 +421,10 @@ ldap_set_option(
/* Only accessed from inside this function by ldap_set_rebind_proc() */
case LDAP_OPT_REBIND_PROC: {
lo->ldo_rebindproc = (LDAP_REBIND_PROC *)invalue;
lo->ldo_rebind_proc = (LDAP_REBIND_PROC *)invalue;
} return LDAP_OPT_SUCCESS;
case LDAP_OPT_REBIND_PARAMS: {
lo->ldo_rebind_params = (void *)invalue;
} return LDAP_OPT_SUCCESS;
}
@ -593,7 +597,12 @@ ldap_set_option(
}
int
ldap_set_rebind_proc( LDAP *ld, LDAP_REBIND_PROC *rebind_proc)
ldap_set_rebind_proc( LDAP *ld, LDAP_REBIND_PROC *proc, void *params )
{
return( ldap_set_option( ld, LDAP_OPT_REBIND_PROC, (void *)rebind_proc));
int rc;
rc = ldap_set_option( ld, LDAP_OPT_REBIND_PROC, (void *)proc );
if( rc != LDAP_OPT_SUCCESS ) return rc;
rc = ldap_set_option( ld, LDAP_OPT_REBIND_PARAMS, (void *)params );
return rc;
}

View File

@ -289,7 +289,7 @@ ldap_new_connection( LDAP *ld, LDAPURLDesc *srvlist, int use_ldsb,
*/
lc->lconn_rebind_inprogress = 1;
/* V3 rebind function */
if ( ld->ld_rebindproc != NULL) {
if ( ld->ld_rebind_proc != NULL) {
LDAPURLDesc *srvfunc;
if( ( srvfunc = ldap_url_dup( srvlist)) == NULL) {
ld->ld_errno = LDAP_NO_MEMORY;
@ -299,8 +299,10 @@ ldap_new_connection( LDAP *ld, LDAPURLDesc *srvlist, int use_ldsb,
++lc->lconn_refcnt; /* avoid premature free */
ld->ld_defconn = lc;
Debug( LDAP_DEBUG_TRACE, "Call application rebindproc\n", 0, 0, 0);
err = (*ld->ld_rebindproc)( ld, bind->ri_url, bind->ri_request, bind->ri_msgid);
Debug( LDAP_DEBUG_TRACE, "Call application rebind_proc\n", 0, 0, 0);
err = (*ld->ld_rebind_proc)( ld,
bind->ri_url, bind->ri_request, bind->ri_msgid,
ld->ld_rebind_params);
ld->ld_defconn = savedefconn;
--lc->lconn_refcnt;

View File

@ -37,7 +37,6 @@
#include "ldap-int.h"
/*
* ldap_sasl_bind - bind to the ldap server (and X.500).
* The dn (usually NULL), mechanism, and credentials are provided.
@ -417,13 +416,17 @@ ldap_sasl_interactive_bind_s(
{
int rc;
#if defined( LDAP_R_COMPILE ) && defined( HAVE_CYRUS_SASL )
ldap_pvt_thread_mutex_lock( &ldap_int_sasl_mutex );
#endif
if( mechs == NULL || *mechs == '\0' ) {
char *smechs;
rc = ldap_pvt_sasl_getmechs( ld, &smechs );
if( rc != LDAP_SUCCESS ) {
return rc;
goto done;
}
Debug( LDAP_DEBUG_TRACE,
@ -442,5 +445,10 @@ ldap_sasl_interactive_bind_s(
serverControls, clientControls,
flags, interact, defaults );
done:
#if defined( LDAP_R_COMPILE ) && defined( HAVE_CYRUS_SASL )
ldap_pvt_thread_mutex_unlock( &ldap_int_sasl_mutex );
#endif
return rc;
}