Home | History | Annotate | Line # | Download | only in back-meta
      1 /*	$NetBSD: back-meta.h,v 1.4 2025/09/05 21:16:28 christos Exp $	*/
      2 
      3 /* $OpenLDAP$ */
      4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
      5  *
      6  * Copyright 1999-2024 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 	SlapReply *candidates );
    496 
    497 extern void
    498 meta_back_release_conn_lock(
    499        	metainfo_t		*mi,
    500 	metaconn_t		*mc,
    501 	int			dolock );
    502 #define meta_back_release_conn(mi, mc)	meta_back_release_conn_lock( (mi), (mc), 1 )
    503 
    504 extern int
    505 meta_back_retry(
    506 	Operation		*op,
    507 	SlapReply		*rs,
    508 	metaconn_t		**mcp,
    509 	int			candidate,
    510 	ldap_back_send_t	sendok,
    511 	SlapReply    *candidates );
    512 
    513 extern void
    514 meta_back_conn_free(
    515 	void			*v_mc );
    516 
    517 #if META_BACK_PRINT_CONNTREE > 0
    518 extern void
    519 meta_back_print_conntree(
    520 	metainfo_t		*mi,
    521 	char			*msg );
    522 #endif
    523 
    524 extern int
    525 meta_back_init_one_conn(
    526 	Operation		*op,
    527 	SlapReply		*rs,
    528 	metaconn_t		*mc,
    529 	int			candidate,
    530 	int			ispriv,
    531 	ldap_back_send_t	sendok,
    532 	int			dolock );
    533 
    534 extern void
    535 meta_back_quarantine(
    536 	Operation		*op,
    537 	SlapReply		*rs,
    538 	int			candidate );
    539 
    540 extern int
    541 meta_back_dobind(
    542 	Operation		*op,
    543 	SlapReply		*rs,
    544 	metaconn_t		*mc,
    545 	ldap_back_send_t	sendok,
    546 	SlapReply		*candidates );
    547 
    548 extern int
    549 meta_back_single_dobind(
    550 	Operation		*op,
    551 	SlapReply		*rs,
    552 	metaconn_t		**mcp,
    553 	int			candidate,
    554 	ldap_back_send_t	sendok,
    555 	int			retries,
    556 	int			dolock );
    557 
    558 extern int
    559 meta_back_proxy_authz_cred(
    560 	metaconn_t		*mc,
    561 	int			candidate,
    562 	Operation		*op,
    563 	SlapReply		*rs,
    564 	ldap_back_send_t	sendok,
    565 	struct berval		*binddn,
    566 	struct berval		*bindcred,
    567 	int			*method );
    568 
    569 extern int
    570 meta_back_cancel(
    571 	metaconn_t		*mc,
    572 	Operation		*op,
    573 	SlapReply		*rs,
    574 	ber_int_t		msgid,
    575 	int			candidate,
    576 	ldap_back_send_t	sendok );
    577 
    578 extern int
    579 meta_back_op_result(
    580 	metaconn_t		*mc,
    581 	Operation		*op,
    582 	SlapReply		*rs,
    583 	int			candidate,
    584 	ber_int_t		msgid,
    585 	time_t			timeout,
    586 	ldap_back_send_t	sendok );
    587 
    588 extern int
    589 meta_back_controls_add(
    590 	Operation	*op,
    591 	SlapReply	*rs,
    592 	metaconn_t	*mc,
    593 	int		candidate,
    594 	LDAPControl	***pctrls );
    595 
    596 extern int
    597 back_meta_LTX_init_module(
    598 	int			argc,
    599 	char			*argv[] );
    600 
    601 extern int
    602 meta_back_conn_cmp(
    603 	const void		*c1,
    604 	const void		*c2 );
    605 
    606 extern int
    607 meta_back_conndn_cmp(
    608 	const void		*c1,
    609 	const void		*c2 );
    610 
    611 extern int
    612 meta_back_conndn_dup(
    613 	void			*c1,
    614 	void			*c2 );
    615 
    616 /*
    617  * Candidate stuff
    618  */
    619 extern int
    620 meta_back_is_candidate(
    621 	metatarget_t		*mt,
    622 	struct berval		*ndn,
    623 	int			scope );
    624 
    625 extern int
    626 meta_back_select_unique_candidate(
    627 	metainfo_t		*mi,
    628 	struct berval		*ndn );
    629 
    630 extern int
    631 meta_clear_unused_candidates(
    632 	Operation		*op,
    633 	int			candidate,
    634 	SlapReply *candidates );
    635 
    636 extern int
    637 meta_clear_one_candidate(
    638 	Operation		*op,
    639 	metaconn_t		*mc,
    640 	int			candidate );
    641 
    642 /*
    643  * Dn cache stuff (experimental)
    644  */
    645 extern int
    646 meta_dncache_cmp(
    647 	const void		*c1,
    648 	const void		*c2 );
    649 
    650 extern int
    651 meta_dncache_dup(
    652 	void			*c1,
    653 	void			*c2 );
    654 
    655 #define META_TARGET_NONE	(-1)
    656 #define META_TARGET_MULTIPLE	(-2)
    657 extern int
    658 meta_dncache_get_target(
    659 	metadncache_t		*cache,
    660 	struct berval		*ndn );
    661 
    662 extern int
    663 meta_dncache_update_entry(
    664 	metadncache_t		*cache,
    665 	struct berval		*ndn,
    666 	int			target );
    667 
    668 extern int
    669 meta_dncache_delete_entry(
    670 	metadncache_t		*cache,
    671 	struct berval		*ndn );
    672 
    673 extern void
    674 meta_dncache_free( void *entry );
    675 
    676 extern void
    677 meta_back_map_free( struct ldapmap *lm );
    678 
    679 extern int
    680 meta_subtree_destroy( metasubtree_t *ms );
    681 
    682 extern void
    683 meta_filter_destroy( metafilter_t *mf );
    684 
    685 extern int
    686 meta_target_finish( metainfo_t *mi, metatarget_t *mt,
    687 	const char *log, char *msg, size_t msize
    688 );
    689 
    690 extern void
    691 meta_back_target_free( metatarget_t	*mt );
    692 
    693 extern LDAP_REBIND_PROC		meta_back_default_rebind;
    694 extern LDAP_URLLIST_PROC	meta_back_default_urllist;
    695 
    696 LDAP_END_DECL
    697 
    698 #endif /* SLAPD_META_H */
    699 
    700