version 1.81, 2010/10/13 06:43:16
|
version 1.82, 2010/10/13 23:29:32
|
Line 1
|
Line 1
|
/* $OpenLDAP: pkg/ldap/libraries/libldap/sasl.c,v 1.80 2010/09/12 08:09:45 hyc Exp $ */ |
/* $OpenLDAP: pkg/ldap/libraries/libldap/sasl.c,v 1.81 2010/10/13 06:43:16 hyc Exp $ */ |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
* |
* |
* Copyright 1998-2010 The OpenLDAP Foundation. |
* Copyright 1998-2010 The OpenLDAP Foundation. |
Line 401 ldap_pvt_sasl_getmechs ( LDAP *ld, char
|
Line 401 ldap_pvt_sasl_getmechs ( LDAP *ld, char
|
} |
} |
|
|
/* |
/* |
* ldap_sasl_interactive_bind_s - interactive SASL authentication |
* ldap_sasl_interactive_bind - interactive SASL authentication |
* |
* |
* This routine uses interactive callbacks. |
* This routine uses interactive callbacks. |
* |
* |
* LDAP_SUCCESS is returned upon success, the ldap error code |
* LDAP_SUCCESS is returned upon success, the ldap error code |
* otherwise. |
* otherwise. LDAP_SASL_BIND_IN_PROGRESS is returned if further |
|
* calls are needed. |
*/ |
*/ |
int |
int |
ldap_sasl_interactive_bind_s( |
ldap_sasl_interactive_bind( |
LDAP *ld, |
LDAP *ld, |
LDAP_CONST char *dn, /* usually NULL */ |
LDAP_CONST char *dn, /* usually NULL */ |
LDAP_CONST char *mechs, |
LDAP_CONST char *mechs, |
Line 417 ldap_sasl_interactive_bind_s(
|
Line 418 ldap_sasl_interactive_bind_s(
|
LDAPControl **clientControls, |
LDAPControl **clientControls, |
unsigned flags, |
unsigned flags, |
LDAP_SASL_INTERACT_PROC *interact, |
LDAP_SASL_INTERACT_PROC *interact, |
void *defaults ) |
void *defaults, |
|
LDAPMessage *result, |
|
const char **rmech, |
|
int *msgid ) |
{ |
{ |
int rc; |
|
char *smechs = NULL; |
char *smechs = NULL; |
|
int rc; |
|
|
#if defined( HAVE_CYRUS_SASL ) |
#if defined( HAVE_CYRUS_SASL ) |
LDAP_MUTEX_LOCK( &ldap_int_sasl_mutex ); |
LDAP_MUTEX_LOCK( &ldap_int_sasl_mutex ); |
Line 437 ldap_sasl_interactive_bind_s(
|
Line 441 ldap_sasl_interactive_bind_s(
|
} else |
} else |
#endif |
#endif |
|
|
|
/* First time */ |
|
if ( !result ) { |
|
|
#ifdef HAVE_CYRUS_SASL |
#ifdef HAVE_CYRUS_SASL |
if( mechs == NULL || *mechs == '\0' ) { |
if( mechs == NULL || *mechs == '\0' ) { |
mechs = ld->ld_options.ldo_def_sasl_mech; |
mechs = ld->ld_options.ldo_def_sasl_mech; |
Line 460 ldap_sasl_interactive_bind_s(
|
Line 467 ldap_sasl_interactive_bind_s(
|
"ldap_sasl_interactive_bind_s: user selected: %s\n", |
"ldap_sasl_interactive_bind_s: user selected: %s\n", |
mechs, 0, 0 ); |
mechs, 0, 0 ); |
} |
} |
|
} |
rc = ldap_int_sasl_bind( ld, dn, mechs, |
rc = ldap_int_sasl_bind( ld, dn, mechs, |
serverControls, clientControls, |
serverControls, clientControls, |
flags, interact, defaults ); |
flags, interact, defaults, result, rmech, msgid ); |
|
|
done: |
done: |
#if defined( HAVE_CYRUS_SASL ) |
#if defined( HAVE_CYRUS_SASL ) |
Line 473 done:
|
Line 480 done:
|
|
|
return rc; |
return rc; |
} |
} |
|
|
|
/* |
|
* ldap_sasl_interactive_bind_s - interactive SASL authentication |
|
* |
|
* This routine uses interactive callbacks. |
|
* |
|
* LDAP_SUCCESS is returned upon success, the ldap error code |
|
* otherwise. |
|
*/ |
|
int |
|
ldap_sasl_interactive_bind_s( |
|
LDAP *ld, |
|
LDAP_CONST char *dn, /* usually NULL */ |
|
LDAP_CONST char *mechs, |
|
LDAPControl **serverControls, |
|
LDAPControl **clientControls, |
|
unsigned flags, |
|
LDAP_SASL_INTERACT_PROC *interact, |
|
void *defaults ) |
|
{ |
|
const char *rmech = NULL; |
|
LDAPMessage *result = NULL; |
|
int rc, msgid; |
|
|
|
do { |
|
rc = ldap_sasl_interactive_bind( ld, dn, mechs, |
|
serverControls, clientControls, |
|
flags, interact, defaults, result, &rmech, &msgid ); |
|
|
|
if ( rc != LDAP_SASL_BIND_IN_PROGRESS ) |
|
break; |
|
|
|
#ifdef LDAP_CONNECTIONLESS |
|
if (LDAP_IS_UDP(ld)) { |
|
break; |
|
} |
|
#endif |
|
|
|
if ( ldap_result( ld, msgid, LDAP_MSG_ALL, NULL, &result ) == -1 || !result ) { |
|
return( ld->ld_errno ); /* ldap_result sets ld_errno */ |
|
} |
|
} while ( rc == LDAP_SASL_BIND_IN_PROGRESS ); |
|
|
|
return rc; |
|
} |
|
|
#ifdef HAVE_CYRUS_SASL |
#ifdef HAVE_CYRUS_SASL |
|
|