make slap_sasl_open() comply with URL notation for IPv6 addresses

This commit is contained in:
Pierangelo Masarati 2006-12-15 02:01:58 +00:00
parent 5e3d7a55dc
commit 917fbf427a

View File

@ -1048,6 +1048,42 @@ int slap_sasl_destroy( void )
return 0; return 0;
} }
#if SASL_VERSION_MAJOR >= 2
static char *
slap_sasl_peer2ipport( struct berval *peer )
{
int isv6 = 0;
char *ipport,
*p = &peer->bv_val[ STRLENOF( "IP=" ) ];
ber_len_t plen = peer->bv_len - STRLENOF( "IP=" );
/* IPv6? */
if ( p[0] == '[' ) {
isv6 = 1;
plen--;
}
ipport = ch_strdup( &p[isv6] );
/* Convert IPv6/IPv4 addresses to address;port syntax. */
p = strrchr( ipport, ':' );
if ( p != NULL ) {
*p = ';';
if ( isv6 ) {
assert( p[-1] == ']' );
AC_MEMCPY( &p[-1], p, plen - ( p - ipport ) + 1 );
}
} else if ( isv6 ) {
/* trim ']' */
plen--;
assert( p[plen] == ']' );
p[plen] = '\0';
}
return ipport;
}
#endif
int slap_sasl_open( Connection *conn, int reopen ) int slap_sasl_open( Connection *conn, int reopen )
{ {
int sc = LDAP_SUCCESS; int sc = LDAP_SUCCESS;
@ -1109,31 +1145,17 @@ int slap_sasl_open( Connection *conn, int reopen )
/* create new SASL context */ /* create new SASL context */
#if SASL_VERSION_MAJOR >= 2 #if SASL_VERSION_MAJOR >= 2
if ( conn->c_sock_name.bv_len != 0 && if ( conn->c_sock_name.bv_len != 0 &&
strncmp( conn->c_sock_name.bv_val, "IP=", 3 ) == 0) { strncmp( conn->c_sock_name.bv_val, "IP=", STRLENOF( "IP=" ) ) == 0 )
char *p; {
iplocalport = slap_sasl_peer2ipport( &conn->c_sock_name );
iplocalport = ch_strdup( conn->c_sock_name.bv_val + 3 );
/* Convert IPv6 addresses to address;port syntax. */
p = strrchr( iplocalport, ' ' );
/* Convert IPv4 addresses to address;port syntax. */
if ( p == NULL ) p = strchr( iplocalport, ':' );
if ( p != NULL ) {
*p = ';';
}
} }
if ( conn->c_peer_name.bv_len != 0 && if ( conn->c_peer_name.bv_len != 0 &&
strncmp( conn->c_peer_name.bv_val, "IP=", 3 ) == 0) { strncmp( conn->c_peer_name.bv_val, "IP=", STRLENOF( "IP=" ) ) == 0 )
char *p; {
ipremoteport = slap_sasl_peer2ipport( &conn->c_peer_name );
ipremoteport = ch_strdup( conn->c_peer_name.bv_val + 3 );
/* Convert IPv6 addresses to address;port syntax. */
p = strrchr( ipremoteport, ' ' );
/* Convert IPv4 addresses to address;port syntax. */
if ( p == NULL ) p = strchr( ipremoteport, ':' );
if ( p != NULL ) {
*p = ';';
}
} }
sc = sasl_server_new( "ldap", global_host, global_realm, sc = sasl_server_new( "ldap", global_host, global_realm,
iplocalport, ipremoteport, session_callbacks, SASL_SUCCESS_DATA, &ctx ); iplocalport, ipremoteport, session_callbacks, SASL_SUCCESS_DATA, &ctx );
if ( iplocalport != NULL ) { if ( iplocalport != NULL ) {