]> git.sur5r.net Git - openldap/commitdiff
Pull in a variety of bug fixes from HEAD including
authorKurt Zeilenga <kurt@openldap.org>
Sat, 21 Jul 2001 21:01:36 +0000 (21:01 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Sat, 21 Jul 2001 21:01:36 +0000 (21:01 +0000)
critical client control handling
tls cert checking
sasl/tls ref handling
empty dn handling
Also removed ufn search (normally I would have left it
in but the merge was easier this way).

40 files changed:
COPYRIGHT
clients/fax500/rp500.c
clients/finger/main.c
clients/gopher/go500.c
clients/gopher/go500gw.c
clients/rcpt500/query.c
clients/ud/find.c
doc/drafts/draft-rharrison-ldap-extpartresp-xx.txt [deleted file]
include/ldap.h
include/ldap_pvt.h
libraries/libldap/Makefile.in
libraries/libldap/abandon.c
libraries/libldap/add.c
libraries/libldap/compare.c
libraries/libldap/controls.c
libraries/libldap/cyrus.c
libraries/libldap/delete.c
libraries/libldap/getdn.c
libraries/libldap/init.c
libraries/libldap/ldap-int.h
libraries/libldap/modify.c
libraries/libldap/modrdn.c
libraries/libldap/open.c
libraries/libldap/options.c
libraries/libldap/os-ip.c
libraries/libldap/request.c
libraries/libldap/sasl.c
libraries/libldap/search.c
libraries/libldap/test.c
libraries/libldap/tls.c
libraries/libldap/ufn.c [deleted file]
libraries/libldap/unbind.c
libraries/libldap_r/Makefile.in
servers/slapd/charray.c
servers/slapd/compare.c
servers/slapd/connection.c
servers/slapd/delete.c
servers/slapd/modify.c
servers/slapd/modrdn.c
servers/slapd/starttls.c

index 447503e187212153d938001672dfe450a55cab1c..73e3b057b8d9d670b1cd043d31a13c6139bfa063 100644 (file)
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -7,12 +7,11 @@ Public License.  A copy of this license is available at
 http://www.OpenLDAP.org/license.html or in file LICENSE in the
 top-level directory of the distribution.
 
 http://www.OpenLDAP.org/license.html or in file LICENSE in the
 top-level directory of the distribution.
 
-Individual files and/or contributed packages may be copyright by
-other parties and use subject to additional restrictions.
+Individual files and/or contributed packages may contain material
+copyright by other parties and use subject to additional restrictions.
 
 This work is derived from the University of Michigan LDAP v3.3
 
 This work is derived from the University of Michigan LDAP v3.3
-distribution.  Information concerning this software is available
-at: http://www.umich.edu/~dirsvcs/ldap/
+software <http://www.umich.edu/~dirsvcs/ldap/>.
 
 This work also contains materials derived from public sources.
 
 
 This work also contains materials derived from public sources.
 
index 9ac3b3f8ffc3e7cde3c57478c48322cd23a68a9f..806774f91e3a2549be8a70189d9791e568eb3543 100644 (file)
@@ -129,18 +129,6 @@ main( int argc, char **argv )
        }
 
        result = NULL;
        }
 
        result = NULL;
