ldap_pvt.h revision 1.1.1.4
1/*	$NetBSD: ldap_pvt.h,v 1.1.1.4 2014/05/28 09:58:40 tron Exp $	*/
2
3/* $OpenLDAP$ */
4/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 *
6 * Copyright 1998-2014 The OpenLDAP Foundation.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted only as authorized by the OpenLDAP
11 * Public License.
12 *
13 * A copy of this license is available in file LICENSE in the
14 * top-level directory of the distribution or, alternatively, at
15 * <http://www.OpenLDAP.org/license.html>.
16 */
17
18/* ldap-pvt.h - Header for ldap_pvt_ functions.
19 * These are meant to be internal to OpenLDAP Software.
20 */
21
22#ifndef _LDAP_PVT_H
23#define _LDAP_PVT_H 1
24
25#include <lber.h>				/* get ber_slen_t */
26#include <lber_pvt.h>				/* get Sockbuf_Buf */
27
28LDAP_BEGIN_DECL
29
30#define LDAP_PROTO_TCP 1 /* ldap://  */
31#define LDAP_PROTO_UDP 2 /* reserved */
32#define LDAP_PROTO_IPC 3 /* ldapi:// */
33#define LDAP_PROTO_EXT 4 /* user-defined socket/sockbuf */
34
35LDAP_F ( int )
36ldap_pvt_url_scheme2proto LDAP_P((
37	const char * ));
38LDAP_F ( int )
39ldap_pvt_url_scheme2tls LDAP_P((
40	const char * ));
41
42LDAP_F ( int )
43ldap_pvt_url_scheme_port LDAP_P((
44	const char *, int ));
45
46struct ldap_url_desc; /* avoid pulling in <ldap.h> */
47
48#define LDAP_PVT_URL_PARSE_NONE			(0x00U)
49#define LDAP_PVT_URL_PARSE_NOEMPTY_HOST		(0x01U)
50#define LDAP_PVT_URL_PARSE_DEF_PORT		(0x02U)
51#define LDAP_PVT_URL_PARSE_NOEMPTY_DN		(0x04U)
52#define LDAP_PVT_URL_PARSE_NODEF_SCOPE		(0x08U)
53#define	LDAP_PVT_URL_PARSE_HISTORIC		(LDAP_PVT_URL_PARSE_NODEF_SCOPE | \
54						 LDAP_PVT_URL_PARSE_NOEMPTY_HOST | \
55						 LDAP_PVT_URL_PARSE_DEF_PORT)
56
57LDAP_F( int )
58ldap_url_parse_ext LDAP_P((
59	LDAP_CONST char *url,
60	struct ldap_url_desc **ludpp,
61	unsigned flags ));
62
63LDAP_F (int) ldap_url_parselist LDAP_P((	/* deprecated, use ldap_url_parselist_ext() */
64	struct ldap_url_desc **ludlist,
65	const char *url ));
66
67LDAP_F (int) ldap_url_parselist_ext LDAP_P((
68	struct ldap_url_desc **ludlist,
69	const char *url,
70	const char *sep,
71	unsigned flags ));
72
73LDAP_F (char *) ldap_url_list2urls LDAP_P((
74	struct ldap_url_desc *ludlist ));
75
76LDAP_F (void) ldap_free_urllist LDAP_P((
77	struct ldap_url_desc *ludlist ));
78
79LDAP_F (int) ldap_pvt_scope2bv LDAP_P ((
80	int scope, struct berval *bv ));
81
82LDAP_F (LDAP_CONST char *) ldap_pvt_scope2str LDAP_P ((
83	int scope ));
84
85LDAP_F (int) ldap_pvt_bv2scope LDAP_P ((
86	struct berval *bv ));
87
88LDAP_F (int) ldap_pvt_str2scope LDAP_P ((
89	LDAP_CONST char * ));
90
91LDAP_F( char * )
92ldap_pvt_ctime LDAP_P((
93	const time_t *tp,
94	char *buf ));
95
96# if defined( HAVE_GMTIME_R )
97#   define USE_GMTIME_R
98#   define ldap_pvt_gmtime(timep, result) gmtime_r((timep), (result))
99# else
100LDAP_F( struct tm * )
101ldap_pvt_gmtime LDAP_P((
102	LDAP_CONST time_t *timep,
103	struct tm *result ));
104#endif
105
106# if defined( HAVE_LOCALTIME_R )
107#   define USE_LOCALTIME_R
108#   define ldap_pvt_localtime(timep, result) localtime_r((timep), (result))
109# else
110LDAP_F( struct tm * )
111ldap_pvt_localtime LDAP_P((
112	LDAP_CONST time_t *timep,
113	struct tm *result ));
114# endif
115
116#if defined( USE_GMTIME_R ) && defined( USE_LOCALTIME_R )
117#   define ldap_pvt_gmtime_lock() (0)
118#   define ldap_pvt_gmtime_unlock() (0)
119#else
120LDAP_F( int )
121ldap_pvt_gmtime_lock LDAP_P(( void ));
122
123LDAP_F( int )
124ldap_pvt_gmtime_unlock LDAP_P(( void ));
125#endif /* USE_GMTIME_R && USE_LOCALTIME_R */
126
127/* Get current time as a structured time */
128struct lutil_tm;
129LDAP_F( void )
130ldap_pvt_gettime LDAP_P(( struct lutil_tm * ));
131
132/* use this macro to allocate buffer for ldap_pvt_csnstr */
133#define LDAP_PVT_CSNSTR_BUFSIZE	64
134LDAP_F( size_t )
135ldap_pvt_csnstr( char *buf, size_t len, unsigned int replica, unsigned int mod );
136
137LDAP_F( char *) ldap_pvt_get_fqdn LDAP_P(( char * ));
138
139struct hostent;	/* avoid pulling in <netdb.h> */
140
141LDAP_F( int )
142ldap_pvt_gethostbyname_a LDAP_P((
143	const char *name,
144	struct hostent *resbuf,
145	char **buf,
146	struct hostent **result,
147	int *herrno_ptr ));
148
149LDAP_F( int )
150ldap_pvt_gethostbyaddr_a LDAP_P((
151	const char *addr,
152	int len,
153	int type,
154	struct hostent *resbuf,
155	char **buf,
156	struct hostent **result,
157	int *herrno_ptr ));
158
159struct sockaddr;
160
161LDAP_F( int )
162ldap_pvt_get_hname LDAP_P((
163	const struct sockaddr * sa,
164	int salen,
165	char *name,
166	int namelen,
167	char **herr ));
168
169
170/* charray.c */
171
172LDAP_F( int )
173ldap_charray_add LDAP_P((
174    char	***a,
175    const char *s ));
176
177LDAP_F( int )
178ldap_charray_merge LDAP_P((
179    char	***a,
180    char	**s ));
181
182LDAP_F( void )
183ldap_charray_free LDAP_P(( char **a ));
184
185LDAP_F( int )
186ldap_charray_inlist LDAP_P((
187    char	**a,
188    const char *s ));
189
190LDAP_F( char ** )
191ldap_charray_dup LDAP_P(( char **a ));
192
193LDAP_F( char ** )
194ldap_str2charray LDAP_P((
195	const char *str,
196	const char *brkstr ));
197
198LDAP_F( char * )
199ldap_charray2str LDAP_P((
200	char **array, const char* sep ));
201
202/* getdn.c */
203
204#ifdef LDAP_AVA_NULL	/* in ldap.h */
205LDAP_F( void ) ldap_rdnfree_x LDAP_P(( LDAPRDN rdn, void *ctx ));
206LDAP_F( void ) ldap_dnfree_x LDAP_P(( LDAPDN dn, void *ctx ));
207
208LDAP_F( int ) ldap_bv2dn_x LDAP_P((
209	struct berval *bv, LDAPDN *dn, unsigned flags, void *ctx ));
210LDAP_F( int ) ldap_dn2bv_x LDAP_P((
211	LDAPDN dn, struct berval *bv, unsigned flags, void *ctx ));
212LDAP_F( int ) ldap_bv2rdn_x LDAP_P((
213	struct berval *, LDAPRDN *, char **, unsigned flags, void *ctx ));
214LDAP_F( int ) ldap_rdn2bv_x LDAP_P((
215	LDAPRDN rdn, struct berval *bv, unsigned flags, void *ctx ));
216#endif /* LDAP_AVA_NULL */
217
218/* url.c */
219LDAP_F (void) ldap_pvt_hex_unescape LDAP_P(( char *s ));
220
221/*
222 * these macros assume 'x' is an ASCII x
223 * and assume the "C" locale
224 */
225#define LDAP_ASCII(c)		(!((c) & 0x80))
226#define LDAP_SPACE(c)		((c) == ' ' || (c) == '\t' || (c) == '\n')
227#define LDAP_DIGIT(c)		((c) >= '0' && (c) <= '9')
228#define LDAP_LOWER(c)		((c) >= 'a' && (c) <= 'z')
229#define LDAP_UPPER(c)		((c) >= 'A' && (c) <= 'Z')
230#define LDAP_ALPHA(c)		(LDAP_LOWER(c) || LDAP_UPPER(c))
231#define LDAP_ALNUM(c)		(LDAP_ALPHA(c) || LDAP_DIGIT(c))
232
233#define LDAP_LDH(c)			(LDAP_ALNUM(c) || (c) == '-')
234
235#define LDAP_HEXLOWER(c)	((c) >= 'a' && (c) <= 'f')
236#define LDAP_HEXUPPER(c)	((c) >= 'A' && (c) <= 'F')
237#define LDAP_HEX(c)			(LDAP_DIGIT(c) || \
238								LDAP_HEXLOWER(c) || LDAP_HEXUPPER(c))
239
240/* controls.c */
241struct ldapcontrol;
242LDAP_F (int)
243ldap_pvt_put_control LDAP_P((
244	const struct ldapcontrol *c,
245	BerElement *ber ));
246LDAP_F (int) ldap_pvt_get_controls LDAP_P((
247	BerElement *be,
248	struct ldapcontrol ***ctrlsp));
249
250#ifdef HAVE_CYRUS_SASL
251/* cyrus.c */
252struct sasl_security_properties; /* avoid pulling in <sasl.h> */
253LDAP_F (int) ldap_pvt_sasl_secprops LDAP_P((
254	const char *in,
255	struct sasl_security_properties *secprops ));
256LDAP_F (void) ldap_pvt_sasl_secprops_unparse LDAP_P((
257	struct sasl_security_properties *secprops,
258	struct berval *out ));
259
260LDAP_F (void *) ldap_pvt_sasl_mutex_new LDAP_P((void));
261LDAP_F (int) ldap_pvt_sasl_mutex_lock LDAP_P((void *mutex));
262LDAP_F (int) ldap_pvt_sasl_mutex_unlock LDAP_P((void *mutex));
263LDAP_F (void) ldap_pvt_sasl_mutex_dispose LDAP_P((void *mutex));
264#endif /* HAVE_CYRUS_SASL */
265
266struct sockbuf; /* avoid pulling in <lber.h> */
267LDAP_F (int) ldap_pvt_sasl_install LDAP_P(( struct sockbuf *, void * ));
268LDAP_F (void) ldap_pvt_sasl_remove LDAP_P(( struct sockbuf * ));
269
270/*
271 * SASL encryption support for LBER Sockbufs
272 */
273
274struct sb_sasl_generic_data;
275
276struct sb_sasl_generic_ops {
277	void (*init)(struct sb_sasl_generic_data *p,
278		     ber_len_t *min_send,
279		     ber_len_t *max_send,
280		     ber_len_t *max_recv);
281	ber_int_t (*encode)(struct sb_sasl_generic_data *p,
282			    unsigned char *buf,
283			    ber_len_t len,
284			    Sockbuf_Buf *dst);
285	ber_int_t (*decode)(struct sb_sasl_generic_data *p,
286			    const Sockbuf_Buf *src,
287			    Sockbuf_Buf *dst);
288	void (*reset_buf)(struct sb_sasl_generic_data *p,
289			  Sockbuf_Buf *buf);
290	void (*fini)(struct sb_sasl_generic_data *p);
291};
292
293struct sb_sasl_generic_install {
294	const struct sb_sasl_generic_ops 	*ops;
295	void					*ops_private;
296};
297
298struct sb_sasl_generic_data {
299	const struct sb_sasl_generic_ops 	*ops;
300	void					*ops_private;
301	Sockbuf_IO_Desc				*sbiod;
302	ber_len_t				min_send;
303	ber_len_t				max_send;
304	ber_len_t				max_recv;
305	Sockbuf_Buf				sec_buf_in;
306	Sockbuf_Buf				buf_in;
307	Sockbuf_Buf				buf_out;
308	unsigned int				flags;
309#define LDAP_PVT_SASL_PARTIAL_WRITE	1
310};
311
312#ifndef LDAP_PVT_SASL_LOCAL_SSF
313#define LDAP_PVT_SASL_LOCAL_SSF	71	/* SSF for Unix Domain Sockets */
314#endif /* ! LDAP_PVT_SASL_LOCAL_SSF */
315
316struct ldap;
317struct ldapmsg;
318
319/* abandon */
320LDAP_F ( int ) ldap_pvt_discard LDAP_P((
321	struct ldap *ld, ber_int_t msgid ));
322
323/* messages.c */
324LDAP_F( BerElement * )
325ldap_get_message_ber LDAP_P((
326	struct ldapmsg * ));
327
328/* open */
329LDAP_F (int) ldap_open_internal_connection LDAP_P((
330	struct ldap **ldp, ber_socket_t *fdp ));
331LDAP_F (int) ldap_init_fd LDAP_P((
332	ber_socket_t fd, int proto, LDAP_CONST char *url, struct ldap **ldp ));
333
334/* sasl.c */
335LDAP_F (int) ldap_pvt_sasl_generic_install LDAP_P(( Sockbuf *sb,
336	struct sb_sasl_generic_install *install_arg ));
337LDAP_F (void) ldap_pvt_sasl_generic_remove LDAP_P(( Sockbuf *sb ));
338
339/* search.c */
340LDAP_F( int ) ldap_pvt_put_filter LDAP_P((
341	BerElement *ber,
342	const char *str ));
343
344LDAP_F( char * )
345ldap_pvt_find_wildcard LDAP_P((	const char *s ));
346
347LDAP_F( ber_slen_t )
348ldap_pvt_filter_value_unescape LDAP_P(( char *filter ));
349
350LDAP_F( ber_len_t )
351ldap_bv2escaped_filter_value_len LDAP_P(( struct berval *in ));
352
353LDAP_F( int )
354ldap_bv2escaped_filter_value_x LDAP_P(( struct berval *in, struct berval *out,
355	int inplace, void *ctx ));
356
357LDAP_F (int) ldap_pvt_search LDAP_P((
358	struct ldap *ld,
359	LDAP_CONST char *base,
360	int scope,
361	LDAP_CONST char *filter,
362	char **attrs,
363	int attrsonly,
364	struct ldapcontrol **sctrls,
365	struct ldapcontrol **cctrls,
366	struct timeval *timeout,
367	int sizelimit,
368	int deref,
369	int *msgidp ));
370
371LDAP_F(int) ldap_pvt_search_s LDAP_P((
372	struct ldap *ld,
373	LDAP_CONST char *base,
374	int scope,
375	LDAP_CONST char *filter,
376	char **attrs,
377	int attrsonly,
378	struct ldapcontrol **sctrls,
379	struct ldapcontrol **cctrls,
380	struct timeval *timeout,
381	int sizelimit,
382	int deref,
383	struct ldapmsg **res ));
384
385/* string.c */
386LDAP_F( char * )
387ldap_pvt_str2upper LDAP_P(( char *str ));
388
389LDAP_F( char * )
390ldap_pvt_str2lower LDAP_P(( char *str ));
391
392LDAP_F( struct berval * )
393ldap_pvt_str2upperbv LDAP_P(( char *str, struct berval *bv ));
394
395LDAP_F( struct berval * )
396ldap_pvt_str2lowerbv LDAP_P(( char *str, struct berval *bv ));
397
398/* tls.c */
399LDAP_F (int) ldap_int_tls_config LDAP_P(( struct ldap *ld,
400	int option, const char *arg ));
401LDAP_F (int) ldap_pvt_tls_get_option LDAP_P(( struct ldap *ld,
402	int option, void *arg ));
403LDAP_F (int) ldap_pvt_tls_set_option LDAP_P(( struct ldap *ld,
404	int option, void *arg ));
405
406LDAP_F (void) ldap_pvt_tls_destroy LDAP_P(( void ));
407LDAP_F (int) ldap_pvt_tls_init LDAP_P(( void ));
408LDAP_F (int) ldap_pvt_tls_init_def_ctx LDAP_P(( int is_server ));
409LDAP_F (int) ldap_pvt_tls_accept LDAP_P(( Sockbuf *sb, void *ctx_arg ));
410LDAP_F (int) ldap_pvt_tls_inplace LDAP_P(( Sockbuf *sb ));
411LDAP_F (void *) ldap_pvt_tls_sb_ctx LDAP_P(( Sockbuf *sb ));
412LDAP_F (void) ldap_pvt_tls_ctx_free LDAP_P(( void * ));
413
414typedef int LDAPDN_rewrite_dummy LDAP_P (( void *dn, unsigned flags ));
415
416typedef int (LDAP_TLS_CONNECT_CB) LDAP_P (( struct ldap *ld, void *ssl,
417	void *ctx, void *arg ));
418
419LDAP_F (int) ldap_pvt_tls_get_my_dn LDAP_P(( void *ctx, struct berval *dn,
420	LDAPDN_rewrite_dummy *func, unsigned flags ));
421LDAP_F (int) ldap_pvt_tls_get_peer_dn LDAP_P(( void *ctx, struct berval *dn,
422	LDAPDN_rewrite_dummy *func, unsigned flags ));
423LDAP_F (int) ldap_pvt_tls_get_strength LDAP_P(( void *ctx ));
424
425LDAP_END_DECL
426
427/*
428 * Multiple precision stuff
429 *
430 * May use OpenSSL's BIGNUM if built with TLS,
431 * or GNU's multiple precision library. But if
432 * long long is available, that's big enough
433 * and much more efficient.
434 *
435 * If none is available, unsigned long data is used.
436 */
437
438LDAP_BEGIN_DECL
439
440#ifdef USE_MP_BIGNUM
441/*
442 * Use OpenSSL's BIGNUM
443 */
444#include <openssl/crypto.h>
445#include <openssl/bn.h>
446
447typedef	BIGNUM* ldap_pvt_mp_t;
448#define	LDAP_PVT_MP_INIT	(NULL)
449
450#define	ldap_pvt_mp_init(mp) \
451	do { (mp) = BN_new(); } while (0)
452
453/* FIXME: we rely on mpr being initialized */
454#define	ldap_pvt_mp_init_set(mpr,mpv) \
455	do { ldap_pvt_mp_init((mpr)); BN_add((mpr), (mpr), (mpv)); } while (0)
456
457#define	ldap_pvt_mp_add(mpr,mpv) \
458	BN_add((mpr), (mpr), (mpv))
459
460#define	ldap_pvt_mp_add_ulong(mp,v) \
461	BN_add_word((mp), (v))
462
463#define ldap_pvt_mp_clear(mp) \
464	do { BN_free((mp)); (mp) = 0; } while (0)
465
466#elif defined(USE_MP_GMP)
467/*
468 * Use GNU's multiple precision library
469 */
470#include <gmp.h>
471
472typedef mpz_t		ldap_pvt_mp_t;
473#define	LDAP_PVT_MP_INIT	{ 0 }
474
475#define ldap_pvt_mp_init(mp) \
476	mpz_init((mp))
477
478#define	ldap_pvt_mp_init_set(mpr,mpv) \
479	mpz_init_set((mpr), (mpv))
480
481#define	ldap_pvt_mp_add(mpr,mpv) \
482	mpz_add((mpr), (mpr), (mpv))
483
484#define	ldap_pvt_mp_add_ulong(mp,v)	\
485	mpz_add_ui((mp), (mp), (v))
486
487#define ldap_pvt_mp_clear(mp) \
488	mpz_clear((mp))
489
490#else
491/*
492 * Use unsigned long long
493 */
494
495#ifdef USE_MP_LONG_LONG
496typedef	unsigned long long	ldap_pvt_mp_t;
497#define	LDAP_PVT_MP_INIT	(0LL)
498#elif defined(USE_MP_LONG)
499typedef	unsigned long		ldap_pvt_mp_t;
500#define	LDAP_PVT_MP_INIT	(0L)
501#elif defined(HAVE_LONG_LONG)
502typedef	unsigned long long	ldap_pvt_mp_t;
503#define	LDAP_PVT_MP_INIT	(0LL)
504#else
505typedef	unsigned long		ldap_pvt_mp_t;
506#define	LDAP_PVT_MP_INIT	(0L)
507#endif
508
509#define ldap_pvt_mp_init(mp) \
510	do { (mp) = 0; } while (0)
511
512#define	ldap_pvt_mp_init_set(mpr,mpv) \
513	do { (mpr) = (mpv); } while (0)
514
515#define	ldap_pvt_mp_add(mpr,mpv) \
516	do { (mpr) += (mpv); } while (0)
517
518#define	ldap_pvt_mp_add_ulong(mp,v) \
519	do { (mp) += (v); } while (0)
520
521#define ldap_pvt_mp_clear(mp) \
522	do { (mp) = 0; } while (0)
523
524#endif /* MP */
525
526#include "ldap_pvt_uc.h"
527
528LDAP_END_DECL
529
530LDAP_BEGIN_DECL
531
532#include <limits.h>				/* get CHAR_BIT */
533
534/* Buffer space for sign, decimal digits and \0. Note: log10(2) < 146/485. */
535#define LDAP_PVT_INTTYPE_CHARS(type) (((sizeof(type)*CHAR_BIT-1)*146)/485 + 3)
536
537LDAP_END_DECL
538
539#endif /* _LDAP_PVT_H */
540