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