xref: /netbsd-src/external/bsd/openldap/dist/servers/slapd/back-meta/back-meta.h (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
1 /*	$NetBSD: back-meta.h,v 1.3 2021/08/14 16:15:00 christos Exp $	*/
2 
3 /* $OpenLDAP$ */
4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5  *
6  * Copyright 1999-2021 The OpenLDAP Foundation.
7  * Portions Copyright 2001-2003 Pierangelo Masarati.
8  * Portions Copyright 1999-2003 Howard Chu.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted only as authorized by the OpenLDAP
13  * Public License.
14  *
15  * A copy of this license is available in the file LICENSE in the
16  * top-level directory of the distribution or, alternatively, at
17  * <http://www.OpenLDAP.org/license.html>.
18  */
19 /* ACKNOWLEDGEMENTS:
20  * This work was initially developed by the Howard Chu for inclusion
21  * in OpenLDAP Software and subsequently enhanced by Pierangelo
22  * Masarati.
23  */
24 
25 #ifndef SLAPD_LDAP_H
26 #error "include servers/slapd/back-ldap/back-ldap.h before this file!"
27 #endif /* SLAPD_LDAP_H */
28 
29 #ifndef SLAPD_META_H
30 #define SLAPD_META_H
31 
32 #define SLAPD_META_CLIENT_PR 1
33 
34 #include "proto-meta.h"
35 
36 /* String rewrite library */
37 #include "rewrite.h"
38 
39 LDAP_BEGIN_DECL
40 
41 /*
42  * Set META_BACK_PRINT_CONNTREE larger than 0 to dump the connection tree (debug only)
43  */
44 #ifndef META_BACK_PRINT_CONNTREE
45 #define META_BACK_PRINT_CONNTREE 0
46 #endif /* !META_BACK_PRINT_CONNTREE */
47 
48 /* from back-ldap.h before rwm removal */
49 struct ldapmap {
50 	int drop_missing;
51 
52 	Avlnode *map;
53 	Avlnode *remap;
54 };
55 
56 struct ldapmapping {
57 	struct berval src;
58 	struct berval dst;
59 };
60 
61 struct ldaprwmap {
62 	/*
63 	 * DN rewriting
64 	 */
65 	struct rewrite_info *rwm_rw;
66 	BerVarray rwm_bva_rewrite;
67 
68 	/*
69 	 * Attribute/objectClass mapping
70 	 */
71 	struct ldapmap rwm_oc;
72 	struct ldapmap rwm_at;
73 	BerVarray rwm_bva_map;
74 };
75 
76 /* Whatever context ldap_back_dn_massage needs... */
77 typedef struct dncookie {
78 	struct metatarget_t	*target;
79 
80 	Connection		*conn;
81 	char			*ctx;
82 	SlapReply		*rs;
83 } dncookie;
84 
85 int ldap_back_dn_massage(dncookie *dc, struct berval *dn,
86 	struct berval *res);
87 
88 extern int ldap_back_conn_cmp( const void *c1, const void *c2);
89 extern int ldap_back_conn_dup( void *c1, void *c2 );
90 extern void ldap_back_conn_free( void *c );
91 
92 /* attributeType/objectClass mapping */
93 int mapping_cmp (const void *, const void *);
94 int mapping_dup (void *, void *);
95 
96 void ldap_back_map_init ( struct ldapmap *lm, struct ldapmapping ** );
97 int ldap_back_mapping ( struct ldapmap *map, struct berval *s,
98 	struct ldapmapping **m, int remap );
99 void ldap_back_map ( struct ldapmap *map, struct berval *s, struct berval *m,
100 	int remap );
101 #define BACKLDAP_MAP	0
102 #define BACKLDAP_REMAP	1
103 char *
104 ldap_back_map_filter(
105 	struct ldapmap *at_map,
106 	struct ldapmap *oc_map,
107 	struct berval *f,
108 	int remap );
109 
110 int
111 ldap_back_map_attrs(
112 	Operation *op,
113 	struct ldapmap *at_map,
114 	AttributeName *a,
115 	int remap,
116 	char ***mapped_attrs );
117 
118 extern int
119 ldap_back_filter_map_rewrite(
120 	dncookie	*dc,
121 	Filter		*f,
122 	struct berval	*fstr,
123 	int		remap,
124 	void		*memctx );
125 
126 /* suffix massaging by means of librewrite */
127 extern int
128 suffix_massage_config( struct rewrite_info *info,
129 	struct berval *pvnc,
130 	struct berval *nvnc,
131 	struct berval *prnc,
132 	struct berval *nrnc );
133 extern int
134 ldap_back_referral_result_rewrite(
135 	dncookie	*dc,
136 	BerVarray	a_vals,
137 	void		*memctx );
138 extern int
139 ldap_dnattr_rewrite(
140 	dncookie	*dc,
141 	BerVarray	a_vals );
142 extern int
143 ldap_dnattr_result_rewrite(
144 	dncookie	*dc,
145 	BerVarray	a_vals );
146 
147 /* (end of) from back-ldap.h before rwm removal */
148 
149 /*
150  * A metasingleconn_t can be in the following, mutually exclusive states:
151  *
152  *	- none			(0x0U)
153  *	- creating		META_BACK_FCONN_CREATING
154  *	- initialized		META_BACK_FCONN_INITED
155  *	- binding		LDAP_BACK_FCONN_BINDING
156  *	- bound/anonymous	LDAP_BACK_FCONN_ISBOUND/LDAP_BACK_FCONN_ISANON
157  *
158  * possible modifiers are:
159  *
160  *	- privileged		LDAP_BACK_FCONN_ISPRIV
161  *	- privileged, TLS	LDAP_BACK_FCONN_ISTLS
162  *	- subjected to idassert	LDAP_BACK_FCONN_ISIDASR
163  *	- tainted		LDAP_BACK_FCONN_TAINTED
164  */
165 
166 #define META_BACK_FCONN_INITED		(0x00100000U)
167 #define META_BACK_FCONN_CREATING	(0x00200000U)
168 
169 #define	META_BACK_CONN_INITED(lc)		LDAP_BACK_CONN_ISSET((lc), META_BACK_FCONN_INITED)
170 #define	META_BACK_CONN_INITED_SET(lc)		LDAP_BACK_CONN_SET((lc), META_BACK_FCONN_INITED)
171 #define	META_BACK_CONN_INITED_CLEAR(lc)		LDAP_BACK_CONN_CLEAR((lc), META_BACK_FCONN_INITED)
172 #define	META_BACK_CONN_INITED_CPY(lc, mlc)	LDAP_BACK_CONN_CPY((lc), META_BACK_FCONN_INITED, (mlc))
173 #define	META_BACK_CONN_CREATING(lc)		LDAP_BACK_CONN_ISSET((lc), META_BACK_FCONN_CREATING)
174 #define	META_BACK_CONN_CREATING_SET(lc)		LDAP_BACK_CONN_SET((lc), META_BACK_FCONN_CREATING)
175 #define	META_BACK_CONN_CREATING_CLEAR(lc)	LDAP_BACK_CONN_CLEAR((lc), META_BACK_FCONN_CREATING)
176 #define	META_BACK_CONN_CREATING_CPY(lc, mlc)	LDAP_BACK_CONN_CPY((lc), META_BACK_FCONN_CREATING, (mlc))
177 
178 struct metainfo_t;
179 
180 #define	META_NOT_CANDIDATE		((ber_tag_t)0x0)
181 #define	META_CANDIDATE			((ber_tag_t)0x1)
182 #define	META_BINDING			((ber_tag_t)0x2)
183 #define	META_RETRYING			((ber_tag_t)0x4)
184 
185 typedef struct metasingleconn_t {
186 #define META_CND_ISSET(rs,f)		( ( (rs)->sr_tag & (f) ) == (f) )
187 #define META_CND_SET(rs,f)		( (rs)->sr_tag |= (f) )
188 #define META_CND_CLEAR(rs,f)		( (rs)->sr_tag &= ~(f) )
189 
190 #define META_CANDIDATE_RESET(rs)	( (rs)->sr_tag = 0 )
191 #define META_IS_CANDIDATE(rs)		META_CND_ISSET( (rs), META_CANDIDATE )
192 #define META_CANDIDATE_SET(rs)		META_CND_SET( (rs), META_CANDIDATE )
193 #define META_CANDIDATE_CLEAR(rs)	META_CND_CLEAR( (rs), META_CANDIDATE )
194 #define META_IS_BINDING(rs)		META_CND_ISSET( (rs), META_BINDING )
195 #define META_BINDING_SET(rs)		META_CND_SET( (rs), META_BINDING )
196 #define META_BINDING_CLEAR(rs)		META_CND_CLEAR( (rs), META_BINDING )
197 #define META_IS_RETRYING(rs)		META_CND_ISSET( (rs), META_RETRYING )
198 #define META_RETRYING_SET(rs)		META_CND_SET( (rs), META_RETRYING )
199 #define META_RETRYING_CLEAR(rs)		META_CND_CLEAR( (rs), META_RETRYING )
200 
201 	LDAP            	*msc_ld;
202 	time_t			msc_time;
203 	struct berval          	msc_bound_ndn;
204 	struct berval		msc_cred;
205 	unsigned		msc_mscflags;
206 	/* NOTE: lc_lcflags is redefined to msc_mscflags to reuse the macros
207 	 * defined for back-ldap */
208 #define	lc_lcflags		msc_mscflags
209 } metasingleconn_t;
210 
211 typedef struct metaconn_t {
212 	ldapconn_base_t		lc_base;
213 #define	mc_base			lc_base
214 #define	mc_conn			mc_base.lcb_conn
215 #define	mc_local_ndn		mc_base.lcb_local_ndn
216 #define	mc_refcnt		mc_base.lcb_refcnt
217 #define	mc_create_time		mc_base.lcb_create_time
218 #define	mc_time			mc_base.lcb_time
219 
220 	LDAP_TAILQ_ENTRY(metaconn_t)	mc_q;
221 
222 	/* NOTE: msc_mscflags is used to recycle the #define
223 	 * in metasingleconn_t */
224 	unsigned		msc_mscflags;
225 
226 	/*
227 	 * means that the connection is bound;
228 	 * of course only one target actually is ...
229 	 */
230 	int             	mc_authz_target;
231 #define META_BOUND_NONE		(-1)
232 #define META_BOUND_ALL		(-2)
233 
234 	struct metainfo_t	*mc_info;
235 
236 	/* supersedes the connection stuff */
237 	metasingleconn_t	mc_conns[ 1 ];
238 	/* NOTE: mc_conns must be last, because
239 	 * the required number of conns is malloc'ed
240 	 * in one block with the metaconn_t structure */
241 } metaconn_t;
242 
243 typedef enum meta_st_t {
244 #if 0 /* todo */
245 	META_ST_EXACT = LDAP_SCOPE_BASE,
246 #endif
247 	META_ST_SUBTREE = LDAP_SCOPE_SUBTREE,
248 	META_ST_SUBORDINATE = LDAP_SCOPE_SUBORDINATE,
249 	META_ST_REGEX /* last + 1 */
250 } meta_st_t;
251 
252 typedef struct metasubtree_t {
253 	meta_st_t ms_type;
254 	union {
255 		struct berval msu_dn;
256 		struct {
257 			struct berval msr_regex_pattern;
258 			regex_t msr_regex;
259 		} msu_regex;
260 	} ms_un;
261 #define ms_dn ms_un.msu_dn
262 #define ms_regex ms_un.msu_regex.msr_regex
263 #define ms_regex_pattern ms_un.msu_regex.msr_regex_pattern
264 
265 	struct metasubtree_t *ms_next;
266 } metasubtree_t;
267 
268 typedef struct metafilter_t {
269 	struct metafilter_t *mf_next;
270 	struct berval mf_regex_pattern;
271 	regex_t mf_regex;
272 } metafilter_t;
273 
274 typedef struct metacommon_t {
275 	int				mc_version;
276 	int				mc_nretries;
277 #define META_RETRY_UNDEFINED	(-2)
278 #define META_RETRY_FOREVER	(-1)
279 #define META_RETRY_NEVER	(0)
280 #define META_RETRY_DEFAULT	(10)
281 
282 	unsigned		mc_flags;
283 #define	META_BACK_CMN_ISSET(mc,f)		( ( (mc)->mc_flags & (f) ) == (f) )
284 #define	META_BACK_CMN_QUARANTINE(mc)		META_BACK_CMN_ISSET( (mc), LDAP_BACK_F_QUARANTINE )
285 #define	META_BACK_CMN_CHASE_REFERRALS(mc)	META_BACK_CMN_ISSET( (mc), LDAP_BACK_F_CHASE_REFERRALS )
286 #define	META_BACK_CMN_NOREFS(mc)		META_BACK_CMN_ISSET( (mc), LDAP_BACK_F_NOREFS )
287 #define	META_BACK_CMN_NOUNDEFFILTER(mc)		META_BACK_CMN_ISSET( (mc), LDAP_BACK_F_NOUNDEFFILTER )
288 #define	META_BACK_CMN_SAVECRED(mc)		META_BACK_CMN_ISSET( (mc), LDAP_BACK_F_SAVECRED )
289 #define	META_BACK_CMN_ST_REQUEST(mc)		META_BACK_CMN_ISSET( (mc), LDAP_BACK_F_ST_REQUEST )
290 
291 #ifdef SLAPD_META_CLIENT_PR
292 	/*
293 	 * client-side paged results:
294 	 * -1: accept unsolicited paged results responses
295 	 *  0: off
296 	 * >0: always request paged results with size == mt_ps
297 	 */
298 #define META_CLIENT_PR_DISABLE			(0)
299 #define META_CLIENT_PR_ACCEPT_UNSOLICITED	(-1)
300 	ber_int_t		mc_ps;
301 #endif /* SLAPD_META_CLIENT_PR */
302 
303 	slap_retry_info_t	mc_quarantine;
304 	time_t			mc_network_timeout;
305 	struct timeval	mc_bind_timeout;
306 #define META_BIND_TIMEOUT	LDAP_BACK_RESULT_UTIMEOUT
307 	time_t			mc_timeout[ SLAP_OP_LAST ];
308 } metacommon_t;
309 
310 typedef struct metatarget_t {
311 	char			*mt_uri;
312 	ldap_pvt_thread_mutex_t	mt_uri_mutex;
313 
314 	/* TODO: we might want to enable different strategies
315 	 * for different targets */
316 	LDAP_REBIND_PROC	*mt_rebind_f;
317 	LDAP_URLLIST_PROC	*mt_urllist_f;
318 	void			*mt_urllist_p;
319 
320 	metafilter_t	*mt_filter;
321 	metasubtree_t		*mt_subtree;
322 	/* F: subtree-include; T: subtree-exclude */
323 	int			mt_subtree_exclude;
324 
325 	int			mt_scope;
326 
327 	struct berval		mt_psuffix;		/* pretty suffix */
328 	struct berval		mt_nsuffix;		/* normalized suffix */
329 
330 	struct berval		mt_binddn;
331 	struct berval		mt_bindpw;
332 
333 	/* we only care about the TLS options here */
334 	slap_bindconf		mt_tls;
335 
336 	slap_idassert_t		mt_idassert;
337 #define	mt_idassert_mode	mt_idassert.si_mode
338 #define	mt_idassert_authcID	mt_idassert.si_bc.sb_authcId
339 #define	mt_idassert_authcDN	mt_idassert.si_bc.sb_binddn
340 #define	mt_idassert_passwd	mt_idassert.si_bc.sb_cred
341 #define	mt_idassert_authzID	mt_idassert.si_bc.sb_authzId
342 #define	mt_idassert_authmethod	mt_idassert.si_bc.sb_method
343 #define	mt_idassert_sasl_mech	mt_idassert.si_bc.sb_saslmech
344 #define	mt_idassert_sasl_realm	mt_idassert.si_bc.sb_realm
345 #define	mt_idassert_secprops	mt_idassert.si_bc.sb_secprops
346 #define	mt_idassert_tls		mt_idassert.si_bc.sb_tls
347 #define	mt_idassert_flags	mt_idassert.si_flags
348 #define	mt_idassert_authz	mt_idassert.si_authz
349 
350 	struct ldaprwmap	mt_rwmap;
351 
352 	sig_atomic_t		mt_isquarantined;
353 	ldap_pvt_thread_mutex_t	mt_quarantine_mutex;
354 
355 	metacommon_t	mt_mc;
356 #define	mt_nretries	mt_mc.mc_nretries
357 #define	mt_flags	mt_mc.mc_flags
358 #define	mt_version	mt_mc.mc_version
359 #define	mt_ps		mt_mc.mc_ps
360 #define	mt_network_timeout	mt_mc.mc_network_timeout
361 #define	mt_bind_timeout	mt_mc.mc_bind_timeout
362 #define	mt_timeout	mt_mc.mc_timeout
363 #define	mt_quarantine	mt_mc.mc_quarantine
364 
365 #define	META_BACK_TGT_ISSET(mt,f)		( ( (mt)->mt_flags & (f) ) == (f) )
366 #define	META_BACK_TGT_ISMASK(mt,m,f)		( ( (mt)->mt_flags & (m) ) == (f) )
367 
368 #define META_BACK_TGT_SAVECRED(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_SAVECRED )
369 
370 #define META_BACK_TGT_USE_TLS(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_USE_TLS )
371 #define META_BACK_TGT_PROPAGATE_TLS(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_PROPAGATE_TLS )
372 #define META_BACK_TGT_TLS_CRITICAL(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_TLS_CRITICAL )
373 
374 #define META_BACK_TGT_CHASE_REFERRALS(mt)	META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_CHASE_REFERRALS )
375 
376 #define	META_BACK_TGT_T_F(mt)			META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_T_F_MASK, LDAP_BACK_F_T_F )
377 #define	META_BACK_TGT_T_F_DISCOVER(mt)		META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_T_F_MASK2, LDAP_BACK_F_T_F_DISCOVER )
378 
379 #define	META_BACK_TGT_ABANDON(mt)		META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_CANCEL_MASK, LDAP_BACK_F_CANCEL_ABANDON )
380 #define	META_BACK_TGT_IGNORE(mt)		META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_CANCEL_MASK, LDAP_BACK_F_CANCEL_IGNORE )
381 #define	META_BACK_TGT_CANCEL(mt)		META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_CANCEL_MASK, LDAP_BACK_F_CANCEL_EXOP )
382 #define	META_BACK_TGT_CANCEL_DISCOVER(mt)	META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_CANCEL_MASK2, LDAP_BACK_F_CANCEL_EXOP_DISCOVER )
383 #define	META_BACK_TGT_QUARANTINE(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_QUARANTINE )
384 
385 #ifdef SLAP_CONTROL_X_SESSION_TRACKING
386 #define	META_BACK_TGT_ST_REQUEST(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_ST_REQUEST )
387 #define	META_BACK_TGT_ST_RESPONSE(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_ST_RESPONSE )
388 #endif /* SLAP_CONTROL_X_SESSION_TRACKING */
389 
390 #define	META_BACK_TGT_NOREFS(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_NOREFS )
391 #define	META_BACK_TGT_NOUNDEFFILTER(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_NOUNDEFFILTER )
392 
393 	slap_mask_t		mt_rep_flags;
394 
395 } metatarget_t;
396 
397 typedef struct metadncache_t {
398 	ldap_pvt_thread_mutex_t mutex;
399 	Avlnode			*tree;
400 
401 #define META_DNCACHE_DISABLED   (0)
402 #define META_DNCACHE_FOREVER    ((time_t)(-1))
403 	time_t			ttl;  /* seconds; 0: no cache, -1: no expiry */
404 } metadncache_t;
405 
406 typedef struct metacandidates_t {
407 	int			mc_ntargets;
408 	SlapReply		*mc_candidates;
409 } metacandidates_t;
410 
411 /*
412  * Hook to allow mucking with metainfo_t/metatarget_t when quarantine is over
413  */
414 typedef int (*meta_back_quarantine_f)( struct metainfo_t *, int target, void * );
415 
416 typedef struct metainfo_t {
417 	int			mi_ntargets;
418 	int			mi_defaulttarget;
419 #define META_DEFAULT_TARGET_NONE	(-1)
420 
421 #define	mi_nretries	mi_mc.mc_nretries
422 #define	mi_flags	mi_mc.mc_flags
423 #define	mi_version	mi_mc.mc_version
424 #define	mi_ps		mi_mc.mc_ps
425 #define	mi_network_timeout	mi_mc.mc_network_timeout
426 #define	mi_bind_timeout	mi_mc.mc_bind_timeout
427 #define	mi_timeout	mi_mc.mc_timeout
428 #define	mi_quarantine	mi_mc.mc_quarantine
429 
430 	metatarget_t		**mi_targets;
431 	metacandidates_t	*mi_candidates;
432 
433 	LDAP_REBIND_PROC	*mi_rebind_f;
434 	LDAP_URLLIST_PROC	*mi_urllist_f;
435 
436 	metadncache_t		mi_cache;
437 
438 	/* cached connections;
439 	 * special conns are in tailq rather than in tree */
440 	ldap_avl_info_t		mi_conninfo;
441 	struct {
442 		int						mic_num;
443 		LDAP_TAILQ_HEAD(mc_conn_priv_q, metaconn_t)	mic_priv;
444 	}			mi_conn_priv[ LDAP_BACK_PCONN_LAST ];
445 	int			mi_conn_priv_max;
446 
447 	/* NOTE: quarantine uses the connection mutex */
448 	meta_back_quarantine_f	mi_quarantine_f;
449 	void			*mi_quarantine_p;
450 
451 #define	li_flags		mi_flags
452 /* uses flags as defined in <back-ldap/back-ldap.h> */
453 #define	META_BACK_F_ONERR_STOP		LDAP_BACK_F_ONERR_STOP
454 #define	META_BACK_F_ONERR_REPORT	(0x02000000U)
455 #define	META_BACK_F_ONERR_MASK		(META_BACK_F_ONERR_STOP|META_BACK_F_ONERR_REPORT)
456 #define	META_BACK_F_DEFER_ROOTDN_BIND	(0x04000000U)
457 #define	META_BACK_F_PROXYAUTHZ_ALWAYS	(0x08000000U)	/* users always proxyauthz */
458 #define	META_BACK_F_PROXYAUTHZ_ANON	(0x10000000U)	/* anonymous always proxyauthz */
459 #define	META_BACK_F_PROXYAUTHZ_NOANON	(0x20000000U)	/* anonymous remains anonymous */
460 
461 #define	META_BACK_ONERR_STOP(mi)	LDAP_BACK_ISSET( (mi), META_BACK_F_ONERR_STOP )
462 #define	META_BACK_ONERR_REPORT(mi)	LDAP_BACK_ISSET( (mi), META_BACK_F_ONERR_REPORT )
463 #define	META_BACK_ONERR_CONTINUE(mi)	( !LDAP_BACK_ISSET( (mi), META_BACK_F_ONERR_MASK ) )
464 
465 #define META_BACK_DEFER_ROOTDN_BIND(mi)	LDAP_BACK_ISSET( (mi), META_BACK_F_DEFER_ROOTDN_BIND )
466 #define META_BACK_PROXYAUTHZ_ALWAYS(mi)	LDAP_BACK_ISSET( (mi), META_BACK_F_PROXYAUTHZ_ALWAYS )
467 #define META_BACK_PROXYAUTHZ_ANON(mi)	LDAP_BACK_ISSET( (mi), META_BACK_F_PROXYAUTHZ_ANON )
468 #define META_BACK_PROXYAUTHZ_NOANON(mi)	LDAP_BACK_ISSET( (mi), META_BACK_F_PROXYAUTHZ_NOANON )
469 
470 #define META_BACK_QUARANTINE(mi)	LDAP_BACK_ISSET( (mi), LDAP_BACK_F_QUARANTINE )
471 
472 	time_t			mi_conn_ttl;
473 	time_t			mi_idle_timeout;
474 
475 	metacommon_t	mi_mc;
476 	ldap_extra_t	*mi_ldap_extra;
477 
478 } metainfo_t;
479 
480 typedef enum meta_op_type {
481 	META_OP_ALLOW_MULTIPLE = 0,
482 	META_OP_REQUIRE_SINGLE,
483 	META_OP_REQUIRE_ALL
484 } meta_op_type;
485 
486 SlapReply *
487 meta_back_candidates_get( Operation *op );
488 
489 extern metaconn_t *
490 meta_back_getconn(
491 	Operation		*op,
492 	SlapReply		*rs,
493 	int			*candidate,
494 	ldap_back_send_t	sendok );
495 
496 extern void
497 meta_back_release_conn_lock(
498        	metainfo_t		*mi,
499 	metaconn_t		*mc,
500 	int			dolock );
501 #define meta_back_release_conn(mi, mc)	meta_back_release_conn_lock( (mi), (mc), 1 )
502 
503 extern int
504 meta_back_retry(
505 	Operation		*op,
506 	SlapReply		*rs,
507 	metaconn_t		**mcp,
508 	int			candidate,
509 	ldap_back_send_t	sendok );
510 
511 extern void
512 meta_back_conn_free(
513 	void			*v_mc );
514 
515 #if META_BACK_PRINT_CONNTREE > 0
516 extern void
517 meta_back_print_conntree(
518 	metainfo_t		*mi,
519 	char			*msg );
520 #endif
521 
522 extern int
523 meta_back_init_one_conn(
524 	Operation		*op,
525 	SlapReply		*rs,
526 	metaconn_t		*mc,
527 	int			candidate,
528 	int			ispriv,
529 	ldap_back_send_t	sendok,
530 	int			dolock );
531 
532 extern void
533 meta_back_quarantine(
534 	Operation		*op,
535 	SlapReply		*rs,
536 	int			candidate );
537 
538 extern int
539 meta_back_dobind(
540 	Operation		*op,
541 	SlapReply		*rs,
542 	metaconn_t		*mc,
543 	ldap_back_send_t	sendok );
544 
545 extern int
546 meta_back_single_dobind(
547 	Operation		*op,
548 	SlapReply		*rs,
549 	metaconn_t		**mcp,
550 	int			candidate,
551 	ldap_back_send_t	sendok,
552 	int			retries,
553 	int			dolock );
554 
555 extern int
556 meta_back_proxy_authz_cred(
557 	metaconn_t		*mc,
558 	int			candidate,
559 	Operation		*op,
560 	SlapReply		*rs,
561 	ldap_back_send_t	sendok,
562 	struct berval		*binddn,
563 	struct berval		*bindcred,
564 	int			*method );
565 
566 extern int
567 meta_back_cancel(
568 	metaconn_t		*mc,
569 	Operation		*op,
570 	SlapReply		*rs,
571 	ber_int_t		msgid,
572 	int			candidate,
573 	ldap_back_send_t	sendok );
574 
575 extern int
576 meta_back_op_result(
577 	metaconn_t		*mc,
578 	Operation		*op,
579 	SlapReply		*rs,
580 	int			candidate,
581 	ber_int_t		msgid,
582 	time_t			timeout,
583 	ldap_back_send_t	sendok );
584 
585 extern int
586 meta_back_controls_add(
587 	Operation	*op,
588 	SlapReply	*rs,
589 	metaconn_t	*mc,
590 	int		candidate,
591 	LDAPControl	***pctrls );
592 
593 extern int
594 back_meta_LTX_init_module(
595 	int			argc,
596 	char			*argv[] );
597 
598 extern int
599 meta_back_conn_cmp(
600 	const void		*c1,
601 	const void		*c2 );
602 
603 extern int
604 meta_back_conndn_cmp(
605 	const void		*c1,
606 	const void		*c2 );
607 
608 extern int
609 meta_back_conndn_dup(
610 	void			*c1,
611 	void			*c2 );
612 
613 /*
614  * Candidate stuff
615  */
616 extern int
617 meta_back_is_candidate(
618 	metatarget_t		*mt,
619 	struct berval		*ndn,
620 	int			scope );
621 
622 extern int
623 meta_back_select_unique_candidate(
624 	metainfo_t		*mi,
625 	struct berval		*ndn );
626 
627 extern int
628 meta_clear_unused_candidates(
629 	Operation		*op,
630 	int			candidate );
631 
632 extern int
633 meta_clear_one_candidate(
634 	Operation		*op,
635 	metaconn_t		*mc,
636 	int			candidate );
637 
638 /*
639  * Dn cache stuff (experimental)
640  */
641 extern int
642 meta_dncache_cmp(
643 	const void		*c1,
644 	const void		*c2 );
645 
646 extern int
647 meta_dncache_dup(
648 	void			*c1,
649 	void			*c2 );
650 
651 #define META_TARGET_NONE	(-1)
652 #define META_TARGET_MULTIPLE	(-2)
653 extern int
654 meta_dncache_get_target(
655 	metadncache_t		*cache,
656 	struct berval		*ndn );
657 
658 extern int
659 meta_dncache_update_entry(
660 	metadncache_t		*cache,
661 	struct berval		*ndn,
662 	int			target );
663 
664 extern int
665 meta_dncache_delete_entry(
666 	metadncache_t		*cache,
667 	struct berval		*ndn );
668 
669 extern void
670 meta_dncache_free( void *entry );
671 
672 extern void
673 meta_back_map_free( struct ldapmap *lm );
674 
675 extern int
676 meta_subtree_destroy( metasubtree_t *ms );
677 
678 extern void
679 meta_filter_destroy( metafilter_t *mf );
680 
681 extern int
682 meta_target_finish( metainfo_t *mi, metatarget_t *mt,
683 	const char *log, char *msg, size_t msize
684 );
685 
686 extern LDAP_REBIND_PROC		meta_back_default_rebind;
687 extern LDAP_URLLIST_PROC	meta_back_default_urllist;
688 
689 LDAP_END_DECL
690 
691 #endif /* SLAPD_META_H */
692 
693