]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/cyrus.c
Silence warning in print_deref(): cast lutil_b64_ntop() arg to unsigned char*
[openldap] / libraries / libldap / cyrus.c
index aad8f8ed8843a34ff4e9cadbdc7430c0d8f660d9..57d0304313c6da5b1f41ba10a476713e628e7108 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2008 The OpenLDAP Foundation.
+ * Copyright 1998-2009 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -446,16 +446,28 @@ ldap_int_sasl_bind(
        }
 
        {
-               char *saslhost = ldap_host_connected_to( ld->ld_defconn->lconn_sb,
+               char *saslhost;
+               int nocanon = (int)LDAP_BOOL_GET( &ld->ld_options,
+                       LDAP_BOOL_SASL_NOCANON );
+
+               /* If we don't need to canonicalize just use the host
+                * from the LDAP URI.
+                */
+               if ( nocanon )
+                       saslhost = ld->ld_defconn->lconn_server->lud_host;
+               else 
+                       saslhost = ldap_host_connected_to( ld->ld_defconn->lconn_sb,
                        "localhost" );
                rc = ldap_int_sasl_open( ld, ld->ld_defconn, saslhost );
-               LDAP_FREE( saslhost );
+               if ( !nocanon )
+                       LDAP_FREE( saslhost );
        }
 
        if ( rc != LDAP_SUCCESS ) return rc;
 
        ctx = ld->ld_defconn->lconn_sasl_authctx;
 
+#ifdef HAVE_TLS
        /* Check for TLS */
        ssl = ldap_pvt_tls_sb_ctx( ld->ld_defconn->lconn_sb );
        if ( ssl ) {
@@ -469,6 +481,7 @@ ldap_int_sasl_bind(
                (void) ldap_int_sasl_external( ld, ld->ld_defconn, authid.bv_val, fac );
                LDAP_FREE( authid.bv_val );
        }
+#endif
 
 #if !defined(_WIN32)
        /* Check for local */
@@ -996,6 +1009,9 @@ ldap_int_sasl_get_option( LDAP *ld, int option, void *arg )
                case LDAP_OPT_X_SASL_MAXBUFSIZE:
                        *(ber_len_t *)arg = ld->ld_options.ldo_sasl_secprops.maxbufsize;
                        break;
+               case LDAP_OPT_X_SASL_NOCANON:
+                       *(int *)arg = (int) LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_SASL_NOCANON );
+                       break;
 
                case LDAP_OPT_X_SASL_SECPROPS:
                        /* this option is write only */
@@ -1010,7 +1026,10 @@ ldap_int_sasl_get_option( LDAP *ld, int option, void *arg )
 int
 ldap_int_sasl_set_option( LDAP *ld, int option, void *arg )
 {
-       if ( ld == NULL || arg == NULL )
+       if ( ld == NULL )
+               return -1;
+
+       if ( arg == NULL && option != LDAP_OPT_X_SASL_NOCANON )
                return -1;
 
        switch ( option ) {
@@ -1063,6 +1082,13 @@ ldap_int_sasl_set_option( LDAP *ld, int option, void *arg )
        case LDAP_OPT_X_SASL_MAXBUFSIZE:
                ld->ld_options.ldo_sasl_secprops.maxbufsize = *(ber_len_t *)arg;
                break;
+       case LDAP_OPT_X_SASL_NOCANON:
+               if ( arg == LDAP_OPT_OFF ) {
+                       LDAP_BOOL_CLR(&ld->ld_options, LDAP_BOOL_SASL_NOCANON );
+               } else {
+                       LDAP_BOOL_SET(&ld->ld_options, LDAP_BOOL_SASL_NOCANON );
+               }
+               break;
 
        case LDAP_OPT_X_SASL_SECPROPS: {
                int sc;