]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/url.c
Don't pass NULL hostname to ldap_pvt_tls_check_hostname, use "localhost"
[openldap] / libraries / libldap / url.c
index ccb7eca61335ca6267887896b1fc4b84be3467d0..adc08c9b48951ee2fc7f9791ce58b00064f1ef8d 100644 (file)
@@ -153,8 +153,7 @@ skip_url_prefix(
        }
 
        /* skip leading "URL:" (if any) */
-       if ( strncasecmp( p, LDAP_URL_URLCOLON, LDAP_URL_URLCOLON_LEN ) == 0 )
-       {
+       if ( strncasecmp( p, LDAP_URL_URLCOLON, LDAP_URL_URLCOLON_LEN ) == 0 ) {
                p += LDAP_URL_URLCOLON_LEN;
        }
 
@@ -209,7 +208,7 @@ static int str2scope( const char *p )
 
 
 int
-ldap_url_parse( LDAP_CONST char *url_in, LDAPURLDesc **ludpp )
+ldap_url_parse_ext( LDAP_CONST char *url_in, LDAPURLDesc **ludpp )
 {
 /*
  *  Pick apart the pieces of an LDAP URL.
@@ -222,7 +221,7 @@ ldap_url_parse( LDAP_CONST char *url_in, LDAPURLDesc **ludpp )
        const char *url_tmp;
        char *url;
 
-       if( url_in == NULL && ludpp == NULL ) {
+       if( url_in == NULL || ludpp == NULL ) {
                return LDAP_URL_ERR_PARAM;
        }
 
@@ -232,7 +231,7 @@ ldap_url_parse( LDAP_CONST char *url_in, LDAPURLDesc **ludpp )
         * because a call to LDAP_INT_GLOBAL_OPT() will try to allocate
         * the options and cause infinite recursion
         */
-       Debug( LDAP_DEBUG_TRACE, "ldap_url_parse(%s)\n", url_in, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "ldap_url_parse_ext(%s)\n", url_in, 0, 0 );
 #endif
 
        *ludpp = NULL;  /* pessimistic */
@@ -276,8 +275,9 @@ ldap_url_parse( LDAP_CONST char *url_in, LDAPURLDesc **ludpp )
        ludp->lud_dn = NULL;
        ludp->lud_attrs = NULL;
        ludp->lud_filter = NULL;
-       ludp->lud_scope = LDAP_SCOPE_BASE;
+       ludp->lud_scope = LDAP_SCOPE_DEFAULT;
        ludp->lud_filter = NULL;
+       ludp->lud_exts = NULL;
 
        ludp->lud_scheme = LDAP_STRDUP( scheme );
 
@@ -517,11 +517,15 @@ ldap_url_parse( LDAP_CONST char *url_in, LDAPURLDesc **ludpp )
 
        for( i=0; ludp->lud_exts[i] != NULL; i++ ) {
                ldap_pvt_hex_unescape( ludp->lud_exts[i] );
+
+               if( *ludp->lud_exts[i] == '!' ) {
+                       /* count the number of critical extensions */
+                       ludp->lud_crit_exts++;
+               }
        }
 
        if( i == 0 ) {
                /* must have 1 or more */
-               ldap_charray_free( ludp->lud_exts );
                LDAP_FREE( url );
                ldap_free_urldesc( ludp );
                return LDAP_URL_ERR_BADEXTS;
@@ -533,6 +537,27 @@ ldap_url_parse( LDAP_CONST char *url_in, LDAPURLDesc **ludpp )
        return LDAP_URL_SUCCESS;
 }
 
+int
+ldap_url_parse( LDAP_CONST char *url_in, LDAPURLDesc **ludpp )
+{
+       int rc = ldap_url_parse_ext( url_in, ludpp );
+
+       if( rc != LDAP_URL_SUCCESS ) {
+               return rc;
+       }
+
+       if ((*ludpp)->lud_scope == LDAP_SCOPE_DEFAULT) {
+               (*ludpp)->lud_scope = LDAP_SCOPE_BASE;
+       }
+
+       if ((*ludpp)->lud_host != NULL && *(*ludpp)->lud_host == '\0') {
+               LDAP_FREE( (*ludpp)->lud_host );
+               (*ludpp)->lud_host = NULL;
+       }
+
+       return rc;
+}
+
 LDAPURLDesc *
 ldap_url_dup ( LDAPURLDesc *ludp )
 {
@@ -878,11 +903,20 @@ ldap_url_search( LDAP *ld, LDAP_CONST char *url, int attrsonly )
        BerElement      *ber;
        LDAPreqinfo  bind;
 
+       assert( ld != NULL );
+       assert( LDAP_VALID( ld ) );
+
        if ( ldap_url_parse( url, &ludp ) != 0 ) {
                ld->ld_errno = LDAP_PARAM_ERROR;
                return( -1 );
        }
 
+       if( ludp->lud_crit_exts ) {
+               /* we don't support any extension (yet) */
+               ld->ld_errno = LDAP_NOT_SUPPORTED;
+               return( -1 );
+       }
+
        ber = ldap_build_search_req( ld, ludp->lud_dn, ludp->lud_scope,
            ludp->lud_filter, ludp->lud_attrs, attrsonly, NULL, NULL,
                -1, -1 );
@@ -895,9 +929,7 @@ ldap_url_search( LDAP *ld, LDAP_CONST char *url, int attrsonly )
                bind.ri_url = (char *)url;
                err = ldap_send_server_request(
                                        ld, ber, ld->ld_msgid, NULL,
-                                       (ludp->lud_host != NULL || ludp->lud_port != 0)
-                                               ? ludp : NULL,
-                                       NULL, &bind );
+                                       NULL, NULL, &bind );
        }
 
        ldap_free_urldesc( ludp );
@@ -950,10 +982,10 @@ ldap_url_search_s(
 void
 ldap_pvt_hex_unescape( char *s )
 {
-/*
-* Remove URL hex escapes from s... done in place.  The basic concept for
-* this routine is borrowed from the WWW library HTUnEscape() routine.
-*/
+       /*
+        * Remove URL hex escapes from s... done in place.  The basic concept for
+        * this routine is borrowed from the WWW library HTUnEscape() routine.
+        */
        char    *p;
 
        for ( p = s; *s != '\0'; ++s ) {