X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fldap-int.h;h=11100f21f71654a01f4ab5a5d92be6869344a9a3;hb=1bd26d5951cc929b0513d569186662650ce598d9;hp=004d68468b16e8dcf46d54cfd4dd865d4baeb761;hpb=5fc22599e2e875c9620b63fbf465273fba3c378f;p=openldap diff --git a/libraries/libldap/ldap-int.h b/libraries/libldap/ldap-int.h index 004d68468b..11100f21f7 100644 --- a/libraries/libldap/ldap-int.h +++ b/libraries/libldap/ldap-int.h @@ -1,11 +1,19 @@ /* ldap-int.h - defines & prototypes internal to the LDAP library */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2005 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ -/* Portions - * Copyright (c) 1995 Regents of the University of Michigan. +/* Portions Copyright (c) 1995 Regents of the University of Michigan. * All rights reserved. */ @@ -18,11 +26,25 @@ #include "../liblber/lber-int.h" +#ifdef LDAP_R_COMPILE +#include +#endif + #ifdef HAVE_CYRUS_SASL /* the need for this should be removed */ +#ifdef HAVE_SASL_SASL_H +#include +#else #include #endif +#define SASL_MAX_BUFF_SIZE 65536 +#define SASL_MIN_BUFF_SIZE 4096 +#endif + +#undef TV2MILLISEC +#define TV2MILLISEC(tv) (((tv)->tv_sec * 1000) + ((tv)->tv_usec/1000)) + /* * Support needed if the library is running in the kernel */ @@ -37,7 +59,7 @@ * Note: Deallocate structure when the process exits */ # define LDAP_INT_GLOBAL_OPT() ldap_int_global_opt() - struct ldapoptions *ldap_int_global_opt(void); + struct ldapoptions *ldap_int_global_opt(void); #else # define LDAP_INT_GLOBAL_OPT() (&ldap_int_global_options) #endif @@ -47,9 +69,25 @@ #include "ldap_log.h" #undef Debug + +#ifdef LDAP_DEBUG + #define Debug( level, fmt, arg1, arg2, arg3 ) \ + do { if ( ldap_debug & level ) \ + ldap_log_printf( NULL, (level), (fmt), (arg1), (arg2), (arg3) ); \ + } while ( 0 ) + +#define LDAP_Debug( subsystem, level, fmt, arg1, arg2, arg3 )\ ldap_log_printf( NULL, (level), (fmt), (arg1), (arg2), (arg3) ) +#else + +#define Debug( level, fmt, arg1, arg2, arg3 ) ((void)0) +#define LDAP_Debug( subsystem, level, fmt, arg1, arg2, arg3 ) ((void)0) + +#endif /* LDAP_DEBUG */ + +#define LDAP_DEPRECATED 1 #include "ldap.h" #include "ldap_pvt.h" @@ -62,12 +100,13 @@ LDAP_BEGIN_DECL #define LDAPS_URL_PREFIX_LEN (sizeof(LDAPS_URL_PREFIX)-1) #define LDAPI_URL_PREFIX "ldapi://" #define LDAPI_URL_PREFIX_LEN (sizeof(LDAPI_URL_PREFIX)-1) +#ifdef LDAP_CONNECTIONLESS +#define LDAPC_URL_PREFIX "cldap://" +#define LDAPC_URL_PREFIX_LEN (sizeof(LDAPC_URL_PREFIX)-1) +#endif #define LDAP_URL_URLCOLON "URL:" #define LDAP_URL_URLCOLON_LEN (sizeof(LDAP_URL_URLCOLON)-1) -#define CLDAP_URL_PREFIX "cldap://" -#define CLDAP_URL_PREFIX_LEN (sizeof(CLDAP_URL_PREFIX)-1) - #define LDAP_REF_STR "Referral:\n" #define LDAP_REF_STR_LEN (sizeof(LDAP_REF_STR)-1) #define LDAP_LDAP_REF_STR LDAP_URL_PREFIX @@ -80,7 +119,7 @@ LDAP_BEGIN_DECL #define LDAP_BOOL_TLS 3 #define LDAP_BOOLEANS unsigned long -#define LDAP_BOOL(n) (1 << (n)) +#define LDAP_BOOL(n) ((LDAP_BOOLEANS)1 << (n)) #define LDAP_BOOL_GET(lo, bool) \ ((lo)->ldo_booleans & LDAP_BOOL(bool) ? -1 : 0) #define LDAP_BOOL_SET(lo, bool) ((lo)->ldo_booleans |= LDAP_BOOL(bool)) @@ -98,6 +137,7 @@ struct ldapmsg { ber_tag_t lm_msgtype; /* the message type */ BerElement *lm_ber; /* the ber encoded message contents */ struct ldapmsg *lm_chain; /* for search - next msg in the resp */ + struct ldapmsg *lm_chain_tail; struct ldapmsg *lm_next; /* next response */ time_t lm_time; /* used to maintain cache */ }; @@ -111,8 +151,14 @@ struct ldapoptions { #define LDAP_UNINITIALIZED 0x0 #define LDAP_INITIALIZED 0x1 #define LDAP_VALID_SESSION 0x2 + int ldo_debug; +#ifdef LDAP_CONNECTIONLESS +#define LDAP_IS_UDP(ld) ((ld)->ld_options.ldo_is_udp) + void* ldo_peer; /* struct sockaddr* */ + char* ldo_cldapdn; + int ldo_is_udp; +#endif - int ldo_debug; /* per API call timeout */ struct timeval *ldo_tm_api; struct timeval *ldo_tm_net; @@ -122,14 +168,25 @@ struct ldapoptions { ber_int_t ldo_timelimit; ber_int_t ldo_sizelimit; +#ifdef HAVE_TLS + int ldo_tls_mode; + LDAP_TLS_CONNECT_CB *ldo_tls_connect_cb; + void* ldo_tls_connect_arg; +#endif + LDAPURLDesc *ldo_defludp; int ldo_defport; char* ldo_defbase; - char* ldo_defbinddn; /* simple bind dn */ + char* ldo_defbinddn; /* bind dn */ -#ifdef LDAP_CONNECTIONLESS - int ldo_cldaptries; /* connectionless search retry count */ - int ldo_cldaptimeout;/* time between retries */ +#ifdef HAVE_CYRUS_SASL + char* ldo_def_sasl_mech; /* SASL Mechanism(s) */ + char* ldo_def_sasl_realm; /* SASL realm */ + char* ldo_def_sasl_authcid; /* SASL authentication identity */ + char* ldo_def_sasl_authzid; /* SASL authorization identity */ + + /* SASL Security Properties */ + struct sasl_security_properties ldo_sasl_secprops; #endif int ldo_refhoplimit; /* limit on referral nesting */ @@ -139,38 +196,28 @@ struct ldapoptions { LDAPControl **ldo_cctrls; /* LDAP rebind callback function */ - LDAP_REBIND_PROC *ldo_rebindproc; + LDAP_REBIND_PROC *ldo_rebind_proc; + void *ldo_rebind_params; + LDAP_NEXTREF_PROC *ldo_nextref_proc; + void *ldo_nextref_params; -#ifdef HAVE_TLS - /* tls context */ - void *ldo_tls_ctx; - int ldo_tls_mode; -#endif -#ifdef HAVE_CYRUS_SASL - struct sasl_security_properties ldo_sasl_secprops; - LDAP_SASL_INTERACT_PROC *ldo_sasl_interact; -#endif 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; - void *lconn_sasl_ctx; +#ifdef HAVE_TLS + /* tls context */ + void *lconn_tls_ctx; +#endif +#ifdef HAVE_CYRUS_SASL + void *lconn_sasl_authctx; /* context for bind */ + void *lconn_sasl_sockctx; /* for security layer */ +#endif int lconn_refcnt; time_t lconn_lastused; /* time */ int lconn_rebind_inprogress; /* set if rebind in progress */ @@ -180,9 +227,12 @@ typedef struct ldap_conn { #define LDAP_CONNST_CONNECTING 2 #define LDAP_CONNST_CONNECTED 3 LDAPURLDesc *lconn_server; +#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND char *lconn_krbinstance; - struct ldap_conn *lconn_next; - BerElement *lconn_ber;/* ber receiving on this conn. */ +#endif + BerElement *lconn_ber; /* ber receiving on this conn. */ + + struct ldap_conn *lconn_next; } LDAPConn; @@ -207,6 +257,7 @@ typedef struct ldapreq { BerElement *lr_ber; /* ber encoded request contents */ LDAPConn *lr_conn; /* connection used to send request */ struct ldapreq *lr_parent; /* request that spawned this referral */ + struct ldapreq *lr_child; /* first child request */ struct ldapreq *lr_refnext; /* next referral spawned */ struct ldapreq *lr_prev; /* previous request */ struct ldapreq *lr_next; /* next request */ @@ -237,12 +288,6 @@ typedef struct ldapreqinfo { char *ri_url; } LDAPreqinfo; -/* - * handy macro for checking if handle is connectionless - */ - -#define LDAP_IS_CLDAP(ld) ((ld)->ld_cldapnaddr>0) - /* * structure representing an ldap connection */ @@ -264,41 +309,37 @@ struct ldap { #define ld_defhost ld_options.ldo_defhost #define ld_defport ld_options.ldo_defport -#define ld_cldaptries ld_options.ldo_cldaptries -#define ld_cldaptimeout ld_options.ldo_cldaptimeout #define ld_refhoplimit ld_options.ldo_refhoplimit #define ld_sctrls ld_options.ldo_sctrls #define ld_cctrls ld_options.ldo_cctrls -#define ld_rebindproc ld_options.ldo_rebindproc +#define ld_rebind_proc ld_options.ldo_rebind_proc +#define ld_rebind_params ld_options.ldo_rebind_params +#define ld_nextref_proc ld_options.ldo_nextref_proc +#define ld_nextref_params ld_options.ldo_nextref_params #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 */ - char *ld_ufnprefix; /* for incomplete ufn's */ - ber_int_t ld_errno; char *ld_error; char *ld_matched; + char **ld_referrals; ber_len_t ld_msgid; /* do not mess with these */ LDAPRequest *ld_requests; /* list of outstanding requests */ LDAPMessage *ld_responses; /* list of outstanding responses */ +#ifdef LDAP_R_COMPILE + ldap_pvt_thread_mutex_t ld_req_mutex; + ldap_pvt_thread_mutex_t ld_res_mutex; +#endif + ber_int_t *ld_abandoned; /* array of abandoned requests */ LDAPCache *ld_cache; /* non-null if cache is initialized */ - /* stuff used by connectionless searches. */ - - char *ld_cldapdn; /* DN used in connectionless search */ - int ld_cldapnaddr; /* number of addresses */ - void **ld_cldapaddrs;/* addresses to send request to */ /* do not mess with the rest though */ @@ -308,10 +349,22 @@ struct ldap { }; #define LDAP_VALID(ld) ( (ld)->ld_valid == LDAP_VALID_SESSION ) -#if defined(HAVE_RES_QUERY) && defined(LDAP_R_COMPILE) -#include +#ifdef LDAP_R_COMPILE LDAP_V ( ldap_pvt_thread_mutex_t ) ldap_int_resolv_mutex; -#endif /* HAVE_RES_QUERY && LDAP_R_COMPILE */ + +#ifdef HAVE_CYRUS_SASL +LDAP_V( ldap_pvt_thread_mutex_t ) ldap_int_sasl_mutex; +#endif +#endif + +#ifdef LDAP_R_COMPILE +#define LDAP_NEXT_MSGID(ld, id) \ + ldap_pvt_thread_mutex_lock( &(ld)->ld_req_mutex ); \ + id = ++(ld)->ld_msgid; \ + ldap_pvt_thread_mutex_unlock( &(ld)->ld_req_mutex ) +#else +#define LDAP_NEXT_MSGID(ld, id) id = ++(ld)->ld_msgid +#endif /* * in init.c @@ -325,19 +378,26 @@ LDAP_F ( void ) ldap_int_initialize_global_options LDAP_P(( /* memory.c */ /* simple macros to realloc for now */ -#define LDAP_INT_MALLOC(s) (LBER_MALLOC((s))) -#define LDAP_INT_CALLOC(n,s) (LBER_CALLOC((n),(s))) -#define LDAP_INT_REALLOC(p,s) (LBER_REALLOC((p),(s))) -#define LDAP_INT_FREE(p) (LBER_FREE((p))) -#define LDAP_INT_VFREE(v) (LBER_VFREE((void **)(v))) -#define LDAP_INT_STRDUP(s) (LBER_STRDUP((s))) - -#define LDAP_MALLOC(s) (LBER_MALLOC((s))) -#define LDAP_CALLOC(n,s) (LBER_CALLOC((n),(s))) -#define LDAP_REALLOC(p,s) (LBER_REALLOC((p),(s))) -#define LDAP_FREE(p) (LBER_FREE((p))) -#define LDAP_VFREE(v) (LBER_VFREE((void **)(v))) -#define LDAP_STRDUP(s) (LBER_STRDUP((s))) +#define LDAP_MALLOC(s) (ber_memalloc_x((s),NULL)) +#define LDAP_CALLOC(n,s) (ber_memcalloc_x((n),(s),NULL)) +#define LDAP_REALLOC(p,s) (ber_memrealloc_x((p),(s),NULL)) +#define LDAP_FREE(p) (ber_memfree_x((p),NULL)) +#define LDAP_VFREE(v) (ber_memvfree_x((void **)(v),NULL)) +#define LDAP_STRDUP(s) (ber_strdup_x((s),NULL)) +#define LDAP_STRNDUP(s,l) (ber_strndup_x((s),(l),NULL)) + +#define LDAP_MALLOCX(s,x) (ber_memalloc_x((s),(x))) +#define LDAP_CALLOCX(n,s,x) (ber_memcalloc_x((n),(s),(x))) +#define LDAP_REALLOCX(p,s,x) (ber_memrealloc_x((p),(s),(x))) +#define LDAP_FREEX(p,x) (ber_memfree_x((p),(x))) +#define LDAP_VFREEX(v,x) (ber_memvfree_x((void **)(v),(x))) +#define LDAP_STRDUPX(s,x) (ber_strdup_x((s),(x))) +#define LDAP_STRNDUPX(s,l,x) (ber_strndup_x((s),(l),(x))) + +/* + * in error.c + */ +LDAP_F (void) ldap_int_error_init( void ); /* * in unit-int.c @@ -361,26 +421,13 @@ LDAP_F (int) ldap_check_cache LDAP_P(( LDAP *ld, ber_tag_t msgtype, BerElement * /* * in controls.c */ -LDAP_F (LDAPControl *) ldap_control_dup LDAP_P(( - const LDAPControl *ctrl )); - -LDAP_F (LDAPControl **) ldap_controls_dup LDAP_P(( - LDAPControl *const *ctrls )); - -LDAP_F (int) ldap_int_get_controls LDAP_P(( - BerElement *be, - LDAPControl ***ctrlsp)); - LDAP_F (int) ldap_int_put_controls LDAP_P(( LDAP *ld, LDAPControl *const *ctrls, BerElement *ber )); -LDAP_F( int ) -ldap_int_create_control LDAP_P(( - const char *requestOID, - BerElement *ber, - int iscritical, +LDAP_F (int) ldap_int_client_controls LDAP_P(( + LDAP *ld, LDAPControl **ctrlp )); /* @@ -411,19 +458,24 @@ LDAP_F (int) ldap_int_open_connection( LDAP *ld, /* * in os-ip.c */ -LDAP_F (int) ldap_int_tblsize; -LDAP_F (int) ldap_int_timeval_dup( struct timeval **dest, const struct timeval *tm ); +#ifndef HAVE_POLL +LDAP_V (int) ldap_int_tblsize; +LDAP_F (void) ldap_int_ip_init( void ); +#endif + +LDAP_F (int) ldap_int_timeval_dup( struct timeval **dest, + const struct timeval *tm ); 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, 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 ); -#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND */ +LDAP_F (char *) ldap_host_connected_to( Sockbuf *sb, + const char *host ); +#endif -LDAP_F (void) ldap_int_ip_init( void ); -LDAP_F (int) do_ldap_select( LDAP *ld, struct timeval *timeout ); +LDAP_F (int) ldap_int_select( LDAP *ld, struct timeval *timeout ); LDAP_F (void *) ldap_new_select_info( void ); LDAP_F (void) ldap_free_select_info( void *sip ); LDAP_F (void) ldap_mark_select_write( LDAP *ld, Sockbuf *sb ); @@ -435,16 +487,16 @@ LDAP_F (int) ldap_is_write_ready( LDAP *ld, Sockbuf *sb ); /* * in os-local.c */ -#ifdef LDAP_PF_UNIX -LDAP_F (int) ldap_connect_to_path( LDAP *ld, Sockbuf *sb, int proto, +#ifdef LDAP_PF_LOCAL +LDAP_F (int) ldap_connect_to_path( LDAP *ld, Sockbuf *sb, const char *path, int async ); -#endif /* LDAP_PF_UNIX */ +#endif /* LDAP_PF_LOCAL */ /* * in request.c */ LDAP_F (ber_int_t) ldap_send_initial_request( LDAP *ld, ber_tag_t msgtype, - const char *dn, BerElement *ber ); + const char *dn, BerElement *ber, ber_int_t msgid ); LDAP_F (BerElement *) ldap_alloc_ber_with_options( LDAP *ld ); LDAP_F (void) ldap_set_ber_options( LDAP *ld, BerElement *ber ); @@ -455,16 +507,16 @@ LDAP_F (void) ldap_free_request( LDAP *ld, LDAPRequest *lr ); LDAP_F (void) ldap_free_connection( LDAP *ld, LDAPConn *lc, int force, int unbind ); LDAP_F (void) ldap_dump_connection( LDAP *ld, LDAPConn *lconns, int all ); LDAP_F (void) ldap_dump_requests_and_responses( LDAP *ld ); -LDAP_F (int) ldap_chase_referrals( LDAP *ld, LDAPRequest *lr, char **errstrp, int *hadrefp ); -LDAP_F (int) ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, char **referralsp, int *hadrefp ); +LDAP_F (int) ldap_chase_referrals( LDAP *ld, LDAPRequest *lr, + char **errstrp, int sref, int *hadrefp ); +LDAP_F (int) ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, + char **refs, int sref, char **referralsp, int *hadrefp ); LDAP_F (int) ldap_append_referral( LDAP *ld, char **referralsp, char *s ); +LDAP_F (int) ldap_int_flush_request( LDAP *ld, LDAPRequest *lr ); /* * in result.c: */ -#ifdef LDAP_CONNECTIONLESS -LDAP_F (int) cldap_getmsg( LDAP *ld, struct timeval *timeout, BerElement *ber ); -#endif LDAP_F (char *) ldap_int_msgtype2str( ber_tag_t tag ); /* @@ -480,12 +532,9 @@ LDAP_F (BerElement *) ldap_build_search_req LDAP_P(( LDAPControl **sctrls, LDAPControl **cctrls, ber_int_t timelimit, - ber_int_t sizelimit )); + ber_int_t sizelimit, + ber_int_t *msgidp)); -/* - * in string.c - */ - /* see */ /* * in unbind.c @@ -515,9 +564,15 @@ LDAP_F (int) ldap_url_parselist LDAP_P(( LDAPURLDesc **ludlist, const char *url )); +LDAP_F (int) ldap_url_parselist_ext LDAP_P(( + LDAPURLDesc **ludlist, + const char *url, + const char *sep )); + LDAP_F (int) ldap_url_parsehosts LDAP_P(( LDAPURLDesc **ludlist, - const char *hosts )); + const char *hosts, + int port )); LDAP_F (char *) ldap_url_list2hosts LDAP_P(( LDAPURLDesc *ludlist )); @@ -531,13 +586,18 @@ LDAP_F (void) ldap_free_urllist LDAP_P(( /* * in cyrus.c */ + LDAP_F (int) ldap_int_sasl_init LDAP_P(( void )); LDAP_F (int) ldap_int_sasl_open LDAP_P(( LDAP *ld, LDAPConn *conn, - const char* host, ber_len_t ssf )); + const char* host )); LDAP_F (int) ldap_int_sasl_close LDAP_P(( LDAP *ld, LDAPConn *conn )); +LDAP_F (int) ldap_int_sasl_external LDAP_P(( + LDAP *ld, LDAPConn *conn, + const char* authid, ber_len_t ssf )); + LDAP_F (int) ldap_int_sasl_get_option LDAP_P(( LDAP *ld, int option, void *arg )); LDAP_F (int) ldap_int_sasl_set_option LDAP_P(( LDAP *ld, @@ -546,13 +606,36 @@ 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(( - struct ldap *, LDAP_CONST char *, - const char *, LDAPControl **, LDAPControl ** )); + LDAP *ld, + const char *, + const char *, + LDAPControl **, LDAPControl **, + + /* should be passed in client controls */ + unsigned flags, + LDAP_SASL_INTERACT_PROC *interact, + void *defaults )); + +/* in schema.c */ +LDAP_F (char *) ldap_int_parse_numericoid LDAP_P(( + const char **sp, + int *code, + const int flags )); /* * 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, LDAPURLDesc *srv )); + +/* + * in getvalues.c + */ +LDAP_F (char **) ldap_value_dup LDAP_P(( + char *const *vals )); LDAP_END_DECL