-       if ( strchr( key, ',' ) != NULL ) {
-               int ld_deref = LDAP_DEREF_FINDING;
-               ldap_set_option(ld, LDAP_OPT_DEREF, &ld_deref);
-               if ( (rc = ldap_ufn_search_s( ld, key, attrs, 0, &result ))
-                   != LDAP_SUCCESS && rc != LDAP_SIZELIMIT_EXCEEDED &&
-                   rc != LDAP_TIMELIMIT_EXCEEDED )
-               {
-                       ldap_perror( ld, "ldap_ufn_search_s" );
-                       exit( -1 );
-               }
-               matches = ldap_count_entries( ld, result );
-       } else {
                for ( fi = ldap_getfirstfilter( filtd, "rp500", key );
                    fi != NULL; fi = ldap_getnextfilter( filtd ) ) {
                        if ( (rc = ldap_search_s( ld, base, LDAP_SCOPE_SUBTREE,
                for ( fi = ldap_getfirstfilter( filtd, "rp500", key );
                    fi != NULL; fi = ldap_getnextfilter( filtd ) ) {
                        if ( (rc = ldap_search_s( ld, base, LDAP_SCOPE_SUBTREE,
@@ -157,7 +145,6 @@ main( int argc, char **argv )
                                break;
                        }
                }
                                break;
                        }
                }
-       }
 
        if ( matches == 1 ) {
                e = ldap_first_entry( ld, result );
 
        if ( matches == 1 ) {
                e = ldap_first_entry( ld, result );
index a19fece964834f910d6f217923db8b280c1accb0..96f8d3595c3f65f9ff5a68a2b871a3403c73f6f5 100644 (file)
@@ -259,7 +259,7 @@ do_search( LDAP *ld, char *buf )
 {
        char            *dn, *rdn;
        char            **title;
 {
        char            *dn, *rdn;
        char            **title;
-       int             rc = 0, matches = 0, i, ufn;
+       int             rc = 0, matches = 0, i;
        struct timeval  tv;
        LDAPFiltDesc    *fd;
        LDAPFiltInfo    *fi = NULL;
        struct timeval  tv;
        LDAPFiltDesc    *fd;
        LDAPFiltInfo    *fi = NULL;
@@ -270,25 +270,6 @@ do_search( LDAP *ld, char *buf )
 #endif
                                        0 };
 
 #endif
                                        0 };
 
-       ufn = 0;
-#ifdef FINGER_UFN
-       if ( strchr( buf, ',' ) != NULL ) {
-               ldap_ufn_setprefix( ld, base );
-               tv.tv_sec = FINGER_TIMEOUT;
-               tv.tv_usec = 0;
-               ldap_ufn_timeout( (void *) &tv );
-
-               if ( (rc = ldap_ufn_search_s( ld, buf, attrs, 0, &result ))
-                   != LDAP_SUCCESS && rc != LDAP_SIZELIMIT_EXCEEDED ) {
-                       fprintf( stderr, FINGER_UNAVAILABLE );
-                       ldap_perror( ld, "ldap_search_st" );
-                       exit( EXIT_FAILURE );
-               }
-
-               matches = ldap_count_entries( ld, result );
-               ufn = 1;
-       } else {
-#endif
                if ( (fd = ldap_init_getfilter( filterfile ))
                    == NULL ) {
                        fprintf( stderr, "Cannot open filter file (%s)\n",
                if ( (fd = ldap_init_getfilter( filterfile ))
                    == NULL ) {
                        fprintf( stderr, "Cannot open filter file (%s)\n",
@@ -318,9 +299,6 @@ do_search( LDAP *ld, char *buf )
                        ldap_msgfree( result );
                        result = NULL;
                }
                        ldap_msgfree( result );
                        result = NULL;
                }
-#ifdef FINGER_UFN
-       }
-#endif
 
        if ( rc == LDAP_SIZELIMIT_EXCEEDED ) {
                printf( "(Partial results - a size limit was exceeded)\r\n" );
 
        if ( rc == LDAP_SIZELIMIT_EXCEEDED ) {
                printf( "(Partial results - a size limit was exceeded)\r\n" );
@@ -336,7 +314,7 @@ do_search( LDAP *ld, char *buf )
                exit( EXIT_FAILURE );
        } else if ( matches <= FINGER_LISTLIMIT ) {
                printf( "%d %s match%s found for \"%s\":\r\n", matches,
                exit( EXIT_FAILURE );
        } else if ( matches <= FINGER_LISTLIMIT ) {
                printf( "%d %s match%s found for \"%s\":\r\n", matches,
-                   ufn ? "UFN" : fi->lfi_desc, matches > 1 ? "es" : "", buf );
+                   fi->lfi_desc, matches > 1 ? "es" : "", buf );
                fflush( stdout );
 
                for ( e = ldap_first_entry( ld, result ); e != NULL; ) {
                fflush( stdout );
 
                for ( e = ldap_first_entry( ld, result ); e != NULL; ) {
@@ -348,7 +326,7 @@ do_search( LDAP *ld, char *buf )
                }
        } else {
                printf( "%d %s matches for \"%s\":\r\n", matches,
                }
        } else {
                printf( "%d %s matches for \"%s\":\r\n", matches,
-                   ufn ? "UFN" : fi->lfi_desc, buf );
+                   fi->lfi_desc, buf );
                fflush( stdout );
 
 #ifdef FINGER_SORT_ATTR
                fflush( stdout );
 
 #ifdef FINGER_SORT_ATTR
index 2b7c4ed6752af712cff475b8d0cdf4caf5c51fd2..948d4b4e8870ca54146b952cd2ee80d0bbcc766f 100644 (file)
@@ -482,24 +482,6 @@ do_search( LDAP *ld, FILE *fp, char *buf )
        LDAPMessage     *e, *res;
        static char     *attrs[] = { "title", 0 };
 
        LDAPMessage     *e, *res;
        static char     *attrs[] = { "title", 0 };
 
-#ifdef GO500_UFN
-       if ( strchr( buf, ',' ) != NULL ) {
-               ldap_ufn_setprefix( ld, base );
-               tv.tv_sec = GO500_TIMEOUT;
-               tv.tv_usec = 0;
-               ldap_ufn_timeout( (void *) &tv );
-
-               if ( (rc = ldap_ufn_search_s( ld, buf, attrs, 0, &res ))
-                   != LDAP_SUCCESS && rc != LDAP_SIZELIMIT_EXCEEDED ) {
-                       fprintf(fp,
-                           "0An error occurred (explanation)\t@%d\t%s\t%d\r\n",
-                           rc, myhost, myport );
-                       return;
-               }
-
-               matches = ldap_count_entries( ld, res );
-       } else {
-#endif
                if ( (filtd = ldap_init_getfilter( filterfile )) == NULL ) {
                        fprintf( stderr, "Cannot open filter file (%s)\n",
                            filterfile );
                if ( (filtd = ldap_init_getfilter( filterfile )) == NULL ) {
                        fprintf( stderr, "Cannot open filter file (%s)\n",
                            filterfile );
@@ -525,9 +507,6 @@ do_search( LDAP *ld, FILE *fp, char *buf )
                                break;
                }
                ldap_getfilter_free( filtd );
                                break;
                }
                ldap_getfilter_free( filtd );
-#ifdef GO500_UFN
-       }
-#endif
 
        if ( matches <= 0 ) {
                return;
 
        if ( matches <= 0 ) {
                return;
index efe5054d811d97c2bcb67c7e32d0f6f0c11fe69b..b1292ba8977f1a84cd513f34ceebb9e8c524a8f5 100644 (file)
@@ -743,27 +743,6 @@ do_search( LDAP *ld, FILE *fp, char *query )
        *filter++ = '\0';
        base = query;
 
        *filter++ = '\0';
        base = query;
 
-#ifdef GO500GW_UFN
-       if ( strchr( filter, ',' ) != NULL ) {
-               ldap_ufn_setprefix( ld, base );
-               timeout.tv_sec = GO500GW_TIMEOUT;
-               timeout.tv_usec = 0;
-               ldap_ufn_timeout( (void *) &timeout );
-
-               deref = LDAP_DEREF_FINDING;
-               ldap_set_option(ld, LDAP_OPT_DEREF, &deref);
-
-               if ( (rc = ldap_ufn_search_s( ld, filter, attrs, 0, &res ))
-                   != LDAP_SUCCESS && rc != LDAP_SIZELIMIT_EXCEEDED ) {
-                       fprintf(fp,
-                           "0An error occurred (explanation)\t@%d\t%s\t%d\r\n",
-                           rc, myhost, myport );
-                       return;
-               }
-
-               count = ldap_count_entries( ld, res );
-       } else {
-#endif
                if ( (scope = make_scope( ld, base )) == -1 ) {
                        fprintf( fp, "3Bad scope\r\n" );
                        exit( EXIT_FAILURE );
                if ( (scope = make_scope( ld, base )) == -1 ) {
                        fprintf( fp, "3Bad scope\r\n" );
                        exit( EXIT_FAILURE );
@@ -801,9 +780,6 @@ do_search( LDAP *ld, FILE *fp, char *query )
                deref = LDAP_DEREF_ALWAYS;
                ldap_set_option(ld, LDAP_OPT_DEREF, &deref);
                ldap_getfilter_free( filtd );
                deref = LDAP_DEREF_ALWAYS;
                ldap_set_option(ld, LDAP_OPT_DEREF, &deref);
                ldap_getfilter_free( filtd );
-#ifdef GO500GW_UFN
-       }
-#endif
 
        if ( count == 0 ) {
                return;
 
        if ( count == 0 ) {
                return;
index 4e92f62a43370ab99486f64b115be4f548a467b1..f4b1d2acbce4f610885924e274efb5eef5bbb450 100644 (file)
@@ -41,7 +41,7 @@ query_cmd( struct msginfo *msgp, char *reply )
     LDAP                       *ldp;
     LDAPMessage                        *ldmsgp, *entry;
     char                       *dn;
     LDAP                       *ldp;
     LDAPMessage                        *ldmsgp, *entry;
     char                       *dn;
-    int                                matches, rc, ld_errno, ufn;
+    int                                matches, rc, ld_errno;
     LDAPFiltDesc               *lfdp;
     LDAPFiltInfo               *lfi;
     struct ldap_disptmpl       *tmpllist = NULL;
     LDAPFiltDesc               *lfdp;
     LDAPFiltInfo               *lfi;
     struct ldap_disptmpl       *tmpllist = NULL;
@@ -51,8 +51,6 @@ query_cmd( struct msginfo *msgp, char *reply )
 #endif
                        NULL };
 
 #endif
                        NULL };
 
-    ufn = 0;
-
     if ( msgp->msg_arg == NULL ) {
        return( help_cmd( msgp, reply ));
     }
     if ( msgp->msg_arg == NULL ) {
        return( help_cmd( msgp, reply ));
     }
@@ -95,23 +93,6 @@ query_cmd( struct msginfo *msgp, char *reply )
 
     matches = 0;
 
 
     matches = 0;
 
-#ifdef RCPT500_UFN
-    if ( strchr( msgp->msg_arg, ',' ) != NULL ) {
-       struct timeval  tv;
-
-       ldap_ufn_setprefix( ldp, searchbase );
-       if (( rc = ldap_ufn_search_s( ldp, msgp->msg_arg, attrs, 0, &ldmsgp ))
-               != LDAP_SUCCESS && rc != LDAP_SIZELIMIT_EXCEEDED
-               && rc != LDAP_TIMELIMIT_EXCEEDED ) {
-           report_ldap_err( ldp, reply );
-           close_ldap( ldp );
-           ldap_getfilter_free( lfdp );
-           return( 0 );
-       }
-       matches = ldap_count_entries( ldp, ldmsgp );
-       ufn = 1;
-    } else {
-#endif /* RCPT500_UFN */
     
        for ( lfi = ldap_getfirstfilter( lfdp, "rcpt500", msgp->msg_arg );
                lfi != NULL; lfi = ldap_getnextfilter( lfdp )) {
     
        for ( lfi = ldap_getfirstfilter( lfdp, "rcpt500", msgp->msg_arg );
                lfi != NULL; lfi = ldap_getnextfilter( lfdp )) {
@@ -134,9 +115,6 @@ query_cmd( struct msginfo *msgp, char *reply )
                ldap_msgfree( ldmsgp );
            }
        }
                ldap_msgfree( ldmsgp );
            }
        }
-#ifdef RCPT500_UFN
-    }
-#endif /* RCPT500_UFN */
 
     if ( matches == 0 ) {
        sprintf( buf, "No matches were found for '%s'\n", msgp->msg_arg );
 
     if ( matches == 0 ) {
        sprintf( buf, "No matches were found for '%s'\n", msgp->msg_arg );
@@ -156,7 +134,7 @@ query_cmd( struct msginfo *msgp, char *reply )
 
     if ( matches <= RCPT500_LISTLIMIT ) {
        sprintf( buf, "%d %s match%s found for '%s':\n\n", matches,
 
     if ( matches <= RCPT500_LISTLIMIT ) {
        sprintf( buf, "%d %s match%s found for '%s':\n\n", matches,
-               ufn ? "UFN" : lfi->lfi_desc,
+               lfi->lfi_desc,
                ( matches > 1 ) ? "es" : "", msgp->msg_arg );
        strcat( reply, buf );
 
                ( matches > 1 ) ? "es" : "", msgp->msg_arg );
        strcat( reply, buf );
 
@@ -184,7 +162,7 @@ query_cmd( struct msginfo *msgp, char *reply )
 
     } else {
        sprintf( buf, "%d %s matches were found for '%s':\n",
 
     } else {
        sprintf( buf, "%d %s matches were found for '%s':\n",
-               matches, ufn ? "UFN" : lfi->lfi_desc, msgp->msg_arg );
+               matches, lfi->lfi_desc, msgp->msg_arg );
        strcat( reply, buf );
        append_entry_list( reply, msgp->msg_arg, ldp, ldmsgp );
        ldap_msgfree( ldmsgp );
        strcat( reply, buf );
        append_entry_list( reply, msgp->msg_arg, ldp, ldmsgp );
        ldap_msgfree( ldmsgp );
index 9525c86b972ac44f2daa5623caad709eedf1d1d9..d5b85e9c21757f9b239111db9ccb73db00640287 100644 (file)
@@ -199,48 +199,6 @@ find( char *who, int quiet )
                search_attrs[k] = NULL;
        }
 
                search_attrs[k] = NULL;
        }
 
-       /*
-        *  If the user-supplied name has any commas in it, we
-        *  assume that it is a UFN, and do everything right
-        *  here.  If we don't find it, treat it as NOT a UFN.
-        */
-       if (strchr(who, ',') != NULL) {
-               int     savederef, deref;
-#ifdef DEBUG
-               if (debug & D_FIND)
-                       printf("\"%s\" appears to be a UFN\n", who);
-#endif
-               ldap_get_option(ld, LDAP_OPT_DEREF, &savederef);
-               deref = LDAP_DEREF_FINDING;
-               ldap_set_option(ld, LDAP_OPT_DEREF, &deref);
-
-               if ((rc = ldap_ufn_search_s(ld, who, search_attrs, FALSE, &res)) !=
-                   LDAP_SUCCESS && rc != LDAP_SIZELIMIT_EXCEEDED &&
-                   rc != LDAP_TIMELIMIT_EXCEEDED) {
-                       ldap_perror(ld, "ldap_ufn_search_s");
-                       ldap_set_option(ld, LDAP_OPT_DEREF, &savederef);
-                       return(NULL);
-               }
-               if ((matches = ldap_count_entries(ld, res)) < 0) {
-                       ldap_perror(ld, "ldap_count_entries");
-                       ldap_set_option(ld, LDAP_OPT_DEREF, &savederef);
-                       return(NULL);
-               } else if (matches == 1) {
-                       dn = ldap_get_dn(ld, ldap_first_entry(ld, res));
-                       rc = ldap_search_s(ld, dn, LDAP_SCOPE_BASE, NULL, read_attrs, FALSE, &res);
-                       ldap_memfree(dn);
-                       if (rc != LDAP_SUCCESS) {
-                               ldap_perror(ld, "ldap_search_s");
-                               return(NULL);
-                       }
-                       ldap_set_option(ld, LDAP_OPT_DEREF, &savederef);
-                       return(res);
-               } else if (matches > 1 ) {
-                       return disambiguate( res, matches, read_attrs, who );
-               }
-               ldap_set_option(ld, LDAP_OPT_DEREF, &savederef);
-       }
-
        /*
         *  Old users of the MTS *USERDIRECTORY will likely wrap the name
         *  in quotes.  Not only is this unnecessary, but it also won't work.
        /*
         *  Old users of the MTS *USERDIRECTORY will likely wrap the name
         *  in quotes.  Not only is this unnecessary, but it also won't work.
@@ -255,9 +213,6 @@ find( char *who, int quiet )
                        break;
        }
 
                        break;
        }
 
-       /*
-        *  It wasn't a UFN, so look it up in the usual method.
-        */
        for (fi = ldap_getfirstfilter(lfdp, "ud", who); fi != NULL;
             fi = ldap_getnextfilter(lfdp)) {
 #ifdef DEBUG
        for (fi = ldap_getfirstfilter(lfdp, "ud", who); fi != NULL;
             fi = ldap_getnextfilter(lfdp)) {
 #ifdef DEBUG
diff --git a/doc/drafts/draft-rharrison-ldap-extpartresp-xx.txt b/doc/drafts/draft-rharrison-ldap-extpartresp-xx.txt
deleted file mode 100644 (file)
index 76a1a47..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-
-Individual Submission to LDAPExt Working Group              R. Harrison
-Internet Draft                                             Novell, Inc.
-Document: draft-rharrison-ldap-extpartresp-01.txt            June, 2000
-Category: Proposed Standard
-
-
-                       Extended Partial Response
-                    Protocol Enhancement to LDAP v3
-
-
-Status of this Memo
-
-   This document is an Internet-Draft and is in full conformance with
-   all provisions of Section 10 of RFC2026 [1].
-
-   Internet-Drafts are working documents of the Internet Engineering
-   Task Force (IETF), its areas, and its working groups. Note that
-   other groups may also distribute working documents as Internet-
-   Drafts. Internet-Drafts are draft documents valid for a maximum of
-   six months and may be updated, replaced, or obsoleted by other
-   documents at any time. It is inappropriate to use Internet- Drafts
-   as reference material or to cite them other than as "work in
-   progress."
-   The list of current Internet-Drafts can be accessed at
-   http://www.ietf.org/ietf/1id-abstracts.txt
-   The list of Internet-Draft Shadow Directories can be accessed at
-   http://www.ietf.org/shadow.html.
-
-
-1. Abstract
-
-   This document describes the ExtendedPartialResponse, an element of
-   LDAP v3 protocol which allows multiple responses to LDAP v3 extended
-   requests.  Extended partial responses are backward compatible with
-   the existing LDAP v3 Extended Operation defined in [LDAPv3].
-
-2. Conventions used in this document
-
-   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
-   "SHOULD", "SHOULD NOT", "RECOMMENDED",  "MAY", and "OPTIONAL" in
-   this document are to be interpreted as described in [RFC2119].
-
-
-3. Motivation for the Extended Partial Response
-
-   The Extended Operation ([LDAPv3] Section 4.12) was defined in LDAP
-   v3 to allow additional operations to be defined as part of the
-   protocol without requiring a new revision of the protocol.
-
-   The LDAP v3 Extended Operation allows for a single extended response
-   to each extended request, but this paradigm may not be sufficient
-   for some directory operations.  For instance, the LDAP search
-   operation is a directory operation that is much more efficient when
-   multiple partial responses are used to service a single request. The
-\f
-                  LDAP v3 Extended Partial Response         June, 2000
-
-
-   extended partial response generalizes the current extended operation
-   definition to give LDAP server implementers the ability to make use
-   of a single-request-multiple-response paradigm for extended LDAP
-   operations that require it or that would benefit from it.
-
-4. Element of Protocol
-
-   The ExtendedPartialResponse is defined as
-
-   ExtendedPartialResponse ::= [APPLICATION 25] SEQUENCE {
-           responseName     [0] LDAPOID OPTIONAL,
-           response         [1] OCTET STRING OPTIONAL }
-
-   An LDAP server responds to an LDAP v3 ExtendedRequest with zero or
-   more ExtendedPartialResponses followed by one ExtendedResponse. This
-   ensures backward compatibility with existing LDAP extensions which
-   do not make use of the ExtendedPartialResponse.  As with all LDAP
-   extensions, LDAP extensions that make use of the
-   ExtendedPartialResponse have predefined syntax and semantics that
-   are defined in RFCs or are private to a particular implementation.
-
-5. Security Considerations
-
-   This draft describes an enhancement to the LDAP v3 protocol
-   [LDAPv3].  All security considerations of [LDAPv3] apply to this
-   draft, however it does not introduce any new security considerations
-   to the LDAP v3 protocol.
-
-6. References
-
-    [LDAPv3]
-        Wahl, M., Howes, T., and S. Kille, "Lightweight Directory
-        Access Protocol (v3)", RFC 2251, December 1997.
-
-   [ReqsKeywords]
-        Scott Bradner. "Key Words for use in RFCs to Indicate
-        Requirement Levels". RFC 2119.
-
-
-7. Acknowledgments
-
-   The author would like to acknowledge the readers of the LDAP
-   Extensions working group mail list who responded to the suggestion
-   that a multiple-response paradigm might be useful for LDAP extended
-   requests.  Special thanks go to two individuals: David Wilbur who
-   first introduced the idea on the working group list, and Thomas
-   Salter, who succinctly summarized the discussion and suggested the
-   name ExtendedPartialResponse in his summary.
-
-8. Author's Addresses
-
-   Roger Harrison
-   Novell, Inc.
-\f
-                  LDAP v3 Extended Partial Response         June, 2000
-
-
-   1800 S. Novell Place
-   Provo, UT 84606
-   +1 801 861 2642
-   roger_harrison@novell.com
-
-
-Appendix A - Document Revision History
-
-A.1 draft-rharrison-ldap-extPartResp-00.doc
-
-   Initial revision of draft.
-
-A.2 draft-rharrison-ldap-extPartResp-01.doc
-
-   Changed responseName to be optional to align with [LDAPv3]
-   definition of ExtendedResponse.
-
-Full Copyright Statement
-
-   "Copyright (C) The Internet Society (date). All Rights Reserved.
-   This document and translations of it may be copied and furnished to
-   others, and derivative works that comment on or otherwise explain it
-   or assist in its implmentation may be prepared, copied, published
-   and distributed, in whole or in part, without restriction of any
-   kind, provided that the above copyright notice and this paragraph
-   are included on all such copies and derivative works. However, this
-   document itself may not be modified in any way, such as by removing
-   the copyright notice or references to the Internet Society or other
-   Internet organizations, except as needed for the purpose of
-   developing Internet standards in which case the procedures for
-   copyrights defined in the Internet Standards process must be
-   followed, or as required to translate it into languages other than
-   English.
-
-   The limited permissions granted above are perpetual and will not be
-   revoked by the Internet Society or its successors or assigns.
-
-   This document and the information contained herein is provided on an
-   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
-   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
-   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
-   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
-   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
index 878d576e1148694e9a9a512280ebf7c30c62218d..1673ab63e0f1de4ef43da40f861185d4f437fe53 100644 (file)
@@ -1326,57 +1326,6 @@ ldap_search_st LDAP_P((  /* deprecated */
        struct timeval *timeout,
        LDAPMessage **res ));
 
        struct timeval *timeout,
        LDAPMessage **res ));
 
-
-/*
- * in ufn.c                                                    
- *     (deprecated)
- */
-LDAP_F( int )
-ldap_ufn_search_c LDAP_P(( /* deprecated */
-       LDAP *ld,
-       LDAP_CONST char *ufn,
-       char **attrs,
-       int attrsonly,
-       LDAPMessage **res,
-       int (*cancelproc)( void *cl ),
-       void *cancelparm ));
-
-LDAP_F( int )
-ldap_ufn_search_ct LDAP_P(( /* deprecated */
-       LDAP *ld,
-       LDAP_CONST char *ufn,
-       char **attrs,
-       int attrsonly,
-       LDAPMessage **res,
-       int (*cancelproc)( void *cl ),
-       void *cancelparm,
-       char *tag1,
-       char *tag2,
-       char *tag3 ));
-
-LDAP_F( int )
-ldap_ufn_search_s LDAP_P(( /* deprecated */
-       LDAP *ld,
-       LDAP_CONST char *ufn,
-       char **attrs,
-       int attrsonly,
-       LDAPMessage **res ));
-
-LDAP_F( LDAPFiltDesc *)
-ldap_ufn_setfilter LDAP_P(( /* deprecated */
-       LDAP *ld,
-       LDAP_CONST char *fname ));
-
-LDAP_F( void )
-ldap_ufn_setprefix LDAP_P(( /* deprecated */
-       LDAP *ld,
-       LDAP_CONST char *prefix ));
-
-LDAP_F( int )
-ldap_ufn_timeout LDAP_P(( /* deprecated */
-       void *tvparam ));
-
-
 /*
  * in unbind.c
  */
 /*
  * in unbind.c
  */
index 75dc5bcaa6b55b92ffbdaa48e2163a0f524ce8f4..d926912f9ed59a648ed1f8099f79a224fb2bc6a7 100644 (file)
@@ -148,6 +148,11 @@ LDAP_F (int) ldap_pvt_sasl_install LDAP_P(( struct sockbuf *, void * ));
 
 #define LDAP_PVT_SASL_LOCAL_SSF        71      /* SSF for Unix Domain Sockets */
 
 
 #define LDAP_PVT_SASL_LOCAL_SSF        71      /* SSF for Unix Domain Sockets */
 
+struct ldap;
+
+LDAP_F (int) ldap_open_internal_connection LDAP_P((
+       struct ldap **ldp, ber_socket_t *fdp ));
+
 /* search.c */
 LDAP_F( char * )
 ldap_pvt_find_wildcard LDAP_P((        const char *s ));
 /* search.c */
 LDAP_F( char * )
 ldap_pvt_find_wildcard LDAP_P((        const char *s ));
@@ -163,21 +168,21 @@ LDAP_F( char * )
 ldap_pvt_str2lower LDAP_P(( char *str ));
 
 /* tls.c */
 ldap_pvt_str2lower LDAP_P(( char *str ));
 
 /* tls.c */
-struct ldapoptions;
-struct ldap;
-
 LDAP_F (int) ldap_pvt_tls_init LDAP_P(( void ));
 LDAP_F (int) ldap_pvt_tls_init LDAP_P(( void ));
-LDAP_F (int) ldap_pvt_tls_connect LDAP_P(( struct ldap *ld, Sockbuf *sb, void *ctx_arg ));
+LDAP_F (int) ldap_pvt_tls_connect LDAP_P(( struct ldap *ld,
+       Sockbuf *sb, void *ctx_arg ));
 LDAP_F (int) ldap_pvt_tls_accept LDAP_P(( Sockbuf *sb, void *ctx_arg ));
 LDAP_F (void *) ldap_pvt_tls_sb_handle LDAP_P(( Sockbuf *sb ));
 LDAP_F (void *) ldap_pvt_tls_get_handle LDAP_P(( struct ldap *ld ));
 LDAP_F (int) ldap_pvt_tls_accept LDAP_P(( Sockbuf *sb, void *ctx_arg ));
 LDAP_F (void *) ldap_pvt_tls_sb_handle LDAP_P(( Sockbuf *sb ));
 LDAP_F (void *) ldap_pvt_tls_get_handle LDAP_P(( struct ldap *ld ));
-LDAP_F (const char *) ldap_pvt_tls_get_peer LDAP_P(( void *handle ));
+LDAP_F (char *) ldap_pvt_tls_get_peer LDAP_P(( void *handle ));
 LDAP_F (int) ldap_pvt_tls_get_strength LDAP_P(( void *handle ));
 LDAP_F (int) ldap_pvt_tls_inplace LDAP_P(( Sockbuf *sb ));
 LDAP_F (int) ldap_pvt_tls_get_strength LDAP_P(( void *handle ));
 LDAP_F (int) ldap_pvt_tls_inplace LDAP_P(( Sockbuf *sb ));
-LDAP_F (int) ldap_pvt_tls_start LDAP_P(( struct ldap *ld, Sockbuf *sb, void *ctx_arg ));
-
-LDAP_F (int) ldap_pvt_tls_get_option LDAP_P(( struct ldapoptions *lo, int option, void *arg ));
-LDAP_F (int) ldap_pvt_tls_set_option LDAP_P(( struct ldapoptions *lo, int option, void *arg ));
+LDAP_F (int) ldap_pvt_tls_start LDAP_P(( struct ldap *ld,
+       Sockbuf *sb, void *ctx_arg ));
+LDAP_F (int) ldap_pvt_tls_get_option LDAP_P(( struct ldap *ld,
+       int option, void *arg ));
+LDAP_F (int) ldap_pvt_tls_set_option LDAP_P(( struct ldap *ld,
+       int option, void *arg ));
 
 /*  
  * UTF-8 (in utf-8.c)
 
 /*  
  * UTF-8 (in utf-8.c)
index 2be2d6f9256bb448c56081d46641f1e26bdb66fb..996f11046c29efe0f2a8b408d57de8992450f42a 100644 (file)
@@ -11,7 +11,7 @@ PROGRAMS = apitest ltest ttest
 
 SRCS   = bind.c open.c result.c error.c compare.c search.c \
        controls.c messages.c references.c extended.c cyrus.c \
 
 SRCS   = bind.c open.c result.c error.c compare.c search.c \
        controls.c messages.c references.c extended.c cyrus.c \
-       modify.c add.c modrdn.c delete.c abandon.c ufn.c cache.c \
+       modify.c add.c modrdn.c delete.c abandon.c cache.c \
        getfilter.c sasl.c sbind.c kbind.c unbind.c friendly.c \
        free.c disptmpl.c srchpref.c dsparse.c tmplout.c sort.c \
        getdn.c getentry.c getattr.c getvalues.c addentry.c \
        getfilter.c sasl.c sbind.c kbind.c unbind.c friendly.c \
        free.c disptmpl.c srchpref.c dsparse.c tmplout.c sort.c \
        getdn.c getentry.c getattr.c getvalues.c addentry.c \
@@ -21,7 +21,7 @@ SRCS  = bind.c open.c result.c error.c compare.c search.c \
        utf-8.c
 OBJS   = bind.lo open.lo result.lo error.lo compare.lo search.lo \
        controls.lo messages.lo references.lo extended.lo cyrus.lo \
        utf-8.c
 OBJS   = bind.lo open.lo result.lo error.lo compare.lo search.lo \
        controls.lo messages.lo references.lo extended.lo cyrus.lo \
-       modify.lo add.lo modrdn.lo delete.lo abandon.lo ufn.lo cache.lo \
+       modify.lo add.lo modrdn.lo delete.lo abandon.lo cache.lo \
        getfilter.lo sasl.lo sbind.lo kbind.lo unbind.lo friendly.lo \
        free.lo disptmpl.lo srchpref.lo dsparse.lo tmplout.lo sort.lo \
        getdn.lo getentry.lo getattr.lo getvalues.lo addentry.lo \
        getfilter.lo sasl.lo sbind.lo kbind.lo unbind.lo friendly.lo \
        free.lo disptmpl.lo srchpref.lo dsparse.lo tmplout.lo sort.lo \
        getdn.lo getentry.lo getattr.lo getvalues.lo addentry.lo \
index fbb184722a5357553da576b82ea5873972c6a6ca..8220e47a99672fe6accb95c81a7cfc3e57717545 100644 (file)
@@ -56,8 +56,13 @@ ldap_abandon_ext(
        LDAPControl **sctrls,
        LDAPControl **cctrls )
 {
        LDAPControl **sctrls,
        LDAPControl **cctrls )
 {
+       int rc;
        Debug( LDAP_DEBUG_TRACE, "ldap_abandon_ext %d\n", msgid, 0, 0 );
 
        Debug( LDAP_DEBUG_TRACE, "ldap_abandon_ext %d\n", msgid, 0, 0 );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        return do_abandon( ld, msgid, msgid, sctrls, cctrls );
 }
 
        return do_abandon( ld, msgid, msgid, sctrls, cctrls );
 }
 
@@ -77,7 +82,7 @@ int
 ldap_abandon( LDAP *ld, int msgid )
 {
        Debug( LDAP_DEBUG_TRACE, "ldap_abandon %d\n", msgid, 0, 0 );
 ldap_abandon( LDAP *ld, int msgid )
 {
        Debug( LDAP_DEBUG_TRACE, "ldap_abandon %d\n", msgid, 0, 0 );
-       return do_abandon( ld, msgid, msgid, NULL, NULL ) == LDAP_SUCCESS
+       return ldap_abandon_ext( ld, msgid, NULL, NULL ) == LDAP_SUCCESS
                ? 0 : -1;
 }
 
                ? 0 : -1;
 }
 
index 5ae74605276966a7786d2d4eb8e1d388b73a0afc..a8281f4c0eb6fb5a8cb059850c533187ae9b26d7 100644 (file)
@@ -105,6 +105,10 @@ ldap_add_ext(
        assert( dn != NULL );
        assert( msgidp != NULL );
 
        assert( dn != NULL );
        assert( msgidp != NULL );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                ld->ld_errno = LDAP_NO_MEMORY;
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                ld->ld_errno = LDAP_NO_MEMORY;
index a48dda120f335884d2fe9494fac39122e6656991..2b890b1fe9d7af4f47646f54b9bb5f93b162121c 100644 (file)
@@ -51,6 +51,7 @@ ldap_compare_ext(
        LDAPControl **cctrls,
        int     *msgidp )
 {
        LDAPControl **cctrls,
        int     *msgidp )
 {
+       int rc;
        BerElement      *ber;
 
        Debug( LDAP_DEBUG_TRACE, "ldap_compare\n", 0, 0, 0 );
        BerElement      *ber;
 
        Debug( LDAP_DEBUG_TRACE, "ldap_compare\n", 0, 0, 0 );
@@ -61,6 +62,10 @@ ldap_compare_ext(
        assert( attr != NULL );
        assert( msgidp != NULL );
 
        assert( attr != NULL );
        assert( msgidp != NULL );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                return( LDAP_NO_MEMORY );
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                return( LDAP_NO_MEMORY );
index 58ca93e81a39720707543ae07a6c757f65449c98..6dcf7364ecbc63d34f64d9e463107875f4a7e150 100644 (file)
@@ -441,3 +441,34 @@ ldap_create_control(
        *ctrlp = ctrl;
        return LDAP_SUCCESS;
 }
        *ctrlp = ctrl;
        return LDAP_SUCCESS;
 }
+
+/*
+ * check for critical client controls and bitch if present
+ * if we ever support critical controls, we'll have to
+ * find a means for maintaining per API call control
+ * information.
+ */
+int ldap_int_client_controls( LDAP *ld, LDAPControl **ctrls )
+{
+       LDAPControl *const *c;
+
+       assert( ld != NULL );
+
+       if( ctrls == NULL ) {
+               /* use default server controls */
+               ctrls = ld->ld_cctrls;
+       }
+
+       if( ctrls == NULL || *ctrls == NULL ) {
+               return LDAP_SUCCESS;
+       }
+
+       for( c = ctrls ; *c != NULL; c++ ) {
+               if( (*c)->ldctl_iscritical ) {
+                       ld->ld_errno = LDAP_NOT_SUPPORTED;
+                       return ld->ld_errno;
+               }
+       }
+
+       return LDAP_SUCCESS;
+}
index fcca106b7d3b6dbf11d9f9f8e12a27d4a80fa8b9..af3d1ab3829c9b866c8ad5a193af14009b3ea661 100644 (file)
@@ -424,7 +424,7 @@ ldap_int_sasl_open(
                return ld->ld_errno;
        }
 
                return ld->ld_errno;
        }
 
-       Debug( LDAP_DEBUG_TRACE, "ldap_int_sasl_open: %s\n",
+       Debug( LDAP_DEBUG_TRACE, "ldap_int_sasl_open: host=%s\n",
                host, 0, 0 );
 
        lc->lconn_sasl_ctx = ctx;
                host, 0, 0 );
 
        lc->lconn_sasl_ctx = ctx;
index 714acc5a5a2e966fbe2ac6c914178c354d3bee1b..8397b735cc393b07f7090a3527c5f48f2f837902 100644 (file)
@@ -45,6 +45,7 @@ ldap_delete_ext(
        LDAPControl **cctrls,
        int *msgidp )
 {
        LDAPControl **cctrls,
        int *msgidp )
 {
+       int rc;
        BerElement      *ber;
 
        Debug( LDAP_DEBUG_TRACE, "ldap_delete\n", 0, 0, 0 );
        BerElement      *ber;
 
        Debug( LDAP_DEBUG_TRACE, "ldap_delete\n", 0, 0, 0 );
@@ -54,6 +55,10 @@ ldap_delete_ext(
        assert( dn != NULL );
        assert( msgidp != NULL );
 
        assert( dn != NULL );
        assert( msgidp != NULL );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                ld->ld_errno = LDAP_NO_MEMORY;
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                ld->ld_errno = LDAP_NO_MEMORY;
index 3ed841ab5eb22261622e7bc92fb2a908ab531923..90be4755534525cfc2b9bc2339ab95e80851fc29 100644 (file)
@@ -54,88 +54,41 @@ ldap_get_dn( LDAP *ld, LDAPMessage *entry )
 char *
 ldap_dn2ufn( LDAP_CONST char *dn )
 {
 char *
 ldap_dn2ufn( LDAP_CONST char *dn )
 {
-       char    *p, *ufn, *r;
-       int     state;
+       char    *ufn;
+       char    **vals;
+       int i;
 
        Debug( LDAP_DEBUG_TRACE, "ldap_dn2ufn\n", 0, 0, 0 );
 
 
        Debug( LDAP_DEBUG_TRACE, "ldap_dn2ufn\n", 0, 0, 0 );
 
+       /* produces completely untyped UFNs */
+
        if( dn == NULL ) {
                return NULL;
        }
 
        if( dn == NULL ) {
                return NULL;
        }
 
-       if ( ( p = ldap_utf8_strpbrk( dn, "=" ) ) == NULL ) {
-               return( LDAP_STRDUP( dn ) );
+       vals = ldap_explode_dn( dn , 0 );
+       if( vals == NULL ) {
+               return NULL;
        }
        }
-       ufn = LDAP_STRDUP( ++p );
-
-       if( ufn == NULL ) return NULL;
-
-#define INQUOTE                1
-#define OUTQUOTE       2
-       state = OUTQUOTE;
-       for ( p = ufn, r = ufn; *p; LDAP_UTF8_INCR(p) ) {
-               switch ( *p ) {
-               case '\\':
-                       if ( p[1] != '\0' ) {
-                               *r++ = '\\';
-                               LDAP_UTF8_COPY(r,++p);
-                               LDAP_UTF8_INCR(r);
-                       }
-                       break;
-
-               case '"':
-                       if ( state == INQUOTE )
-                               state = OUTQUOTE;
-                       else
-                               state = INQUOTE;
-                       *r++ = *p;
-                       break;
 
 
-               case ';':
-               case ',':
-                       if ( state == OUTQUOTE )
-                               *r++ = ',';
-                       else
-                               *r++ = *p;
-                       break;
-
-               case '=':
-                       if ( state == INQUOTE ) {
-                               *r++ = *p;
-                       } else {
-                               char    *rsave = r;
-
-                               *r = '\0';
-                               LDAP_UTF8_DECR( r );
+       for ( i = 0; vals[i]; i++ ) {
+               char **rvals;
 
 
-                               while ( !ldap_utf8_isspace( r )
-                                       && *r != ';' && *r != ',' && r > ufn )
-                               {
-                                       LDAP_UTF8_DECR( r );
-                               }
-                               LDAP_UTF8_INCR( r );
-
-                               if ( strcasecmp( r, "c" )
-                                   && strcasecmp( r, "o" )
-                                   && strcasecmp( r, "ou" )
-                                   && strcasecmp( r, "st" )
-                                   && strcasecmp( r, "l" )
-                                   && strcasecmp( r, "cn" ) ) {
-                                       r = rsave;
-                                       *r++ = '=';
-                               }
-                       }
-                       break;
-
-               default:
-                       LDAP_UTF8_COPY(r, p);
-                       LDAP_UTF8_INCR(r);
-                       break;
+               rvals = ldap_explode_rdn( vals[i] , 1 );
+               if ( rvals == NULL ) {
+                       LDAP_VFREE( vals );
+                       return NULL;
                }
                }
+
+               LDAP_FREE( vals[i] );
+               vals[i] = ldap_charray2str( rvals, " + " );
+               LDAP_VFREE( rvals );
        }
        }
-       *r = '\0';
 
 
-       return( ufn );
+       ufn = ldap_charray2str( vals, ", " );
+
+       LDAP_VFREE( vals );
+       return ufn;
 }
 
 char **
 }
 
 char **
@@ -237,6 +190,9 @@ ldap_dcedn2dn( LDAP_CONST char *dce )
        return dn;
 }
 
        return dn;
 }
 
+#define INQUOTE                1
+#define OUTQUOTE       2
+
 static char **
 explode_name( const char *name, int notypes, int is_type )
 {
 static char **
 explode_name( const char *name, int notypes, int is_type )
 {
index ae70a5830ec2780c0cc79235aa7dafce88a96cdc..85c9ded5bcd9407fada98cb8ded1d4be6cd6aef6 100644 (file)
@@ -26,7 +26,7 @@ struct ldapoptions ldap_int_global_options =
 #define ATTR_INT       2
 #define ATTR_KV                3
 #define ATTR_STRING    4
 #define ATTR_INT       2
 #define ATTR_KV                3
 #define ATTR_STRING    4
-#define ATTR_URIS      5
+#define ATTR_OPTION    5
 
 #define ATTR_SASL      6
 #define ATTR_TLS       7
 
 #define ATTR_SASL      6
 #define ATTR_TLS       7
@@ -63,8 +63,8 @@ static const struct ol_attribute {
                offsetof(struct ldapoptions, ldo_defbase)},
        {0, ATTR_INT,           "PORT",                 NULL,           /* deprecated */
                offsetof(struct ldapoptions, ldo_defport)},
                offsetof(struct ldapoptions, ldo_defbase)},
        {0, ATTR_INT,           "PORT",                 NULL,           /* deprecated */
                offsetof(struct ldapoptions, ldo_defport)},
-       {0, ATTR_URIS,          "HOST",                 NULL,   1},     /* deprecated */
-       {0, ATTR_URIS,          "URI",                  NULL,   0}, /* replaces HOST/URI */
+       {0, ATTR_OPTION,        "HOST",                 NULL,   LDAP_OPT_HOST_NAME}, /* deprecated */
+       {0, ATTR_OPTION,        "URI",                  NULL,   LDAP_OPT_URI}, /* replaces HOST/PORT */
        {0, ATTR_BOOL,          "REFERRALS",    NULL,   LDAP_BOOL_REFERRALS},
        {0, ATTR_BOOL,          "RESTART",              NULL,   LDAP_BOOL_RESTART},
 
        {0, ATTR_BOOL,          "REFERRALS",    NULL,   LDAP_BOOL_REFERRALS},
        {0, ATTR_BOOL,          "RESTART",              NULL,   LDAP_BOOL_RESTART},
 
@@ -211,12 +211,8 @@ static void openldap_ldap_init_w_conf(
                                if (* (char**) p != NULL) LDAP_FREE(* (char**) p);
                                * (char**) p = LDAP_STRDUP(opt);
                                break;
                                if (* (char**) p != NULL) LDAP_FREE(* (char**) p);
                                * (char**) p = LDAP_STRDUP(opt);
                                break;
-                       case ATTR_URIS:
-                               if (attrs[i].offset == 0) {
-                                       ldap_set_option( NULL, LDAP_OPT_URI, opt );
-                               } else {
-                                       ldap_set_option( NULL, LDAP_OPT_HOST_NAME, opt );
-                               }
+                       case ATTR_OPTION:
+                               ldap_set_option( NULL, attrs[i].offset, opt );
                                break;
                        case ATTR_SASL:
 #ifdef HAVE_CYRUS_SASL
                                break;
                        case ATTR_SASL:
 #ifdef HAVE_CYRUS_SASL
@@ -351,12 +347,8 @@ static void openldap_ldap_init_w_env(
                                * (char**) p = LDAP_STRDUP(value);
                        }
                        break;
                                * (char**) p = LDAP_STRDUP(value);
                        }
                        break;
-               case ATTR_URIS:
-                       if (attrs[i].offset == 0) {
-                               ldap_set_option( NULL, LDAP_OPT_URI, value );
-                       } else {
-                               ldap_set_option( NULL, LDAP_OPT_HOST_NAME, value );
-                       }
+               case ATTR_OPTION:
+                       ldap_set_option( NULL, attrs[i].offset, value );
                        break;
                case ATTR_SASL:
 #ifdef HAVE_CYRUS_SASL
                        break;
                case ATTR_SASL:
 #ifdef HAVE_CYRUS_SASL
@@ -418,12 +410,7 @@ void ldap_int_initialize_global_options( struct ldapoptions *gopts, int *dbglvl
                SASL_SEC_NOPLAINTEXT | SASL_SEC_NOANONYMOUS;
 #endif
 
                SASL_SEC_NOPLAINTEXT | SASL_SEC_NOANONYMOUS;
 #endif
 
-#ifdef HAVE_TLS
-       gopts->ldo_tls_ctx = NULL;
-#endif
-
        gopts->ldo_valid = LDAP_INITIALIZED;
        gopts->ldo_valid = LDAP_INITIALIZED;
-
        return;
 }
 
        return;
 }
 
index c8cc179171940af3eb8e9101c2c8a382c3e6269a..d752b62e06759a330ae3ac016a125c55d41ab8be 100644 (file)
@@ -122,6 +122,10 @@ struct ldapoptions {
        ber_int_t               ldo_timelimit;
        ber_int_t               ldo_sizelimit;
 
        ber_int_t               ldo_timelimit;
        ber_int_t               ldo_sizelimit;
 
+#ifdef HAVE_TLS
+       int                     ldo_tls_mode;
+#endif
+
        LDAPURLDesc *ldo_defludp;
        int             ldo_defport;
        char*   ldo_defbase;
        LDAPURLDesc *ldo_defludp;
        int             ldo_defport;
        char*   ldo_defbase;
@@ -146,32 +150,22 @@ struct ldapoptions {
        /* LDAP rebind callback function */
        LDAP_REBIND_PROC                *ldo_rebindproc;
 
        /* LDAP rebind callback function */
        LDAP_REBIND_PROC                *ldo_rebindproc;
 
-#ifdef HAVE_TLS
-       /* tls context */
-       void            *ldo_tls_ctx;
-       int             ldo_tls_mode;
-#endif
        LDAP_BOOLEANS ldo_booleans;     /* boolean options */
 };
 
 
        LDAP_BOOLEANS ldo_booleans;     /* boolean options */
 };
 
 
-/*
- * structure for tracking LDAP server host, ports, DNs, etc.
- */
-typedef struct ldap_server {
-       char                    *lsrv_host;
-       char                    *lsrv_dn;       /* if NULL, use default */
-       int                     lsrv_port;
-       struct ldap_server      *lsrv_next;
-} LDAPServer;
-
-
 /*
  * structure for representing an LDAP server connection
  */
 typedef struct ldap_conn {
        Sockbuf         *lconn_sb;
 /*
  * structure for representing an LDAP server connection
  */
 typedef struct ldap_conn {
        Sockbuf         *lconn_sb;
+#ifdef HAVE_TLS
+       /* tls context */
+       void            *lconn_tls_ctx;
+#endif
+#ifdef HAVE_CYRUS_SASL
        void            *lconn_sasl_ctx;
        void            *lconn_sasl_ctx;
+#endif
        int                     lconn_refcnt;
        time_t          lconn_lastused; /* time */
        int                     lconn_rebind_inprogress;        /* set if rebind in progress */
        int                     lconn_refcnt;
        time_t          lconn_lastused; /* time */
        int                     lconn_rebind_inprogress;        /* set if rebind in progress */
@@ -184,8 +178,9 @@ typedef struct ldap_conn {
 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND
        char                    *lconn_krbinstance;
 #endif
 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND
        char                    *lconn_krbinstance;
 #endif
+       BerElement              *lconn_ber;     /* ber receiving on this conn. */
+
        struct ldap_conn        *lconn_next;
        struct ldap_conn        *lconn_next;
-       BerElement              *lconn_ber;/* ber receiving on this conn. */
 } LDAPConn;
 
 
 } LDAPConn;
 
 
@@ -269,9 +264,6 @@ struct ldap {
 
 #define ld_version             ld_options.ldo_version
 
 
 #define ld_version             ld_options.ldo_version
 
-       char    *ld_host;
-       int             ld_port;
-
        unsigned short  ld_lberoptions;
 
        LDAPFiltDesc    *ld_filtd;      /* from getfilter for ufn searches */
        unsigned short  ld_lberoptions;
 
        LDAPFiltDesc    *ld_filtd;      /* from getfilter for ufn searches */
@@ -373,6 +365,9 @@ LDAP_F (int) ldap_int_put_controls LDAP_P((
        LDAPControl *const *ctrls,
        BerElement *ber ));
 
        LDAPControl *const *ctrls,
        BerElement *ber ));
 
+LDAP_F (int) ldap_int_client_controls LDAP_P((
+       LDAP *ld,
+       LDAPControl **ctrlp ));
 
 /*
  * in dsparse.c
 
 /*
  * in dsparse.c
@@ -408,10 +403,11 @@ LDAP_F (int) ldap_connect_to_host( LDAP *ld, Sockbuf *sb,
        int proto, const char *host, unsigned long address, int port,
        int async );
 
        int proto, const char *host, unsigned long address, int port,
        int async );
 
-#if defined(LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND) || defined(HAVE_TLS) || defined(HAVE_CYRUS_SASL)
+#if defined(LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND) || \
+       defined(HAVE_TLS) || defined(HAVE_CYRUS_SASL)
 LDAP_V (char *) ldap_int_hostname;
 LDAP_F (char *) ldap_host_connected_to( Sockbuf *sb );
 LDAP_V (char *) ldap_int_hostname;
 LDAP_F (char *) ldap_host_connected_to( Sockbuf *sb );
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND */
+#endif
 
 LDAP_F (void) ldap_int_ip_init( void );
 LDAP_F (int) do_ldap_select( LDAP *ld, struct timeval *timeout );
 
 LDAP_F (void) ldap_int_ip_init( void );
 LDAP_F (int) do_ldap_select( LDAP *ld, struct timeval *timeout );
@@ -540,7 +536,7 @@ LDAP_F (int) ldap_int_sasl_config LDAP_P(( struct ldapoptions *lo,
        int option, const char *arg ));
 
 LDAP_F (int) ldap_int_sasl_bind LDAP_P((
        int option, const char *arg ));
 
 LDAP_F (int) ldap_int_sasl_bind LDAP_P((
-       struct ldap *ld,
+       LDAP *ld,
        const char *,
        const char *,
        LDAPControl **, LDAPControl **,
        const char *,
        const char *,
        LDAPControl **, LDAPControl **,
@@ -553,7 +549,11 @@ LDAP_F (int) ldap_int_sasl_bind LDAP_P((
 /*
  * in tls.c
  */
 /*
  * in tls.c
  */
-LDAP_F (int) ldap_int_tls_config LDAP_P(( struct ldapoptions *lo, int option, const char *arg ));
+LDAP_F (int) ldap_int_tls_config LDAP_P(( LDAP *ld,
+       int option, const char *arg ));
+
+LDAP_F (int) ldap_int_tls_start LDAP_P(( LDAP *ld,
+       LDAPConn *conn ));
 
 LDAP_END_DECL
 
 
 LDAP_END_DECL
 
index da8b0e602795b5eb3a4cc54dc1698bde04759e62..8ef0098c70b8b6d09bd892816e64a831cabc722c 100644 (file)
@@ -73,6 +73,10 @@ ldap_modify_ext( LDAP *ld,
 
        Debug( LDAP_DEBUG_TRACE, "ldap_modify_ext\n", 0, 0, 0 );
 
 
        Debug( LDAP_DEBUG_TRACE, "ldap_modify_ext\n", 0, 0, 0 );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                return( LDAP_NO_MEMORY );
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                return( LDAP_NO_MEMORY );
index 13678ef0411c7e825636475fef631b49c50a8442..54a3303a9f01ed1a67c211e4ebe8eaa2c62209c7 100644 (file)
@@ -70,6 +70,10 @@ ldap_rename(
 
        Debug( LDAP_DEBUG_TRACE, "ldap_rename\n", 0, 0, 0 );
 
 
        Debug( LDAP_DEBUG_TRACE, "ldap_rename\n", 0, 0, 0 );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                return( LDAP_NO_MEMORY );
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
                return( LDAP_NO_MEMORY );
index a86b872e0c14fd6e7eb1ea27058bd2aeaa05943d..b48ae051c4c61c6bfd6b2130d27fc69faed10a42 100644 (file)
@@ -54,9 +54,11 @@ ldap_open( LDAP_CONST char *host, int port )
        int rc;
        LDAP            *ld;
 
        int rc;
        LDAP            *ld;
 
-       Debug( LDAP_DEBUG_TRACE, "ldap_open\n", 0, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "ldap_open(%s, %d)\n",
+               host, port, 0 );
 
 
-       if (( ld = ldap_init( host, port )) == NULL ) {
+       ld = ldap_init( host, port );
+       if ( ld == NULL ) {
                return( NULL );
        }
 
                return( NULL );
        }
 
@@ -64,13 +66,13 @@ ldap_open( LDAP_CONST char *host, int port )
 
        if( rc < 0 ) {
                ldap_ld_free( ld, 0, NULL, NULL );
 
        if( rc < 0 ) {
                ldap_ld_free( ld, 0, NULL, NULL );
-               return( NULL );
+               ld = NULL;
        }
 
        }
 
-       Debug( LDAP_DEBUG_TRACE, "ldap_open successful, ld_host is %s\n",
-               ( ld->ld_host == NULL ) ? "(null)" : ld->ld_host, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "ldap_open: %s\n",
+               ld == NULL ? "succeeded" : "failed", 0, 0 );
 
 
-       return( ld );
+       return ld;
 }
 
 
 }
 
 
@@ -329,14 +331,10 @@ ldap_int_open_connection(
        if (ld->ld_options.ldo_tls_mode == LDAP_OPT_X_TLS_HARD ||
                strcmp( srv->lud_scheme, "ldaps" ) == 0 )
        {
        if (ld->ld_options.ldo_tls_mode == LDAP_OPT_X_TLS_HARD ||
                strcmp( srv->lud_scheme, "ldaps" ) == 0 )
        {
-               LDAPConn        *savedefconn = ld->ld_defconn;
                ++conn->lconn_refcnt;   /* avoid premature free */
                ++conn->lconn_refcnt;   /* avoid premature free */
-               ld->ld_defconn = conn;
 
 
-               rc = ldap_pvt_tls_start( ld, conn->lconn_sb,
-                       ld->ld_options.ldo_tls_ctx );
+               rc = ldap_int_tls_start( ld, conn );
 
 
-               ld->ld_defconn = savedefconn;
                --conn->lconn_refcnt;
 
                if (rc != LDAP_SUCCESS) {
                --conn->lconn_refcnt;
 
                if (rc != LDAP_SUCCESS) {
index 041897494dc6c9fa1ae8140e4883b34a69962b0e..7aeac91e3c334ad45995efbfce6ee8a325afb4a6 100644 (file)
@@ -281,12 +281,14 @@ ldap_get_option(
 
        default:
 #ifdef HAVE_TLS
 
        default:
 #ifdef HAVE_TLS
-               if ( ldap_pvt_tls_get_option((struct ldapoptions *)lo, option, outvalue ) == 0 )
-                       return LDAP_OPT_SUCCESS;
+               if ( ldap_pvt_tls_get_option( ld, option, outvalue ) == 0 ) {
+                       return LDAP_OPT_SUCCESS;
+               }
 #endif
 #ifdef HAVE_CYRUS_SASL
 #endif
 #ifdef HAVE_CYRUS_SASL
-               if ( ldap_int_sasl_get_option(ld, option, outvalue ) == 0 )
-                       return LDAP_OPT_SUCCESS;
+               if ( ldap_int_sasl_get_option( ld, option, outvalue ) == 0 ) {
+                       return LDAP_OPT_SUCCESS;
+               }
 #endif
                /* bad param */
                break;
 #endif
                /* bad param */
                break;
@@ -579,7 +581,7 @@ ldap_set_option(
 
        default:
 #ifdef HAVE_TLS
 
        default:
 #ifdef HAVE_TLS
-               if ( ldap_pvt_tls_set_option( lo, option, (void *)invalue ) == 0 )
+               if ( ldap_pvt_tls_set_option( ld, option, (void *)invalue ) == 0 )
                return LDAP_OPT_SUCCESS;
 #endif
 #ifdef HAVE_CYRUS_SASL
                return LDAP_OPT_SUCCESS;
 #endif
 #ifdef HAVE_CYRUS_SASL
index 30f4b3c3e559e0e4e654595dce8b0322fd8161bd..79bd49af9fb7d9048a3091cd3e346dfdd80c4cc1 100644 (file)
@@ -294,7 +294,7 @@ ldap_connect_to_host(LDAP *ld, Sockbuf *sb,
        struct hostent          *hp = NULL;
        char                    *ha_buf=NULL, *p, *q;
 
        struct hostent          *hp = NULL;
        char                    *ha_buf=NULL, *p, *q;
 
-       osip_debug(ld, "ldap_connect_to_host\n",0,0,0);
+       osip_debug(ld, "ldap_connect_to_host: %s\n",host,0,0);
        
        if (host != NULL) {
 #if defined( HAVE_GETADDRINFO ) && defined( HAVE_INET_NTOP )
        
        if (host != NULL) {
 #if defined( HAVE_GETADDRINFO ) && defined( HAVE_INET_NTOP )
@@ -423,8 +423,8 @@ ldap_connect_to_host(LDAP *ld, Sockbuf *sb,
        return rc;
 }
 
        return rc;
 }
 
-#if defined( LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND ) \
-       || defined( HAVE_TLS ) || defined( HAVE_CYRUS_SASL )
+#if defined( LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND ) || \
+       defined( HAVE_CYRUS_SASL )
 char *
 ldap_host_connected_to( Sockbuf *sb )
 {
 char *
 ldap_host_connected_to( Sockbuf *sb )
 {
@@ -510,7 +510,7 @@ ldap_host_connected_to( Sockbuf *sb )
        LDAP_FREE( ha_buf );
        return host;
 }
        LDAP_FREE( ha_buf );
        return host;
 }
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND || HAVE_TLS */
+#endif
 
 
 /* for UNIX */
 
 
 /* for UNIX */
index b1e7e170c29033d79b6d72606801247bcf5d99a6..9d87cd21beb80dcb9e292eef22fa5631d9adaf1b 100644 (file)
@@ -95,8 +95,8 @@ ldap_send_initial_request(
                }
 
                Debug( LDAP_DEBUG_TRACE,
                }
 
                Debug( LDAP_DEBUG_TRACE,
-                       "ldap_delayed_open successful, ld_host is %s\n",
-                       ( ld->ld_host == NULL ) ? "(null)" : ld->ld_host, 0, 0 );
+                       "ldap_open_defconn: successful\n",
+                       0, 0, 0 );
        }
 
        {
        }
 
        {
index 12cb3816638676ba485978f53ffef7c5731fa1a6..8945d957331159d1a61b272e67128582f27ca23b 100644 (file)
@@ -67,6 +67,10 @@ ldap_sasl_bind(
        assert( LDAP_VALID( ld ) );
        assert( msgidp != NULL );
 
        assert( LDAP_VALID( ld ) );
        assert( msgidp != NULL );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        if( msgidp == NULL ) {
                ld->ld_errno = LDAP_PARAM_ERROR;
                return ld->ld_errno;
        if( msgidp == NULL ) {
                ld->ld_errno = LDAP_PARAM_ERROR;
                return ld->ld_errno;
index 2d2071030261cf7545a8e2f6dfd624717a169639..5adb5b8ed2d7aa976264eb91664b6c5df1d1f745 100644 (file)
@@ -91,6 +91,7 @@ ldap_search_ext(
        int sizelimit,
        int *msgidp )
 {
        int sizelimit,
        int *msgidp )
 {
+       int rc;
        BerElement      *ber;
        int timelimit;
 
        BerElement      *ber;
        int timelimit;
 
@@ -99,6 +100,10 @@ ldap_search_ext(
        assert( ld != NULL );
        assert( LDAP_VALID( ld ) );
 
        assert( ld != NULL );
        assert( LDAP_VALID( ld ) );
 
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        /*
         * if timeout is provided, both tv_sec and tv_usec must
         * be non-zero
        /*
         * if timeout is provided, both tv_sec and tv_usec must
         * be non-zero
index a64dfc6b45b17ea6867ea0f8a2eb22efda7a80f5..42506dcd9d4ac2024e181f8d60ad5270d41e9f49 100644 (file)
@@ -599,37 +599,6 @@ main( int argc, char **argv )
                        timeout.tv_sec = atoi( line );
                        break;
 
                        timeout.tv_sec = atoi( line );
                        break;
 
-               case 'U':       /* set ufn search prefix */
-                       getline( line, sizeof(line), stdin, "ufn prefix? " );
-                       ldap_ufn_setprefix( ld, line );
-                       break;
-
-               case 'u':       /* user friendly search w/optional timeout */
-                       getline( dn, sizeof(dn), stdin, "ufn? " );
-                       strcat( dn, dnsuffix );
-                       types = get_list( "attrs to return? " );
-                       getline( line, sizeof(line), stdin,
-                           "attrsonly (0=attrs&values, 1=attrs only)? " );
-                       attrsonly = atoi( line );
-
-                       if ( command2 == 't' ) {
-                               id = ldap_ufn_search_c( ld, dn, types,
-                                   attrsonly, &res, ldap_ufn_timeout,
-                                   &timeout );
-                       } else {
-                               id = ldap_ufn_search_s( ld, dn, types,
-                                   attrsonly, &res );
-                       }
-                       if ( res == NULL )
-                               ldap_perror( ld, "ldap_ufn_search" );
-                       else {
-                               printf( "\nresult: err %d\n", id );
-                               handle_result( ld, res );
-                               res = NULL;
-                       }
-                       free_list( types );
-                       break;
-
                case 'l':       /* URL search */
                        getline( line, sizeof(line), stdin,
                            "attrsonly (0=attrs&values, 1=attrs only)? " );
                case 'l':       /* URL search */
                        getline( line, sizeof(line), stdin,
                            "attrsonly (0=attrs&values, 1=attrs only)? " );
index f74c56ff99299f84862673011f00e3c0d792a8fa..6053ef85cbf062b322c6e15694bc3c9067a1628b 100644 (file)
@@ -553,16 +553,19 @@ BIO_METHOD ldap_pvt_sb_bio_method =
  *             and call again.
  */
 
  *             and call again.
  */
 
-int
-ldap_pvt_tls_connect( LDAP *ld, Sockbuf *sb, void *ctx_arg )
+static int
+ldap_int_tls_connect( LDAP *ld, LDAPConn *conn )
 {
 {
+       Sockbuf *sb = conn->lconn_sb;
+       void *ctx = ld->ld_defconn->lconn_tls_ctx;
+
        int     err;
        SSL     *ssl;
 
        if ( HAS_TLS( sb ) ) {
                ber_sockbuf_ctrl( sb, LBER_SB_OPT_GET_SSL, (void *)&ssl );
        } else {
        int     err;
        SSL     *ssl;
 
        if ( HAS_TLS( sb ) ) {
                ber_sockbuf_ctrl( sb, LBER_SB_OPT_GET_SSL, (void *)&ssl );
        } else {
-               ssl = alloc_handle( ctx_arg );
+               ssl = alloc_handle( ctx );
                if ( ssl == NULL )
                        return -1;
 #ifdef LDAP_DEBUG
                if ( ssl == NULL )
                        return -1;
 #ifdef LDAP_DEBUG
@@ -652,7 +655,7 @@ ldap_pvt_tls_inplace ( Sockbuf *sb )
 }
 
 void *
 }
 
 void *
-ldap_pvt_tls_sb_handle( Sockbuf *sb )
+ldap_pvt_tls_sb_ctx( Sockbuf *sb )
 {
        void                    *p;
        
 {
        void                    *p;
        
@@ -664,12 +667,6 @@ ldap_pvt_tls_sb_handle( Sockbuf *sb )
        return NULL;
 }
 
        return NULL;
 }
 
-void *
-ldap_pvt_tls_get_handle( LDAP *ld )
-{
-       return ldap_pvt_tls_sb_handle( ld->ld_sb );
-}
-
 int
 ldap_pvt_tls_get_strength( void *s )
 {
 int
 ldap_pvt_tls_get_strength( void *s )
 {
@@ -680,7 +677,7 @@ ldap_pvt_tls_get_strength( void *s )
 }
 
 
 }
 
 
-const char *
+char *
 ldap_pvt_tls_get_peer( void *s )
 {
     X509 *x;
 ldap_pvt_tls_get_peer( void *s )
 {
     X509 *x;
@@ -698,12 +695,33 @@ ldap_pvt_tls_get_peer( void *s )
     return p;
 }
 
     return p;
 }
 
+char *
+ldap_pvt_tls_get_peer_dn( void *s )
+{
+       X509 *x;
+       X509_NAME *xn;
+       char buf[2048], *p, *dn;
+
+       x = SSL_get_peer_certificate((SSL *)s);
+
+       if (!x) return NULL;
+    
+       xn = X509_get_subject_name(x);
+       p = X509_NAME_oneline(xn, buf, sizeof(buf));
+
+       dn = ldap_dcedn2dn( p );
+
+       X509_free(x);
+       return dn;
+}
+
 char *
 ldap_pvt_tls_get_peer_hostname( void *s )
 {
        X509 *x;
        X509_NAME *xn;
        char buf[2048], *p;
 char *
 ldap_pvt_tls_get_peer_hostname( void *s )
 {
        X509 *x;
        X509_NAME *xn;
        char buf[2048], *p;
+       int ret;
 
        x = SSL_get_peer_certificate((SSL *)s);
 
 
        x = SSL_get_peer_certificate((SSL *)s);
 
@@ -712,7 +730,8 @@ ldap_pvt_tls_get_peer_hostname( void *s )
        
        xn = X509_get_subject_name(x);
 
        
        xn = X509_get_subject_name(x);
 
-       if ( X509_NAME_get_text_by_NID(xn, NID_commonName, buf, sizeof(buf)) == -1 ) {
+       ret = X509_NAME_get_text_by_NID(xn, NID_commonName, buf, sizeof(buf));
+       if( ret == -1 ) {
                X509_free(x);
                return NULL;
        }
                X509_free(x);
                return NULL;
        }
@@ -745,7 +764,7 @@ ldap_pvt_tls_get_peer_issuer( void *s )
 }
 
 int
 }
 
 int
-ldap_int_tls_config( struct ldapoptions *lo, int option, const char *arg )
+ldap_int_tls_config( LDAP *ld, int option, const char *arg )
 {
        int i;
 
 {
        int i;
 
@@ -756,11 +775,13 @@ ldap_int_tls_config( struct ldapoptions *lo, int option, const char *arg )
        case LDAP_OPT_X_TLS_KEYFILE:
        case LDAP_OPT_X_TLS_RANDOM_FILE:
                return ldap_pvt_tls_set_option( NULL, option, (void *) arg );
        case LDAP_OPT_X_TLS_KEYFILE:
        case LDAP_OPT_X_TLS_RANDOM_FILE:
                return ldap_pvt_tls_set_option( NULL, option, (void *) arg );
+
        case LDAP_OPT_X_TLS_REQUIRE_CERT:
                i = ( ( strcasecmp( arg, "on" ) == 0 ) ||
                      ( strcasecmp( arg, "yes" ) == 0) ||
                      ( strcasecmp( arg, "true" ) == 0 ) );
                return ldap_pvt_tls_set_option( NULL, option, (void *) &i );
        case LDAP_OPT_X_TLS_REQUIRE_CERT:
                i = ( ( strcasecmp( arg, "on" ) == 0 ) ||
                      ( strcasecmp( arg, "yes" ) == 0) ||
                      ( strcasecmp( arg, "true" ) == 0 ) );
                return ldap_pvt_tls_set_option( NULL, option, (void *) &i );
+
        case LDAP_OPT_X_TLS:
                i = -1;
                if ( strcasecmp( arg, "never" ) == 0 )
        case LDAP_OPT_X_TLS:
                i = -1;
                if ( strcasecmp( arg, "never" ) == 0 )
@@ -773,8 +794,10 @@ ldap_int_tls_config( struct ldapoptions *lo, int option, const char *arg )
                        i = LDAP_OPT_X_TLS_TRY ;
                if ( strcasecmp( arg, "hard" ) == 0 )
                        i = LDAP_OPT_X_TLS_HARD ;
                        i = LDAP_OPT_X_TLS_TRY ;
                if ( strcasecmp( arg, "hard" ) == 0 )
                        i = LDAP_OPT_X_TLS_HARD ;
-               if (i >= 0)
-                       return ldap_pvt_tls_set_option( lo, option, &i );
+
+               if (i >= 0) {
+                       return ldap_pvt_tls_set_option( ld, option, &i );
+               }
                return -1;
        }
 
                return -1;
        }
 
@@ -782,17 +805,35 @@ ldap_int_tls_config( struct ldapoptions *lo, int option, const char *arg )
 }
 
 int
 }
 
 int
-ldap_pvt_tls_get_option( struct ldapoptions *lo, int option, void *arg )
+ldap_pvt_tls_get_option( LDAP *ld, int option, void *arg )
 {
 {
+       struct ldapoptions *lo;
+
+       /* Get pointer to global option structure */
+       lo = LDAP_INT_GLOBAL_OPT();   
+       if (NULL == lo) {
+               return LDAP_NO_MEMORY;
+       }
+
+       if(ld != NULL) {
+               assert( LDAP_VALID( ld ) );
+
+               if( !LDAP_VALID( ld ) ) {
+                       return LDAP_OPT_ERROR;
+               }
+
+               lo = &ld->ld_options;
+       }
+
        switch( option ) {
        case LDAP_OPT_X_TLS:
                *(int *)arg = lo->ldo_tls_mode;
                break;
        switch( option ) {
        case LDAP_OPT_X_TLS:
                *(int *)arg = lo->ldo_tls_mode;
                break;
-       case LDAP_OPT_X_TLS_CERT:
-               if ( lo == NULL )
+       case LDAP_OPT_X_TLS_CTX:
+               if ( ld == NULL )
                        *(void **)arg = (void *) tls_def_ctx;
                else
                        *(void **)arg = (void *) tls_def_ctx;
                else
-                       *(void **)arg = lo->ldo_tls_ctx;
+                       *(void **)arg = ld->ld_defconn->lconn_tls_ctx;
                break;
        case LDAP_OPT_X_TLS_CACERTFILE:
                *(char **)arg = tls_opt_cacertfile ?
                break;
        case LDAP_OPT_X_TLS_CACERTFILE:
                *(char **)arg = tls_opt_cacertfile ?
@@ -823,8 +864,26 @@ ldap_pvt_tls_get_option( struct ldapoptions *lo, int option, void *arg )
 }
 
 int
 }
 
 int
-ldap_pvt_tls_set_option( struct ldapoptions *lo, int option, void *arg )
+ldap_pvt_tls_set_option( LDAP *ld, int option, void *arg )
 {
 {
+       struct ldapoptions *lo;
+
+       /* Get pointer to global option structure */
+       lo = LDAP_INT_GLOBAL_OPT();   
+       if (NULL == lo) {
+               return LDAP_NO_MEMORY;
+       }
+
+       if(ld != NULL) {
+               assert( LDAP_VALID( ld ) );
+
+               if( !LDAP_VALID( ld ) ) {
+                       return LDAP_OPT_ERROR;
+               }
+
+               lo = &ld->ld_options;
+       }
+
        switch( option ) {
        case LDAP_OPT_X_TLS:
                switch( *(int *) arg ) {
        switch( option ) {
        case LDAP_OPT_X_TLS:
                switch( *(int *) arg ) {
@@ -841,12 +900,12 @@ ldap_pvt_tls_set_option( struct ldapoptions *lo, int option, void *arg )
                }
                return -1;
 
                }
                return -1;
 
-       case LDAP_OPT_X_TLS_CERT:
-               if ( lo == NULL ) {
+       case LDAP_OPT_X_TLS_CTX:
+               if ( ld == NULL ) {
                        tls_def_ctx = (SSL_CTX *) arg;
 
                } else {
                        tls_def_ctx = (SSL_CTX *) arg;
 
                } else {
-                       lo->ldo_tls_ctx = arg;
+                       ld->ld_defconn->lconn_tls_ctx = arg;
                }
                return 0;
        }
                }
                return 0;
        }
@@ -890,9 +949,13 @@ ldap_pvt_tls_set_option( struct ldapoptions *lo, int option, void *arg )
 }
 
 int
 }
 
 int
-ldap_pvt_tls_start ( LDAP *ld, Sockbuf *sb, void *ctx_arg )
+ldap_int_tls_start ( LDAP *ld, LDAPConn *conn )
 {
 {
-       char *peer_cert_cn, *peer_hostname;
+       Sockbuf *sb = conn->lconn_sb;
+       char *host = conn->lconn_server->lud_host;
+       void *ctx = ld->ld_defconn->lconn_tls_ctx;
+
+       char *peer_cert_cn;
        void *ssl;
 
        (void) ldap_pvt_tls_init();
        void *ssl;
 
        (void) ldap_pvt_tls_init();
@@ -900,14 +963,17 @@ ldap_pvt_tls_start ( LDAP *ld, Sockbuf *sb, void *ctx_arg )
        /*
         * Fortunately, the lib uses blocking io...
         */
        /*
         * Fortunately, the lib uses blocking io...
         */
-       if ( ldap_pvt_tls_connect( ld, sb, ctx_arg ) < 0 ) {
+       if ( ldap_int_tls_connect( ld, conn ) < 0 ) {
                return LDAP_CONNECT_ERROR;
        }
 
                return LDAP_CONNECT_ERROR;
        }
 
-       ssl = (void *) ldap_pvt_tls_sb_handle( sb );
+       ssl = (void *) ldap_pvt_tls_sb_ctx( sb );
+       assert( ssl != NULL );
+
        /* 
        /* 
-        * compare hostname of server with name in certificate 
+        * compare host with name in certificate 
         */
         */
+
        peer_cert_cn = ldap_pvt_tls_get_peer_hostname( ssl );
        if ( !peer_cert_cn ) {
                /* could not get hostname from peer certificate */
        peer_cert_cn = ldap_pvt_tls_get_peer_hostname( ssl );
        if ( !peer_cert_cn ) {
                /* could not get hostname from peer certificate */
@@ -916,30 +982,17 @@ ldap_pvt_tls_start ( LDAP *ld, Sockbuf *sb, void *ctx_arg )
                        0, 0, 0 );
                return LDAP_LOCAL_ERROR;
        }
                        0, 0, 0 );
                return LDAP_LOCAL_ERROR;
        }
-       
-       peer_hostname = ldap_host_connected_to( sb );
-       if ( !peer_hostname ) {
-               /* could not lookup hostname */
-               Debug( LDAP_DEBUG_ANY,
-                       "TLS: unable to reverse lookup peer hostname.\n",
-                       0, 0, 0 );
-               LDAP_FREE( peer_cert_cn );
-               return LDAP_LOCAL_ERROR;
-       }
 
 
-       if ( strcasecmp(peer_hostname, peer_cert_cn) != 0 ) {
+       if ( strcasecmp( host, peer_cert_cn ) != 0 ) {
                Debug( LDAP_DEBUG_ANY, "TLS: hostname (%s) does not match "
                        "common name in certificate (%s).\n", 
                Debug( LDAP_DEBUG_ANY, "TLS: hostname (%s) does not match "
                        "common name in certificate (%s).\n", 
-                       peer_hostname, peer_cert_cn, 0 );
+                       host, peer_cert_cn, 0 );
                LDAP_FREE( peer_cert_cn );
                LDAP_FREE( peer_cert_cn );
-               LDAP_FREE( peer_hostname );
                return LDAP_CONNECT_ERROR;
                return LDAP_CONNECT_ERROR;
-
-       } else {
-               LDAP_FREE( peer_cert_cn );
-               LDAP_FREE( peer_hostname );
        }
 
        }
 
+       LDAP_FREE( peer_cert_cn );
+
        /*
         * set SASL properties to TLS ssf and authid
         */
        /*
         * set SASL properties to TLS ssf and authid
         */
@@ -1128,12 +1181,13 @@ ldap_start_tls_s ( LDAP *ld,
        LDAPControl **serverctrls,
        LDAPControl **clientctrls )
 {
        LDAPControl **serverctrls,
        LDAPControl **clientctrls )
 {
-#ifdef HAVE_TLS
        int rc;
        int rc;
+
+#ifdef HAVE_TLS
        char *rspoid = NULL;
        struct berval *rspdata = NULL;
 
        char *rspoid = NULL;
        struct berval *rspdata = NULL;
 
-       /* XXYYZ: this initiates operaton only on default connection! */
+       /* XXYYZ: this initiates operation only on default connection! */
 
        if ( ldap_pvt_tls_inplace( ld->ld_sb ) != 0 ) {
                return LDAP_LOCAL_ERROR;
 
        if ( ldap_pvt_tls_inplace( ld->ld_sb ) != 0 ) {
                return LDAP_LOCAL_ERROR;
@@ -1153,10 +1207,10 @@ ldap_start_tls_s ( LDAP *ld,
                ber_bvfree( rspdata );
        }
 
                ber_bvfree( rspdata );
        }
 
-       rc = ldap_pvt_tls_start( ld, ld->ld_sb, ld->ld_options.ldo_tls_ctx );
-       return rc;
+       rc = ldap_int_tls_start( ld, ld->ld_defconn );
 #else
 #else
-       return LDAP_NOT_SUPPORTED;
+       rc = LDAP_NOT_SUPPORTED;
 #endif
 #endif
+       return rc;
 }
 
 }
 
diff --git a/libraries/libldap/ufn.c b/libraries/libldap/ufn.c
deleted file mode 100644 (file)
index ec79348..0000000
+++ /dev/null
@@ -1,498 +0,0 @@
-/* $OpenLDAP$ */
-/*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
- */
-/*  Portions
- *  Copyright (c) 1990 Regents of the University of Michigan.
- *  All rights reserved.
- *
- *  ufn.c
- */
-
-#include "portable.h"
-
-#include <stdio.h>
-
-#include <ac/stdlib.h>
-
-#include <ac/socket.h>
-#include <ac/string.h>
-#include <ac/time.h>
-
-#include "ldap-int.h"
-#include "ldap_defaults.h"
-
-typedef int (*cancelptype) LDAP_P(( void *cancelparm ));
-
-/* local functions */
-static int ldap_ufn_search_ctx LDAP_P(( LDAP *ld, char **ufncomp, int ncomp, 
-       char *prefix, char **attrs, int attrsonly, LDAPMessage **res, 
-       cancelptype cancelproc, void *cancelparm, char *tag1, char *tag2,
-       char *tag3 ));
-static LDAPMessage *ldap_msg_merge LDAP_P(( LDAP *ld, LDAPMessage *a, LDAPMessage *b ));
-static LDAPMessage *ldap_ufn_expand LDAP_P(( LDAP *ld, cancelptype cancelproc,
-       void *cancelparm, char **dns, char *filter, int scope,
-       char **attrs, int aonly, int *err ));
-
-/*
- * ldap_ufn_search_ctx - do user friendly searching; provide cancel feature;
- *                     specify ldapfilter.conf tags for each phase of search
- *
- *     ld              LDAP descriptor
- *     ufncomp         the exploded user friendly name to look for
- *     ncomp           number of elements in ufncomp
- *     prefix          where to start searching
- *     attrs           list of attribute types to return for matches
- *     attrsonly       1 => attributes only 0 => attributes and values
- *     res             will contain the result of the search
- *     cancelproc      routine that returns non-zero if operation should be
- *                     cancelled.  This can be a null function pointer.  If
- *                     it is not 0, the routine will be called periodically.
- *     cancelparm      void * that is passed to cancelproc
- *     tag[123]        the ldapfilter.conf tag that will be used in phases
- *                     1, 2, and 3 of the search, respectively
- *
- * Example:
- *     char            *attrs[] = { "mail", "title", 0 };
- *     char            *ufncomp[] = { "howes", "umich", "us", 0 }
- *     LDAPMessage     *res;
- *     error = ldap_ufn_search_ctx( ld, ufncomp, 3, NULL, attrs, attrsonly,
- *                     &res, acancelproc, along, "ufn first",
- *                     "ufn intermediate", "ufn last" );
- */
-
-static int
-ldap_ufn_search_ctx( LDAP *ld, char **ufncomp, int ncomp, char *prefix,
-       char **attrs, int attrsonly, LDAPMessage **res, cancelptype cancelproc,
-       void *cancelparm, char *tag1, char *tag2, char *tag3 )
-{
-       char            *dn, *ftag = NULL;
-       char            **dns = NULL;
-       int             max, i, err, scope = 0, phase, tries;
-       LDAPFiltInfo    *fi;
-       LDAPMessage     *tmpcand;
-       LDAPMessage     *candidates;
-       static char     *objattrs[] = { "objectClass", NULL };
-
-       /* 
-        * look up ufn components from most to least significant.
-        * there are 3 phases.  
-        *      phase 1 search the root for orgs or countries
-        *      phase 2 search for orgs
-        *      phase 3 search for a person
-        * in phases 1 and 2, we are building a list of candidate DNs,
-        * below which we will search for the final component of the ufn.
-        * for each component we try the filters listed in the
-        * filterconfig file, first one-level (except the last compoment),
-        * then subtree.  if any of them produce any results, we go on to
-        * the next component.
-        */
-
-       *res = NULL;
-       candidates = NULL;
-       phase = 1;
-       for ( ncomp--; ncomp != -1; ncomp-- ) {
-               if ( *ufncomp[ncomp] == '"' ) {
-                       char    *quote;
-
-                       if ( (quote = strrchr( ufncomp[ncomp], '"' )) != NULL )
-                               *quote = '\0';
-                       AC_MEMCPY( ufncomp[ncomp], ufncomp[ncomp] + 1,
-                                   strlen( ufncomp[ncomp] + 1 ) + 1 );
-               }
-               if ( ncomp == 0 )
-                       phase = 3;
-
-               switch ( phase ) {
-               case 1:
-                       ftag = tag1;
-                       scope = LDAP_SCOPE_ONELEVEL;
-                       break;
-               case 2:
-                       ftag = tag2;
-                       scope = LDAP_SCOPE_ONELEVEL;
-                       break;
-               case 3:
-                       ftag = tag3;
-                       scope = LDAP_SCOPE_SUBTREE;
-                       break;
-               }
-
-               /*
-                * construct an array of DN's to search below from the
-                * list of candidates.
-                */
-
-               if ( candidates == NULL ) {
-                       if ( prefix != NULL ) {
-                               if ( (dns = (char **) LDAP_MALLOC( sizeof(char *)
-                                   * 2 )) == NULL ) {
-                                       return( ld->ld_errno = LDAP_NO_MEMORY );
-                               }
-                               dns[0] = LDAP_STRDUP( prefix );
-                               dns[1] = NULL;
-                       } else {
-                               dns = NULL;
-                       }
-               } else {
-                       i = 0, max = 0;
-                       for ( tmpcand = candidates; tmpcand != NULL &&
-                           tmpcand->lm_msgtype != LDAP_RES_SEARCH_RESULT;
-                           tmpcand = tmpcand->lm_chain )
-                       {
-                               if ( (dn = ldap_get_dn( ld, tmpcand )) == NULL )
-                                       continue;
-
-                               if ( dns == NULL ) {
-                                       if ( (dns = (char **) LDAP_MALLOC(
-                                           sizeof(char *) * 8 )) == NULL ) {
-                                               ld->ld_errno = LDAP_NO_MEMORY;
-                                               return( LDAP_NO_MEMORY );
-                                       }
-                                       max = 8;
-                               } else if ( i >= max ) {
-                                       if ( (dns = (char **) LDAP_REALLOC( dns,
-                                           sizeof(char *) * 2 * max ))
-                                           == NULL )
-                                       {
-                                               ld->ld_errno = LDAP_NO_MEMORY;
-                                               return( LDAP_NO_MEMORY );
-                                       }
-                                       max *= 2;
-                               }
-                               dns[i++] = dn;
-                               dns[i] = NULL;
-                       }
-                       ldap_msgfree( candidates );
-                       candidates = NULL;
-               }
-               tries = 0;
-       tryagain:
-               tries++;
-               for ( fi = ldap_getfirstfilter( ld->ld_filtd, ftag,
-                   ufncomp[ncomp] ); fi != NULL;
-                   fi = ldap_getnextfilter( ld->ld_filtd ) )
-               {
-                       if ( (candidates = ldap_ufn_expand( ld, cancelproc,
-                           cancelparm, dns, fi->lfi_filter, scope,
-                           phase == 3 ? attrs : objattrs,
-                           phase == 3 ? attrsonly : 1, &err )) != NULL )
-                       {
-                               break;
-                       }
-
-                       if ( err == -1 || err == LDAP_USER_CANCELLED ) {
-                               if ( dns != NULL ) {
-                                       LDAP_VFREE( dns );
-                                       dns = NULL;
-                               }
-                               return( err );
-                       }
-               }
-
-               if ( candidates == NULL ) {
-                       if ( tries < 2 && phase != 3 ) {
-                               scope = LDAP_SCOPE_SUBTREE;
-                               goto tryagain;
-                       } else {
-                               if ( dns != NULL ) {
-                                       LDAP_VFREE( dns );
-                                       dns = NULL;
-                               }
-                               return( err );
-                       }
-               }
-
-               /* go on to the next component */
-               if ( phase == 1 )
-                       phase++;
-               if ( dns != NULL ) {
-                       LDAP_VFREE( dns );
-                       dns = NULL;
-               }
-       }
-       *res = candidates;
-
-       return( err );
-}
-
-int
-ldap_ufn_search_ct(
-       LDAP *ld, LDAP_CONST char *ufn, char **attrs, int attrsonly,
-       LDAPMessage **res, cancelptype cancelproc, void *cancelparm,
-       char *tag1, char *tag2, char *tag3 )
-{
-       char    **ufncomp, **prefixcomp;
-       char    *pbuf;
-       int     ncomp, pcomp, i, err = 0;
-
-       /* initialize the getfilter stuff if it's not already */
-       if ( ld->ld_filtd == NULL && ldap_ufn_setfilter( ld, FILTERFILE )
-           == NULL ) {
-               return( ld->ld_errno = LDAP_LOCAL_ERROR );
-       }
-
-       /* call ldap_explode_dn() to break the ufn into its components */
-       if ( (ufncomp = ldap_explode_dn( ufn, 0 )) == NULL )
-               return( ld->ld_errno = LDAP_LOCAL_ERROR );
-       for ( ncomp = 0; ufncomp[ncomp] != NULL; ncomp++ )
-               ;       /* NULL */
-
-       /* more than two components => try it fully qualified first */
-       if ( ncomp > 2 || ld->ld_ufnprefix == NULL ) {
-               err = ldap_ufn_search_ctx( ld, ufncomp, ncomp, NULL, attrs,
-                   attrsonly, res, cancelproc, cancelparm, tag1, tag2, tag3 );
-
-               if ( ldap_count_entries( ld, *res ) > 0 ) {
-                       LDAP_VFREE( ufncomp );
-                       return( err );
-               } else {
-                       ldap_msgfree( *res );
-                       *res = NULL;
-               }
-       }
-
-       if ( ld->ld_ufnprefix == NULL ) {
-               LDAP_VFREE( ufncomp );
-               return( err );
-       }
-
-       /* if that failed, or < 2 components, use the prefix */
-       if ( (prefixcomp = ldap_explode_dn( ld->ld_ufnprefix, 0 )) == NULL ) {
-               LDAP_VFREE( ufncomp );
-               return( ld->ld_errno = LDAP_LOCAL_ERROR );
-       }
-       for ( pcomp = 0; prefixcomp[pcomp] != NULL; pcomp++ )
-               ;       /* NULL */
-       if ( (pbuf = (char *) LDAP_MALLOC( strlen( ld->ld_ufnprefix ) + 1 ))
-           == NULL ) { 
-               LDAP_VFREE( ufncomp );
-               LDAP_VFREE( prefixcomp );
-               return( ld->ld_errno = LDAP_NO_MEMORY );
-       }
-
-       for ( i = 0; i < pcomp; i++ ) {
-               int     j;
-
-               *pbuf = '\0';
-               for ( j = i; j < pcomp; j++ ) {
-                       strcat( pbuf, prefixcomp[j] );
-                       if ( j + 1 < pcomp )
-                               strcat( pbuf, "," );
-               }
-               err = ldap_ufn_search_ctx( ld, ufncomp, ncomp, pbuf, attrs,
-                   attrsonly, res, cancelproc, cancelparm, tag1, tag2, tag3 );
-
-               if ( ldap_count_entries( ld, *res ) > 0 ) {
-                       break;
-               } else {
-                       ldap_msgfree( *res );
-                       *res = NULL;
-               }
-       }
-
-       LDAP_VFREE( ufncomp );
-       LDAP_VFREE( prefixcomp );
-       LDAP_FREE( pbuf );
-
-       return( err );
-}
-
-/*
- * same as ldap_ufn_search_ct, except without the ability to specify
- * ldapfilter.conf tags.
- */
-int
-ldap_ufn_search_c(
-       LDAP *ld, LDAP_CONST char *ufn, char **attrs, int attrsonly,
-       LDAPMessage **res, cancelptype cancelproc, void *cancelparm )
-{
-       return( ldap_ufn_search_ct( ld, ufn, attrs, attrsonly, res, cancelproc,
-           cancelparm, "ufn first", "ufn intermediate", "ufn last" ) );
-}
-
-/*
- * same as ldap_ufn_search_c without the cancel function
- */
-int
-ldap_ufn_search_s(
-       LDAP *ld, LDAP_CONST char *ufn, char **attrs, int attrsonly,
-       LDAPMessage **res )
-{
-       struct timeval  tv;
-
-       tv.tv_sec = ld->ld_timelimit;
-
-       return( ldap_ufn_search_ct( ld, ufn, attrs, attrsonly, res,
-               ld->ld_timelimit ? ldap_ufn_timeout : NULL,
-               ld->ld_timelimit ? (void *) &tv : NULL,
-               "ufn first", "ufn intermediate", "ufn last" ) );
-}
-
-
-/*
- * ldap_msg_merge - merge two ldap search result chains.  the more
- * serious of the two error result codes is kept.
- */
-
-static LDAPMessage *
-ldap_msg_merge( LDAP *ld, LDAPMessage *a, LDAPMessage *b )
-{
-       LDAPMessage     *end, *aprev, *aend, *bprev, *bend;
-
-       if ( a == NULL )
-               return( b );
-
-       if ( b == NULL )
-               return( a );
-
-       /* find the ends of the a and b chains */
-       aprev = NULL;
-       for ( aend = a; aend->lm_chain != NULL; aend = aend->lm_chain )
-               aprev = aend;
-       bprev = NULL;
-       for ( bend = b; bend->lm_chain != NULL; bend = bend->lm_chain )
-               bprev = bend;
-
-       /* keep result a */
-       if ( ldap_result2error( ld, aend, 0 ) != LDAP_SUCCESS ) {
-               /* remove result b */
-               ldap_msgfree( bend );
-               if ( bprev != NULL )
-                       bprev->lm_chain = NULL;
-               else
-                       b = NULL;
-               end = aend;
-               if ( aprev != NULL )
-                       aprev->lm_chain = NULL;
-               else
-                       a = NULL;
-       /* keep result b */
-       } else {
-               /* remove result a */
-               ldap_msgfree( aend );
-               if ( aprev != NULL )
-                       aprev->lm_chain = NULL;
-               else
-                       a = NULL;
-               end = bend;
-               if ( bprev != NULL )
-                       bprev->lm_chain = NULL;
-               else
-                       b = NULL;
-       }
-
-       if ( (a == NULL && b == NULL) || (a == NULL && bprev == NULL) ||
-           (b == NULL && aprev == NULL) )
-               return( end );
-
-       if ( a == NULL ) {
-               bprev->lm_chain = end;
-               return( b );
-       } else if ( b == NULL ) {
-               aprev->lm_chain = end;
-               return( a );
-       } else {
-               bprev->lm_chain = end;
-               aprev->lm_chain = b;
-               return( a );
-       }
-}
-
-static LDAPMessage *
-ldap_ufn_expand( LDAP *ld, cancelptype cancelproc, void *cancelparm,
-       char **dns, char *filter, int scope, char **attrs, int aonly,
-       int *err )
-{
-       LDAPMessage     *tmpcand, *tmpres;
-       char            *dn;
-       int             i, msgid;
-       struct timeval  tv;
-
-       /* search for this component below the current candidates */
-       tmpcand = NULL;
-       i = 0;
-       do {
-               if ( dns != NULL )
-                       dn = dns[i];
-               else
-                       dn = "";
-
-               if (( msgid = ldap_search( ld, dn, scope, filter, attrs,
-                   aonly )) == -1 ) {
-                       ldap_msgfree( tmpcand );
-                       *err = ld->ld_errno;
-                       return( NULL );
-               }
-
-               tv.tv_sec = 0;
-               tv.tv_usec = 100000;    /* 1/10 of a second */
-
-               do {
-                       *err = ldap_result( ld, msgid, 1, &tv, &tmpres );
-                       if ( *err == 0 && cancelproc != 0 &&
-                           (*cancelproc)( cancelparm ) != 0 ) {
-                               ldap_abandon( ld, msgid );
-                               *err = LDAP_USER_CANCELLED;
-                               ld->ld_errno = LDAP_USER_CANCELLED;
-                       }
-               } while ( *err == 0 );
-
-               if ( *err == LDAP_USER_CANCELLED || *err < 0 ||
-                   ( *err = ldap_result2error( ld, tmpres, 0 )) == -1 ) {
-                       ldap_msgfree( tmpcand );
-                       return( NULL );
-               }
-               
-               tmpcand = ldap_msg_merge( ld, tmpcand, tmpres );
-
-               i++;
-       } while ( dns != NULL && dns[i] != NULL );
-
-       if ( ldap_count_entries( ld, tmpcand ) > 0 ) {
-               return( tmpcand );
-       } else {
-               ldap_msgfree( tmpcand );
-               return( NULL );
-       }
-}
-
-/*
- * ldap_ufn_setfilter - set the filter config file used in ufn searching
- */
-
-LDAPFiltDesc *
-ldap_ufn_setfilter( LDAP *ld, LDAP_CONST char *fname )
-{
-       if ( ld->ld_filtd != NULL )
-               ldap_getfilter_free( ld->ld_filtd );
-
-       return( ld->ld_filtd = ldap_init_getfilter( fname ) );
-}
-
-void
-ldap_ufn_setprefix( LDAP *ld, LDAP_CONST char *prefix )
-{
-       if ( ld->ld_ufnprefix != NULL )
-               LDAP_FREE( ld->ld_ufnprefix );
-
-       ld->ld_ufnprefix = prefix == NULL
-               ? NULL : LDAP_STRDUP( prefix );
-}
-
-int
-ldap_ufn_timeout( void *tvparam )
-{
-       struct timeval  *tv;
-
-       tv = (struct timeval *)tvparam;
-
-       if ( tv->tv_sec != 0 ) {
-               tv->tv_usec = tv->tv_sec * 1000000;     /* sec => micro sec */
-               tv->tv_sec = 0;
-       }
-       tv->tv_usec -= 100000;  /* 1/10 of a second */
-
-       return( tv->tv_usec <= 0 ? 1 : 0 );
-}
index 5c6c324eefbe6d70091ca41abf8b431658e6e1df..0d5f3fe46ac3204488e8d7443cc2514fbb3e6a83 100644 (file)
@@ -34,6 +34,12 @@ ldap_unbind_ext(
        LDAPControl **sctrls,
        LDAPControl **cctrls )
 {
        LDAPControl **sctrls,
        LDAPControl **cctrls )
 {
+       int rc;
+
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
        return ldap_ld_free( ld, 1, sctrls, cctrls );
 }
 
        return ldap_ld_free( ld, 1, sctrls, cctrls );
 }
 
@@ -99,21 +105,6 @@ ldap_ld_free(
                ld->ld_matched = NULL;
        }
 
                ld->ld_matched = NULL;
        }
 
-       if ( ld->ld_host != NULL ) {
-               LDAP_FREE( ld->ld_host );
-               ld->ld_host = NULL;
-       }
-
-       if ( ld->ld_ufnprefix != NULL ) {
-               LDAP_FREE( ld->ld_ufnprefix );
-               ld->ld_ufnprefix = NULL;
-       }
-
-       if ( ld->ld_filtd != NULL ) {
-               ldap_getfilter_free( ld->ld_filtd );
-               ld->ld_filtd = NULL;
-       }
-
        if ( ld->ld_abandoned != NULL ) {
                LDAP_FREE( ld->ld_abandoned );
                ld->ld_abandoned = NULL;
        if ( ld->ld_abandoned != NULL ) {
                LDAP_FREE( ld->ld_abandoned );
                ld->ld_abandoned = NULL;
index 82321679c5f2b81cbf1b70eb2cac4d39bd92d73a..c45eb367f5ecd577688facbb93a3ab3d154445b2 100644 (file)
@@ -12,7 +12,7 @@ PROGRAMS = apitest ltest ttest
 XXDIR = $(srcdir)/../libldap
 XXSRCS = apitest.c test.c tmpltest.c extended.c \
        bind.c controls.c open.c result.c error.c compare.c search.c \
 XXDIR = $(srcdir)/../libldap
 XXSRCS = apitest.c test.c tmpltest.c extended.c \
        bind.c controls.c open.c result.c error.c compare.c search.c \
-       modify.c add.c modrdn.c delete.c abandon.c ufn.c cache.c cyrus.c \
+       modify.c add.c modrdn.c delete.c abandon.c cache.c cyrus.c \
        getfilter.c sasl.c sbind.c kbind.c unbind.c friendly.c \
        free.c disptmpl.c srchpref.c dsparse.c tmplout.c sort.c \
        getdn.c getentry.c getattr.c getvalues.c addentry.c \
        getfilter.c sasl.c sbind.c kbind.c unbind.c friendly.c \
        free.c disptmpl.c srchpref.c dsparse.c tmplout.c sort.c \
        getdn.c getentry.c getattr.c getvalues.c addentry.c \
@@ -28,7 +28,7 @@ OBJS  = threads.lo rdwr.lo tpool.lo  \
        thr_pth.lo thr_stub.lo \
        extended.lo \
        bind.lo controls.lo open.lo result.lo error.lo compare.lo search.lo \
        thr_pth.lo thr_stub.lo \
        extended.lo \
        bind.lo controls.lo open.lo result.lo error.lo compare.lo search.lo \
-       modify.lo add.lo modrdn.lo delete.lo abandon.lo ufn.lo cache.lo cyrus.lo \
+       modify.lo add.lo modrdn.lo delete.lo abandon.lo cache.lo cyrus.lo \
        getfilter.lo sasl.lo sbind.lo kbind.lo unbind.lo friendly.lo \
        free.lo disptmpl.lo srchpref.lo dsparse.lo tmplout.lo sort.lo \
        getdn.lo getentry.lo getattr.lo getvalues.lo addentry.lo \
        getfilter.lo sasl.lo sbind.lo kbind.lo unbind.lo friendly.lo \
        free.lo disptmpl.lo srchpref.lo dsparse.lo tmplout.lo sort.lo \
        getdn.lo getentry.lo getattr.lo getvalues.lo addentry.lo \
index b51659141a24ccfe13a5fb12d7a16c9d12ec0da5..c8790791be00470ea8ecca4f218f5d38941d37ce 100644 (file)
@@ -38,6 +38,33 @@ charray_add(
        (*a)[n] = NULL;
 }
 
        (*a)[n] = NULL;
 }
 
+void
+charray_add_n(
+    char       ***a,
+    const char *s,
+    int         l
+)
+{
+       int     n;
+
+       if ( *a == NULL ) {
+               *a = (char **) ch_malloc( 2 * sizeof(char *) );
+               n = 0;
+       } else {
+               for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
+                       ;       /* NULL */
+               }
+
+               *a = (char **) ch_realloc( (char *) *a,
+                   (n + 2) * sizeof(char *) );
+       }
+
+       (*a)[n] = (char *) ch_malloc( ( l + 1 ) * sizeof( char ) );
+       strncpy( (*a)[n], s, l );
+       (*a)[n][l] = '\0';
+       (*a)[++n] = NULL;
+}
+
 void
 charray_merge(
     char       ***a,
 void
 charray_merge(
     char       ***a,
@@ -151,3 +178,38 @@ str2charray( const char *str_in, const char *brkstr )
        free( str );
        return( res );
 }
        free( str );
        return( res );
 }
+
+
+int
+charray_strcmp( const char **a1, const char **a2 )
+{
+       for ( ; a1[0] && a2[0]; a1++, a2++ ) {
+               if ( strcmp( a1[0], a2[0] ) ) {
+                       return( !0 );
+               }
+       }
+
+       if ( ! ( a1[0] && a2[0] ) ) {
+               return( !0 );
+       }
+
+       return 0;
+}
+
+
+int
+charray_strcasecmp( const char **a1, const char **a2 )
+{
+       for ( ; a1[0] && a2[0]; a1++, a2++ ) {
+               if ( strcasecmp( a1[0], a2[0] ) ) {
+                       return( !0 );
+               }
+       }
+
+       if ( ! ( a1[0] && a2[0] ) ) {
+               return( !0 );
+       }
+
+       return 0;
+}
+
index 262304a514770b265a6c4e134c09bb862caaaef3..bdf06f5335e430d3786858b24869a873e98b1d70 100644 (file)
@@ -94,7 +94,7 @@ do_compare(
                goto cleanup;
        }
 
                goto cleanup;
        }
 
-       if( ndn == '\0' ) {
+       if( *ndn == '\0' ) {
                Debug( LDAP_DEBUG_ANY, "do_compare: root dse!\n", 0, 0, 0 );
                send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM,
                        NULL, "compare upon the root DSE not supported", NULL, NULL );
                Debug( LDAP_DEBUG_ANY, "do_compare: root dse!\n", 0, 0, 0 );
                send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM,
                        NULL, "compare upon the root DSE not supported", NULL, NULL );
index 0d95090815d1662aaaa7be18f199b71fbdff9d6f..2c0b3597f5ad5c7dfcf5512c7d8762cf54c9ae24 100644 (file)
@@ -969,7 +969,7 @@ int connection_read(ber_socket_t s)
                        c->c_needs_tls_accept = 0;
 
                        /* we need to let SASL know */
                        c->c_needs_tls_accept = 0;
 
                        /* we need to let SASL know */
-                       ssl = (void *)ldap_pvt_tls_sb_handle( c->c_sb );
+                       ssl = (void *)ldap_pvt_tls_sb_ctx( c->c_sb );
 
                        c->c_tls_ssf = (slap_ssf_t) ldap_pvt_tls_get_strength( ssl );
                        if( c->c_tls_ssf > c->c_ssf ) {
 
                        c->c_tls_ssf = (slap_ssf_t) ldap_pvt_tls_get_strength( ssl );
                        if( c->c_tls_ssf > c->c_ssf ) {
index c253949f7b5b08af03bb68fc1dd1a11222132dd5..4b6caecdfcde24b453fb889e24ecdebc05d75c67 100644 (file)
@@ -66,7 +66,7 @@ do_delete(
                goto cleanup;
        }
 
                goto cleanup;
        }
 
-       if( ndn == '\0' ) {
+       if( *ndn == '\0' ) {
                Debug( LDAP_DEBUG_ANY, "do_delete: root dse!\n", 0, 0, 0 );
                /* protocolError would likely be a more appropriate error */
                send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM,
                Debug( LDAP_DEBUG_ANY, "do_delete: root dse!\n", 0, 0, 0 );
                /* protocolError would likely be a more appropriate error */
                send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM,
index c70bb2d9af25b02d4f783c18d91fea34f3e64902..6334a7679cc951bfa60cc58d3092ee6e02c1f23e 100644 (file)
@@ -152,7 +152,7 @@ do_modify(
                goto cleanup;
        }
 
                goto cleanup;
        }
 
-       if( ndn == '\0' ) {
+       if( *ndn == '\0' ) {
                Debug( LDAP_DEBUG_ANY, "do_modify: root dse!\n", 0, 0, 0 );
 
                send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM,
                Debug( LDAP_DEBUG_ANY, "do_modify: root dse!\n", 0, 0, 0 );
 
                send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM,
index 7bcf98ecf63bf35daa8d821dc38252ffeeba6475..c4fffbbf84f5eeba6dac806682d45803bbb9d130 100644 (file)
@@ -151,7 +151,7 @@ do_modrdn(
                goto cleanup;
        }
 
                goto cleanup;
        }
 
-       if( ndn == '\0' ) {
+       if( *ndn == '\0' ) {
                Debug( LDAP_DEBUG_ANY, "do_modrdn: root dse!\n", 0, 0, 0 );
                send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM,
                        NULL, "cannot rename the root DSE", NULL, NULL );
                Debug( LDAP_DEBUG_ANY, "do_modrdn: root dse!\n", 0, 0, 0 );
                send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM,
                        NULL, "cannot rename the root DSE", NULL, NULL );
index 97bbab084ac9dd34cbd9fd11cb3a06b1333133b0..b5582e765254f2b22f38f0386dea1bdc53dae7d4 100644 (file)
@@ -75,7 +75,7 @@ starttls_extop (
        }
 
        /* fail if TLS could not be initialized */
        }
 
        /* fail if TLS could not be initialized */
-       if (ldap_pvt_tls_get_option(NULL, LDAP_OPT_X_TLS_CERT, &ctx) != 0
+       if (ldap_pvt_tls_get_option( NULL, LDAP_OPT_X_TLS_CTX, &ctx ) != 0
                || ctx == NULL)
        {
                if (default_referral != NULL) {
                || ctx == NULL)
        {
                if (default_referral != NULL) {