24 #define LDAP_THREAD_SAFE 1
28 #include "../ldapber/lber-int.h"
30 #include "../liblber/lber-int.h"
34 #include <ldap_pvt_thread.h>
37 #ifdef HAVE_CYRUS_SASL
39 #ifdef HAVE_SASL_SASL_H
40 #include <sasl/sasl.h>
45 #define SASL_MAX_BUFF_SIZE (0xffffff)
46 #define SASL_MIN_BUFF_SIZE 4096
53 #define TV2MILLISEC(tv) (((tv)->tv_sec * 1000) + ((tv)->tv_usec/1000))
58 #if LDAP_INT_IN_KERNEL
68 # define LDAP_INT_GLOBAL_OPT() ldap_int_global_opt()
71 # define LDAP_INT_GLOBAL_OPT() (&ldap_int_global_options)
74 #define ldap_debug ((LDAP_INT_GLOBAL_OPT())->ldo_debug)
82 #define Debug( level, fmt, arg1, arg2, arg3 ) \
83 do { if ( ldap_debug & level ) \
84 ldap_log_printf( NULL, (level), (fmt), (arg1), (arg2), (arg3) ); \
87 #define LDAP_Debug( subsystem, level, fmt, arg1, arg2, arg3 )\
88 ldap_log_printf( NULL, (level), (fmt), (arg1), (arg2), (arg3) )
92 #define Debug( level, fmt, arg1, arg2, arg3 ) ((void)0)
93 #define LDAP_Debug( subsystem, level, fmt, arg1, arg2, arg3 ) ((void)0)
97 #define LDAP_DEPRECATED 1
100 #include "ldap_pvt.h"
104 #define LDAP_URL_PREFIX "ldap://"
105 #define LDAP_URL_PREFIX_LEN STRLENOF(LDAP_URL_PREFIX)
106 #define LDAPS_URL_PREFIX "ldaps://"
107 #define LDAPS_URL_PREFIX_LEN STRLENOF(LDAPS_URL_PREFIX)
108 #define LDAPI_URL_PREFIX "ldapi://"
109 #define LDAPI_URL_PREFIX_LEN STRLENOF(LDAPI_URL_PREFIX)
110 #ifdef LDAP_CONNECTIONLESS
111 #define LDAPC_URL_PREFIX "cldap://"
112 #define LDAPC_URL_PREFIX_LEN STRLENOF(LDAPC_URL_PREFIX)
114 #define LDAP_URL_URLCOLON "URL:"
115 #define LDAP_URL_URLCOLON_LEN STRLENOF(LDAP_URL_URLCOLON)
117 #define LDAP_REF_STR "Referral:\n"
118 #define LDAP_REF_STR_LEN STRLENOF(LDAP_REF_STR)
119 #define LDAP_LDAP_REF_STR LDAP_URL_PREFIX
120 #define LDAP_LDAP_REF_STR_LEN LDAP_URL_PREFIX_LEN
122 #define LDAP_DEFAULT_REFHOPLIMIT 5
124 #define LDAP_BOOL_REFERRALS 0
125 #define LDAP_BOOL_RESTART 1
126 #define LDAP_BOOL_TLS 3
127 #define LDAP_BOOL_CONNECT_ASYNC 4
129 #define LDAP_BOOLEANS unsigned long
130 #define LDAP_BOOL(n) ((LDAP_BOOLEANS)1 << (n))
131 #define LDAP_BOOL_GET(lo, bool) \
132 ((lo)->ldo_booleans & LDAP_BOOL(bool) ? -1 : 0)
133 #define LDAP_BOOL_SET(lo, bool) ((lo)->ldo_booleans |= LDAP_BOOL(bool))
134 #define LDAP_BOOL_CLR(lo, bool) ((lo)->ldo_booleans &= ~LDAP_BOOL(bool))
135 #define LDAP_BOOL_ZERO(lo) ((lo)->ldo_booleans = 0)
145 ber_tag_t lm_msgtype;
160 char *lt_ciphersuite;
173 #define LDAP_UNINITIALIZED 0x0
174 #define LDAP_INITIALIZED 0x1
175 #define LDAP_VALID_SESSION 0x2
176 #define LDAP_TRASHED_SESSION 0xFF
178 #ifdef LDAP_CONNECTIONLESS
179 #define LDAP_IS_UDP(ld) ((ld)->ld_options.ldo_is_udp)
186 struct timeval ldo_tm_api;
187 struct timeval ldo_tm_net;
189 ber_int_t ldo_version;
191 ber_int_t ldo_timelimit;
192 ber_int_t ldo_sizelimit;
197 LDAP_TLS_CONNECT_CB *ldo_tls_connect_cb;
198 void* ldo_tls_connect_arg;
199 struct ldaptls ldo_tls_info;
200 #define ldo_tls_certfile ldo_tls_info.lt_certfile
201 #define ldo_tls_keyfile ldo_tls_info.lt_keyfile
202 #define ldo_tls_dhfile ldo_tls_info.lt_dhfile
203 #define ldo_tls_cacertfile ldo_tls_info.lt_cacertfile
204 #define ldo_tls_cacertdir ldo_tls_info.lt_cacertdir
205 #define ldo_tls_ciphersuite ldo_tls_info.lt_ciphersuite
206 #define ldo_tls_crlfile ldo_tls_info.lt_crlfile
208 int ldo_tls_require_cert;
209 #ifdef HAVE_OPENSSL_CRL
210 int ldo_tls_crlcheck;
219 #ifdef HAVE_CYRUS_SASL
220 char* ldo_def_sasl_mech;
221 char* ldo_def_sasl_realm;
222 char* ldo_def_sasl_authcid;
223 char* ldo_def_sasl_authzid;
226 struct sasl_security_properties ldo_sasl_secprops;
236 LDAP_REBIND_PROC *ldo_rebind_proc;
237 void *ldo_rebind_params;
238 LDAP_NEXTREF_PROC *ldo_nextref_proc;
239 void *ldo_nextref_params;
240 LDAP_URLLIST_PROC *ldo_urllist_proc;
241 void *ldo_urllist_params;
243 LDAP_BOOLEANS ldo_booleans;
252 #ifdef HAVE_CYRUS_SASL
253 void *lconn_sasl_authctx;
254 void *lconn_sasl_sockctx;
257 time_t lconn_created;
258 time_t lconn_lastused;
259 int lconn_rebind_inprogress;
260 char ***lconn_rebind_queue;
262 #define LDAP_CONNST_NEEDSOCKET 1
263 #define LDAP_CONNST_CONNECTING 2
264 #define LDAP_CONNST_CONNECTED 3
278 #define LDAP_REQST_COMPLETED 0
279 #define LDAP_REQST_INPROGRESS 1
280 #define LDAP_REQST_CHASINGREFS 2
281 #define LDAP_REQST_NOTCONNECTED 3
282 #define LDAP_REQST_WRITING 4
288 ber_tag_t lr_res_msgtype;
289 ber_int_t lr_res_errno;
291 char *lr_res_matched;
305 #define LDAP_CACHE_BUCKETS 31
311 ber_len_t lc_memused;
313 unsigned long lc_options;
314 #define LDAP_CACHE_OPT_CACHENOERRS 0x00000001
315 #define LDAP_CACHE_OPT_CACHEALLERRS 0x00000002
336 #define ld_valid ld_options.ldo_valid
337 #define ld_debug ld_options.ldo_debug
339 #define ld_deref ld_options.ldo_deref
340 #define ld_timelimit ld_options.ldo_timelimit
341 #define ld_sizelimit ld_options.ldo_sizelimit
343 #define ld_defbinddn ld_options.ldo_defbinddn
344 #define ld_defbase ld_options.ldo_defbase
345 #define ld_defhost ld_options.ldo_defhost
346 #define ld_defport ld_options.ldo_defport
348 #define ld_refhoplimit ld_options.ldo_refhoplimit
350 #define ld_sctrls ld_options.ldo_sctrls
351 #define ld_cctrls ld_options.ldo_cctrls
352 #define ld_rebind_proc ld_options.ldo_rebind_proc
353 #define ld_rebind_params ld_options.ldo_rebind_params
354 #define ld_nextref_proc ld_options.ldo_nextref_proc
355 #define ld_nextref_params ld_options.ldo_nextref_params
356 #define ld_urllist_proc ld_options.ldo_urllist_proc
357 #define ld_urllist_params ld_options.ldo_urllist_params
359 #define ld_version ld_options.ldo_version
361 unsigned short ld_lberoptions;
373 #ifdef LDAP_R_COMPILE
374 ldap_pvt_thread_mutex_t ld_conn_mutex;
375 ldap_pvt_thread_mutex_t ld_req_mutex;
376 ldap_pvt_thread_mutex_t ld_res_mutex;
379 ber_len_t ld_nabandoned;
380 ber_int_t *ld_abandoned;
390 #define LDAP_VALID(ld) ( (ld)->ld_valid == LDAP_VALID_SESSION )
391 #define LDAP_TRASHED(ld) ( (ld)->ld_valid == LDAP_TRASHED_SESSION )
392 #define LDAP_TRASH(ld) ( (ld)->ld_valid = LDAP_TRASHED_SESSION )
394 #ifdef LDAP_R_COMPILE
395 LDAP_V ( ldap_pvt_thread_mutex_t ) ldap_int_resolv_mutex;
397 #ifdef HAVE_CYRUS_SASL
398 LDAP_V( ldap_pvt_thread_mutex_t ) ldap_int_sasl_mutex;
402 #ifdef LDAP_R_COMPILE
403 #define LDAP_NEXT_MSGID(ld, id) \
404 ldap_pvt_thread_mutex_lock( &(ld)->ld_req_mutex ); \
405 id = ++(ld)->ld_msgid; \
406 ldap_pvt_thread_mutex_unlock( &(ld)->ld_req_mutex )
408 #define LDAP_NEXT_MSGID(ld, id) id = ++(ld)->ld_msgid
416 ldap_int_bisect_find( ber_int_t *v, ber_len_t n, ber_int_t
id,
int *idxp );
418 ldap_int_bisect_insert( ber_int_t **vp, ber_len_t *np,
int id,
int idx );
420 ldap_int_bisect_delete( ber_int_t **vp, ber_len_t *np,
int id,
int idx );
426 LDAP_V ( struct
ldapoptions ) ldap_int_global_options;
428 LDAP_F (
void ) ldap_int_initialize LDAP_P((struct
ldapoptions *,
int *));
429 LDAP_F (
void ) ldap_int_initialize_global_options LDAP_P((
430 struct ldapoptions *,
int *));
434 #define LDAP_MALLOC(s) (ber_memalloc_x((s),NULL))
435 #define LDAP_CALLOC(n,s) (ber_memcalloc_x((n),(s),NULL))
436 #define LDAP_REALLOC(p,s) (ber_memrealloc_x((p),(s),NULL))
437 #define LDAP_FREE(p) (ber_memfree_x((p),NULL))
438 #define LDAP_VFREE(v) (ber_memvfree_x((void **)(v),NULL))
439 #define LDAP_STRDUP(s) (ber_strdup_x((s),NULL))
440 #define LDAP_STRNDUP(s,l) (ber_strndup_x((s),(l),NULL))
442 #define LDAP_MALLOCX(s,x) (ber_memalloc_x((s),(x)))
443 #define LDAP_CALLOCX(n,s,x) (ber_memcalloc_x((n),(s),(x)))
444 #define LDAP_REALLOCX(p,s,x) (ber_memrealloc_x((p),(s),(x)))
445 #define LDAP_FREEX(p,x) (ber_memfree_x((p),(x)))
446 #define LDAP_VFREEX(v,x) (ber_memvfree_x((void **)(v),(x)))
447 #define LDAP_STRDUPX(s,x) (ber_strdup_x((s),(x)))
448 #define LDAP_STRNDUPX(s,l,x) (ber_strndup_x((s),(l),(x)))
453 LDAP_F (
void) ldap_int_error_init(
void );
458 LDAP_F (
void) ldap_int_utils_init LDAP_P((
void ));
464 LDAP_F (
int) ldap_log_printf LDAP_P((
LDAP *ld,
int level, const
char *fmt, ...)) LDAP_GCCATTR((format(printf, 3, 4)));
469 LDAP_F (
void) ldap_add_request_to_cache LDAP_P((
LDAP *ld, ber_tag_t msgtype,
471 LDAP_F (
void) ldap_add_result_to_cache LDAP_P((
LDAP *ld,
LDAPMessage *result ));
472 LDAP_F (
int) ldap_check_cache LDAP_P((
LDAP *ld, ber_tag_t msgtype,
BerElement *request ));
477 LDAP_F (
int) ldap_int_put_controls LDAP_P((
482 LDAP_F (
int) ldap_int_client_controls LDAP_P((
489 LDAP_F (
int) ldap_int_next_line_tokens LDAP_P((
char **bufp, ber_len_t *blenp,
char ***toksp ));
495 LDAP_F (
int) ldap_open_defconn(
LDAP *ld );
496 LDAP_F (
int) ldap_int_open_connection(
LDAP *ld,
503 LDAP_V (
int) ldap_int_tblsize;
504 LDAP_F (
void) ldap_int_ip_init(
void );
507 LDAP_F (
int) ldap_int_timeval_dup( struct timeval **dest,
508 const struct timeval *tm );
509 LDAP_F (
int) ldap_connect_to_host(
LDAP *ld,
Sockbuf *sb,
510 int proto, const
char *host,
int port,
int async );
511 LDAP_F (
int) ldap_int_poll(
LDAP *ld, ber_socket_t s,
512 struct timeval *tvp );
514 #if defined(HAVE_TLS) || defined(HAVE_CYRUS_SASL)
515 LDAP_V (
char *) ldap_int_hostname;
516 LDAP_F (
char *) ldap_host_connected_to(
Sockbuf *sb,
520 LDAP_F (
int) ldap_int_select(
LDAP *ld, struct timeval *timeout );
521 LDAP_F (
void *) ldap_new_select_info(
void );
522 LDAP_F (
void) ldap_free_select_info(
void *sip );
523 LDAP_F (
void) ldap_mark_select_write(
LDAP *ld,
Sockbuf *sb );
524 LDAP_F (
void) ldap_mark_select_read(
LDAP *ld,
Sockbuf *sb );
525 LDAP_F (
void) ldap_mark_select_clear(
LDAP *ld,
Sockbuf *sb );
526 LDAP_F (
int) ldap_is_read_ready(
LDAP *ld,
Sockbuf *sb );
527 LDAP_F (
int) ldap_is_write_ready(
LDAP *ld,
Sockbuf *sb );
533 LDAP_F (
int) ldap_connect_to_path(
LDAP *ld,
Sockbuf *sb,
534 const
char *path,
int async );
540 LDAP_F (ber_int_t) ldap_send_initial_request(
LDAP *ld, ber_tag_t msgtype,
541 const
char *dn,
BerElement *ber, ber_int_t msgid );
547 LDAP_F (
LDAPRequest *) ldap_find_request_by_msgid(
LDAP *ld, ber_int_t msgid );
548 LDAP_F (
void) ldap_return_request(
LDAP *ld,
LDAPRequest *lr,
int freeit );
550 LDAP_F (
void) ldap_free_connection(
LDAP *ld,
LDAPConn *lc,
int force,
int unbind );
551 LDAP_F (
void) ldap_dump_connection(
LDAP *ld,
LDAPConn *lconns,
int all );
552 LDAP_F (
void) ldap_dump_requests_and_responses(
LDAP *ld );
554 char **errstrp,
int sref,
int *hadrefp );
556 char **refs,
int sref,
char **referralsp,
int *hadrefp );
557 LDAP_F (
int) ldap_append_referral(
LDAP *ld,
char **referralsp,
char *s );
563 LDAP_F (const
char *) ldap_int_msgtype2str( ber_tag_t tag );
568 LDAP_F (
BerElement *) ldap_build_search_req LDAP_P((
585 LDAP_F (
int) ldap_ld_free LDAP_P((
591 LDAP_F (
int) ldap_send_unbind LDAP_P((
606 LDAP_F (
int) ldap_url_parsehosts LDAP_P((
611 LDAP_F (
char *) ldap_url_list2hosts LDAP_P((
618 LDAP_F (
int) ldap_int_sasl_init LDAP_P((
void ));
620 LDAP_F (
int) ldap_int_sasl_open LDAP_P((
623 LDAP_F (
int) ldap_int_sasl_close LDAP_P((
LDAP *ld,
LDAPConn *conn ));
625 LDAP_F (
int) ldap_int_sasl_external LDAP_P((
627 const
char* authid, ber_len_t ssf ));
629 LDAP_F (
int) ldap_int_sasl_get_option LDAP_P((
LDAP *ld,
630 int option,
void *arg ));
631 LDAP_F (
int) ldap_int_sasl_set_option LDAP_P((
LDAP *ld,
632 int option,
void *arg ));
633 LDAP_F (
int) ldap_int_sasl_config LDAP_P(( struct ldapoptions *lo,
634 int option, const
char *arg ));
636 LDAP_F (
int) ldap_int_sasl_bind LDAP_P((
644 LDAP_SASL_INTERACT_PROC *interact,
648 LDAP_F (
char *) ldap_int_parse_numericoid LDAP_P((
656 LDAP_F (
int) ldap_int_tls_config LDAP_P((
LDAP *ld,
657 int option, const
char *arg ));
659 LDAP_F (
int) ldap_int_tls_start LDAP_P((
LDAP *ld,
662 LDAP_F (
void) ldap_int_tls_destroy LDAP_P(( struct ldapoptions *lo ));
667 LDAP_F (
char **) ldap_value_dup LDAP_P((
668 char *const *vals ));
Definition: ldap-int.h:171
Definition: ldap-int.h:331
Definition: ldap-int.h:306
Definition: ldap-int.h:321
Definition: lber-int.h:104
Definition: ldap-int.h:143
Definition: ldap-int.h:250
Definition: ldap-int.h:275
Definition: lber-int.h:75