X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fopen.c;h=d8b1aaeb55dcc0ccce14a7bd1650f13eaf1ebf98;hb=7573a81efea63bc0e07d88ba4c9b6973d51d857d;hp=13dd87ce84f665d1c1d16062ed849d20515dc882;hpb=83e2f3854300453c1cba7d1f9022cd396d41d7d8;p=openldap diff --git a/libraries/libldap/open.c b/libraries/libldap/open.c index 13dd87ce84..d8b1aaeb55 100644 --- a/libraries/libldap/open.c +++ b/libraries/libldap/open.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* Portions @@ -13,6 +13,7 @@ #include "portable.h" #include +#include #include @@ -25,7 +26,7 @@ int ldap_open_defconn( LDAP *ld ) { - if (( ld->ld_defconn = ldap_new_connection( ld, ld->ld_options.ldo_defludp, 1,1,0 )) == NULL ) + if (( ld->ld_defconn = ldap_new_connection( ld, ld->ld_options.ldo_defludp, 1,1,NULL )) == NULL ) { ld->ld_errno = LDAP_SERVER_DOWN; return -1; @@ -72,38 +73,6 @@ ldap_open( LDAP_CONST char *host, int port ) } -/* - * ldap_init - initialize the LDAP library. A magic cookie to be used for - * future communication is returned on success, NULL on failure. - * "host" may be a space-separated list of hosts or IP addresses - * - * Example: - * LDAP *ld; - * ld = ldap_open( host, port ); - */ -LDAP * -ldap_init( LDAP_CONST char *defhost, int defport ) -{ - LDAP *ld; - int rc; - - rc = ldap_create(&ld); - if ( rc != LDAP_SUCCESS ) - return NULL; - - if (defport != 0) - ld->ld_options.ldo_defport = defport; - - if (defhost != NULL) { - rc = ldap_set_option(ld, LDAP_OPT_HOST_NAME, defhost); - if ( rc != LDAP_SUCCESS ) { - ldap_ld_free(ld, 1, NULL, NULL); - return NULL; - } - } - - return( ld ); -} int ldap_create( LDAP **ldp ) @@ -112,7 +81,7 @@ ldap_create( LDAP **ldp ) *ldp = NULL; if( ldap_int_global_options.ldo_valid != LDAP_INITIALIZED ) { - ldap_int_initialize(); + ldap_int_initialize(NULL); } Debug( LDAP_DEBUG_TRACE, "ldap_init\n", 0, 0, 0 ); @@ -186,22 +155,52 @@ ldap_create( LDAP **ldp ) ld->ld_lberoptions = LBER_USE_DER; -#if defined( STR_TRANSLATION ) && defined( LDAP_DEFAULT_CHARSET ) - ld->ld_lberoptions |= LBER_TRANSLATE_STRINGS; -#if LDAP_CHARSET_8859 == LDAP_DEFAULT_CHARSET - ldap_set_string_translators( ld, ldap_8859_to_t61, ldap_t61_to_8859 ); -#endif /* LDAP_CHARSET_8859 == LDAP_DEFAULT_CHARSET */ -#endif /* STR_TRANSLATION && LDAP_DEFAULT_CHARSET */ - - /* we'll assume we're talking version 2 for now */ - ld->ld_version = LDAP_VERSION2; - - ber_pvt_sb_init( &(ld->ld_sb) ); + ld->ld_sb = ber_sockbuf_alloc( ); + if ( ld->ld_sb == NULL ) { + ldap_free_urllist( ld->ld_options.ldo_defludp ); + LDAP_FREE( (char*) ld ); + WSACleanup( ); + return LDAP_NO_MEMORY; + } *ldp = ld; return LDAP_SUCCESS; } +/* + * ldap_init - initialize the LDAP library. A magic cookie to be used for + * future communication is returned on success, NULL on failure. + * "host" may be a space-separated list of hosts or IP addresses + * + * Example: + * LDAP *ld; + * ld = ldap_open( host, port ); + */ +LDAP * +ldap_init( LDAP_CONST char *defhost, int defport ) +{ + LDAP *ld; + int rc; + + rc = ldap_create(&ld); + if ( rc != LDAP_SUCCESS ) + return NULL; + + if (defport != 0) + ld->ld_options.ldo_defport = defport; + + if (defhost != NULL) { + rc = ldap_set_option(ld, LDAP_OPT_HOST_NAME, defhost); + if ( rc != LDAP_SUCCESS ) { + ldap_ld_free(ld, 1, NULL, NULL); + return NULL; + } + } + + return( ld ); +} + + int ldap_initialize( LDAP **ldp, LDAP_CONST char *url ) { @@ -225,11 +224,49 @@ ldap_initialize( LDAP **ldp, LDAP_CONST char *url ) return LDAP_SUCCESS; } +int +ldap_start_tls ( LDAP *ld, + LDAPControl **serverctrls, + LDAPControl **clientctrls ) +{ +#ifdef HAVE_TLS + LDAPConn *lc; + int rc; + char *rspoid = NULL; + struct berval *rspdata = NULL; + + if (ld->ld_conns == NULL) { + rc = ldap_open_defconn( ld ); + if (rc != LDAP_SUCCESS) + return(rc); + } + + for (lc = ld->ld_conns; lc != NULL; lc = lc->lconn_next) { + if (ldap_pvt_tls_inplace(lc->lconn_sb) != 0) + return LDAP_OPERATIONS_ERROR; + rc = ldap_extended_operation_s(ld, LDAP_EXOP_START_TLS, + NULL, serverctrls, clientctrls, &rspoid, &rspdata); + if (rc != LDAP_SUCCESS) + return rc; + if (rspoid != NULL) + LDAP_FREE(rspoid); + if (rspdata != NULL) + ber_bvfree(rspdata); + rc = ldap_pvt_tls_start( ld, lc->lconn_sb, ld->ld_options.ldo_tls_ctx ); + if (rc != LDAP_SUCCESS) + return rc; + } + return LDAP_SUCCESS; +#else + return LDAP_NOT_SUPPORTED; +#endif +} + int open_ldap_connection( LDAP *ld, Sockbuf *sb, LDAPURLDesc *srv, char **krbinstancep, int async ) { - int rc = -1; + int rc = -1; int port; long addr; @@ -241,42 +278,66 @@ open_ldap_connection( LDAP *ld, Sockbuf *sb, LDAPURLDesc *srv, port = htons( (short) port ); addr = 0; - if ( srv->lud_host == NULL ) + if ( srv->lud_host == NULL || *srv->lud_host == 0 ) addr = htonl( INADDR_LOOPBACK ); - rc = ldap_connect_to_host( ld, sb, srv->lud_host, addr, port, async ); - if ( rc == -1 ) { - return( rc ); + switch ( srv->lud_protocol ) { + case LDAP_PROTO_TCP: + rc = ldap_connect_to_host( ld, sb, srv->lud_host, + addr, port, async ); + if ( rc == -1 ) + return rc; + ber_sockbuf_add_io( sb, &ber_sockbuf_io_tcp, + LBER_SBIOD_LEVEL_PROVIDER, NULL ); + break; + case LDAP_PROTO_UDP: + rc = ldap_connect_to_host( ld, sb, srv->lud_host, + addr, port, async ); + if ( rc == -1 ) + return rc; + ber_sockbuf_add_io( sb, &ber_sockbuf_io_udp, + LBER_SBIOD_LEVEL_PROVIDER, NULL ); + break; +#ifdef LDAP_PF_LOCAL + case LDAP_PROTO_LOCAL: + rc = ldap_connect_to_path( ld, sb, srv->lud_host, + async ); + if ( rc == -1 ) + return rc; + ber_sockbuf_add_io( sb, &ber_sockbuf_io_fd, + LBER_SBIOD_LEVEL_PROVIDER, NULL ); + break; +#endif /* LDAP_PF_LOCAL */ + default: + return -1; + break; } - - ber_pvt_sb_set_io( sb, &ber_pvt_sb_io_tcp, NULL ); + + ber_sockbuf_add_io( sb, &ber_sockbuf_io_readahead, + LBER_SBIOD_LEVEL_PROVIDER, NULL ); +#ifdef LDAP_DEBUG + ber_sockbuf_add_io( sb, &ber_sockbuf_io_debug, INT_MAX, NULL ); +#endif #ifdef HAVE_TLS - if ( ld->ld_options.ldo_tls_mode == LDAP_OPT_X_TLS_HARD - || srv->lud_ldaps != 0 ) - { - /* - * Fortunately, the lib uses blocking io... - */ - if ( ldap_pvt_tls_connect( sb, ld->ld_options.ldo_tls_ctx ) < - 0 ) { - return -1; - } - /* FIXME: hostname of server must be compared with name in - * certificate.... - */ + if (ld->ld_options.ldo_tls_mode == LDAP_OPT_X_TLS_HARD || + (srv->lud_properties & LDAP_URL_USE_SSL)) { + rc = ldap_pvt_tls_start( ld, sb, ld->ld_options.ldo_tls_ctx ); + if (rc != LDAP_SUCCESS) + return rc; } #endif + if ( krbinstancep != NULL ) { -#ifdef HAVE_KERBEROS +#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND char *c; if (( *krbinstancep = ldap_host_connected_to( sb )) != NULL && ( c = strchr( *krbinstancep, '.' )) != NULL ) { *c = '\0'; } -#else /* HAVE_KERBEROS */ - krbinstancep = NULL; -#endif /* HAVE_KERBEROS */ +#else /* LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND */ + *krbinstancep = NULL; +#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND */ } return( 0 );