]> git.sur5r.net Git - openldap/blob - servers/slapd/back-asyncmeta/back-asyncmeta.h
1d7bea18525be43d036798941906f078e797a84b
[openldap] / servers / slapd / back-asyncmeta / back-asyncmeta.h
1 /* back-asyncmeta.h - main header file for back-asyncmeta module */
2 /* $OpenLDAP$ */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4  *
5  * Copyright 2016 The OpenLDAP Foundation.
6  * Portions Copyright 2016 Symas Corporation.
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 the file LICENSE in the
14  * top-level directory of the distribution or, alternatively, at
15  * <http://www.OpenLDAP.org/license.html>.
16  */
17
18 /* ACKNOWLEDGEMENTS:
19  * This work was developed by Symas Corporation
20  * based on back-meta module for inclusion in OpenLDAP Software.
21  * This work was sponsored by Ericsson. */
22
23 #ifndef SLAPD_LDAP_H
24 #error "include servers/slapd/back-ldap/back-ldap.h before this file!"
25 #endif /* SLAPD_LDAP_H */
26
27 #ifndef SLAPD_ASYNCMETA_H
28 #define SLAPD_ASYNCMETA_H
29
30 #ifndef ENABLE_REWRITE
31 #error "--enable-rewrite is required!"
32 #endif
33
34 #ifdef LDAP_DEVEL
35 #define SLAPD_META_CLIENT_PR 1
36 #endif /* LDAP_DEVEL */
37
38 #include "proto-asyncmeta.h"
39
40 /* String rewrite library */
41 #include "rewrite.h"
42 #include "ldap_rq.h"
43
44 LDAP_BEGIN_DECL
45
46 /*
47  * Set META_BACK_PRINT_CONNTREE larger than 0 to dump the connection tree (debug only)
48  */
49 #ifndef META_BACK_PRINT_CONNTREE
50 #define META_BACK_PRINT_CONNTREE 0
51 #endif /* !META_BACK_PRINT_CONNTREE */
52
53 /* from back-ldap.h before rwm removal */
54 struct ldapmap {
55         int drop_missing;
56
57         Avlnode *map;
58         Avlnode *remap;
59 };
60
61 struct ldapmapping {
62         struct berval src;
63         struct berval dst;
64 };
65
66 struct ldaprwmap {
67         /*
68          * DN rewriting
69          */
70         struct rewrite_info *rwm_rw;
71         BerVarray rwm_bva_rewrite;
72
73         /*
74          * Attribute/objectClass mapping
75          */
76         struct ldapmap rwm_oc;
77         struct ldapmap rwm_at;
78         BerVarray rwm_bva_map;
79 };
80
81 /* Whatever context asyncmeta_dn_massage needs... */
82 typedef struct a_dncookie {
83         struct a_metatarget_t   *target;
84
85         Connection              *conn;
86         char                    *ctx;
87         SlapReply               *rs;
88 } a_dncookie;
89
90 int asyncmeta_dn_massage(a_dncookie *dc, struct berval *dn,
91         struct berval *res);
92
93 extern int asyncmeta_conn_dup( void *c1, void *c2 );
94 extern void asyncmeta_conn_free( void *c );
95
96 /* attributeType/objectClass mapping */
97 int asyncmeta_mapping_cmp (const void *, const void *);
98 int asyncmeta_mapping_dup (void *, void *);
99
100 void asyncmeta_map_init ( struct ldapmap *lm, struct ldapmapping ** );
101 int asyncmeta_mapping ( struct ldapmap *map, struct berval *s,
102         struct ldapmapping **m, int remap );
103 void asyncmeta_map ( struct ldapmap *map, struct berval *s, struct berval *m,
104         int remap );
105 #define BACKLDAP_MAP    0
106 #define BACKLDAP_REMAP  1
107 char *
108 asyncmeta_map_filter(
109         struct ldapmap *at_map,
110         struct ldapmap *oc_map,
111         struct berval *f,
112         int remap );
113
114 int
115 asyncmeta_map_attrs(
116         Operation *op,
117         struct ldapmap *at_map,
118         AttributeName *a,
119         int remap,
120         char ***mapped_attrs );
121
122 extern int
123 asyncmeta_filter_map_rewrite(
124         a_dncookie      *dc,
125         Filter          *f,
126         struct berval   *fstr,
127         int             remap,
128         void            *memctx );
129
130 /* suffix massaging by means of librewrite */
131 extern int
132 asyncmeta_suffix_massage_config( struct rewrite_info *info,
133         struct berval *pvnc,
134         struct berval *nvnc,
135         struct berval *prnc,
136         struct berval *nrnc );
137
138 extern int
139 asyncmeta_back_referral_result_rewrite(
140         a_dncookie      *dc,
141         BerVarray       a_vals,
142         void            *memctx );
143 extern int
144 asyncmeta_dnattr_rewrite(
145         a_dncookie      *dc,
146         BerVarray       a_vals );
147 extern int
148 asyncmeta_dnattr_result_rewrite(
149         a_dncookie      *dc,
150         BerVarray       a_vals );
151
152
153 /* (end of) from back-ldap.h before rwm removal */
154
155 /*
156  * A a_metasingleconn_t can be in the following, mutually exclusive states:
157  *
158  *      - none                  (0x0U)
159  *      - creating              META_BACK_FCONN_CREATING
160  *      - initialized           META_BACK_FCONN_INITED
161  *      - binding               LDAP_BACK_FCONN_BINDING
162  *      - bound/anonymous       LDAP_BACK_FCONN_ISBOUND/LDAP_BACK_FCONN_ISANON
163  *
164  * possible modifiers are:
165  *
166  *      - privileged            LDAP_BACK_FCONN_ISPRIV
167  *      - privileged, TLS       LDAP_BACK_FCONN_ISTLS
168  *      - subjected to idassert LDAP_BACK_FCONN_ISIDASR
169  *      - tainted               LDAP_BACK_FCONN_TAINTED
170  */
171
172 #define META_BACK_FCONN_INITED          (0x00100000U)
173 #define META_BACK_FCONN_CREATING        (0x00200000U)
174
175 #define META_BACK_CONN_INITED(lc)               LDAP_BACK_CONN_ISSET((lc), META_BACK_FCONN_INITED)
176 #define META_BACK_CONN_INITED_SET(lc)           LDAP_BACK_CONN_SET((lc), META_BACK_FCONN_INITED)
177 #define META_BACK_CONN_INITED_CLEAR(lc)         LDAP_BACK_CONN_CLEAR((lc), META_BACK_FCONN_INITED)
178 #define META_BACK_CONN_INITED_CPY(lc, mlc)      LDAP_BACK_CONN_CPY((lc), META_BACK_FCONN_INITED, (mlc))
179 #define META_BACK_CONN_CREATING(lc)             LDAP_BACK_CONN_ISSET((lc), META_BACK_FCONN_CREATING)
180 #define META_BACK_CONN_CREATING_SET(lc)         LDAP_BACK_CONN_SET((lc), META_BACK_FCONN_CREATING)
181 #define META_BACK_CONN_CREATING_CLEAR(lc)       LDAP_BACK_CONN_CLEAR((lc), META_BACK_FCONN_CREATING)
182 #define META_BACK_CONN_CREATING_CPY(lc, mlc)    LDAP_BACK_CONN_CPY((lc), META_BACK_FCONN_CREATING, (mlc))
183
184 struct a_metainfo_t;
185 struct a_metaconn_t;
186 struct a_metatarget_t;
187 #define META_NOT_CANDIDATE              ((ber_tag_t)0x0)
188 #define META_CANDIDATE                  ((ber_tag_t)0x1)
189 #define META_BINDING                    ((ber_tag_t)0x2)
190 #define META_RETRYING                   ((ber_tag_t)0x4)
191
192 typedef struct bm_context_t {
193         LDAP_SLIST_ENTRY(bm_context_t) bc_next;
194         time_t                  timeout;
195         time_t          stoptime;
196         ldap_back_send_t        sendok;
197         ldap_back_send_t        retrying;
198         int candidate_match;
199         int sent;
200         int bc_active;
201         int searchtime; /* stoptime is a search timelimit */
202         int is_ok;
203         SlapReply               rs;
204         Operation               *op;
205         LDAPControl     **ctrls;
206         SlapReply               *candidates;
207 } bm_context_t;
208
209 typedef struct a_metasingleconn_t {
210 #define META_CND_ISSET(rs,f)            ( ( (rs)->sr_tag & (f) ) == (f) )
211 #define META_CND_SET(rs,f)              ( (rs)->sr_tag |= (f) )
212 #define META_CND_CLEAR(rs,f)            ( (rs)->sr_tag &= ~(f) )
213
214 #define META_CANDIDATE_RESET(rs)        ( (rs)->sr_tag = 0 )
215 #define META_IS_CANDIDATE(rs)           META_CND_ISSET( (rs), META_CANDIDATE )
216 #define META_CANDIDATE_SET(rs)          META_CND_SET( (rs), META_CANDIDATE )
217 #define META_CANDIDATE_CLEAR(rs)        META_CND_CLEAR( (rs), META_CANDIDATE )
218 #define META_IS_BINDING(rs)             META_CND_ISSET( (rs), META_BINDING )
219 #define META_BINDING_SET(rs)            META_CND_SET( (rs), META_BINDING )
220 #define META_BINDING_CLEAR(rs)          META_CND_CLEAR( (rs), META_BINDING )
221 #define META_IS_RETRYING(rs)            META_CND_ISSET( (rs), META_RETRYING )
222 #define META_RETRYING_SET(rs)           META_CND_SET( (rs), META_RETRYING )
223 #define META_RETRYING_CLEAR(rs)         META_CND_CLEAR( (rs), META_RETRYING )
224
225         LDAP                    *msc_ld;
226         LDAP                    *msc_ldr;
227         time_t                  msc_time;
228         struct berval           msc_bound_ndn;
229         struct berval           msc_cred;
230         unsigned                msc_mscflags;
231         /* NOTE: lc_lcflags is redefined to msc_mscflags to reuse the macros
232          * defined for back-ldap */
233 #define lc_lcflags              msc_mscflags
234
235         int msc_timeout_ops;
236                 /* Connection for the select */
237         Connection *conn;
238 } a_metasingleconn_t;
239
240 typedef struct a_metaconn_t {
241         ldapconn_base_t         lc_base;
242 #define mc_base                 lc_base
243 //#define       mc_conn                 mc_base.lcb_conn
244 //#define       mc_local_ndn            mc_base.lcb_local_ndn
245 //#define       mc_refcnt               mc_base.lcb_refcnt
246 //#define       mc_create_time          mc_base.lcb_create_time
247 //#define       mc_time                 mc_base.lcb_time
248
249         LDAP_TAILQ_ENTRY(a_metaconn_t)  mc_q;
250
251         /* NOTE: msc_mscflags is used to recycle the #define
252          * in metasingleconn_t */
253         unsigned                msc_mscflags;
254         int     mc_active;
255
256         /*
257          * means that the connection is bound;
258          * of course only one target actually is ...
259          */
260         int                     mc_authz_target;
261 #define META_BOUND_NONE         (-1)
262 #define META_BOUND_ALL          (-2)
263
264         struct a_metainfo_t     *mc_info;
265
266         int pending_ops;
267         ldap_pvt_thread_mutex_t mc_om_mutex;
268         /* queue for pending operations */
269         LDAP_SLIST_HEAD(BCList, bm_context_t) mc_om_list;
270         /* supersedes the connection stuff */
271         a_metasingleconn_t      *mc_conns;
272 } a_metaconn_t;
273
274 typedef enum meta_st_t {
275 #if 0 /* todo */
276         META_ST_EXACT = LDAP_SCOPE_BASE,
277 #endif
278         META_ST_SUBTREE = LDAP_SCOPE_SUBTREE,
279         META_ST_SUBORDINATE = LDAP_SCOPE_SUBORDINATE,
280         META_ST_REGEX /* last + 1 */
281 } meta_st_t;
282
283 typedef struct a_metasubtree_t {
284         meta_st_t ms_type;
285         union {
286                 struct berval msu_dn;
287                 struct {
288                         struct berval msr_regex_pattern;
289                         regex_t msr_regex;
290                 } msu_regex;
291         } ms_un;
292 #define ms_dn ms_un.msu_dn
293 #define ms_regex ms_un.msu_regex.msr_regex
294 #define ms_regex_pattern ms_un.msu_regex.msr_regex_pattern
295
296         struct a_metasubtree_t *ms_next;
297 } a_metasubtree_t;
298
299 typedef struct metafilter_t {
300         struct metafilter_t *mf_next;
301         struct berval mf_regex_pattern;
302         regex_t mf_regex;
303 } metafilter_t;
304
305 typedef struct a_metacommon_t {
306         int                             mc_version;
307         int                             mc_nretries;
308 #define META_RETRY_UNDEFINED    (-2)
309 #define META_RETRY_FOREVER      (-1)
310 #define META_RETRY_NEVER        (0)
311 #define META_RETRY_DEFAULT      (10)
312
313         unsigned                mc_flags;
314 #define META_BACK_CMN_ISSET(mc,f)               ( ( (mc)->mc_flags & (f) ) == (f) )
315 #define META_BACK_CMN_QUARANTINE(mc)            META_BACK_CMN_ISSET( (mc), LDAP_BACK_F_QUARANTINE )
316 #define META_BACK_CMN_CHASE_REFERRALS(mc)       META_BACK_CMN_ISSET( (mc), LDAP_BACK_F_CHASE_REFERRALS )
317 #define META_BACK_CMN_NOREFS(mc)                META_BACK_CMN_ISSET( (mc), LDAP_BACK_F_NOREFS )
318 #define META_BACK_CMN_NOUNDEFFILTER(mc)         META_BACK_CMN_ISSET( (mc), LDAP_BACK_F_NOUNDEFFILTER )
319 #define META_BACK_CMN_SAVECRED(mc)              META_BACK_CMN_ISSET( (mc), LDAP_BACK_F_SAVECRED )
320 #define META_BACK_CMN_ST_REQUEST(mc)            META_BACK_CMN_ISSET( (mc), LDAP_BACK_F_ST_REQUEST )
321
322 #ifdef SLAPD_META_CLIENT_PR
323         /*
324          * client-side paged results:
325          * -1: accept unsolicited paged results responses
326          *  0: off
327          * >0: always request paged results with size == mt_ps
328          */
329 #define META_CLIENT_PR_DISABLE                  (0)
330 #define META_CLIENT_PR_ACCEPT_UNSOLICITED       (-1)
331         ber_int_t               mc_ps;
332 #endif /* SLAPD_META_CLIENT_PR */
333
334         slap_retry_info_t       mc_quarantine;
335         time_t                  mc_network_timeout;
336         struct timeval  mc_bind_timeout;
337 #define META_BIND_TIMEOUT       LDAP_BACK_RESULT_UTIMEOUT
338         time_t                  mc_timeout[ SLAP_OP_LAST ];
339 } a_metacommon_t;
340
341 typedef struct a_metatarget_t {
342         char                    *mt_uri;
343         ldap_pvt_thread_mutex_t mt_uri_mutex;
344
345         /* TODO: we might want to enable different strategies
346          * for different targets */
347         LDAP_REBIND_PROC        *mt_rebind_f;
348         LDAP_URLLIST_PROC       *mt_urllist_f;
349         void                    *mt_urllist_p;
350
351         metafilter_t    *mt_filter;
352         a_metasubtree_t         *mt_subtree;
353         /* F: subtree-include; T: subtree-exclude */
354         int                     mt_subtree_exclude;
355
356         int                     mt_scope;
357
358         struct berval           mt_psuffix;             /* pretty suffix */
359         struct berval           mt_nsuffix;             /* normalized suffix */
360
361         struct berval           mt_binddn;
362         struct berval           mt_bindpw;
363
364         /* we only care about the TLS options here */
365         slap_bindconf           mt_tls;
366
367         slap_idassert_t         mt_idassert;
368 #define mt_idassert_mode        mt_idassert.si_mode
369 #define mt_idassert_authcID     mt_idassert.si_bc.sb_authcId
370 #define mt_idassert_authcDN     mt_idassert.si_bc.sb_binddn
371 #define mt_idassert_passwd      mt_idassert.si_bc.sb_cred
372 #define mt_idassert_authzID     mt_idassert.si_bc.sb_authzId
373 #define mt_idassert_authmethod  mt_idassert.si_bc.sb_method
374 #define mt_idassert_sasl_mech   mt_idassert.si_bc.sb_saslmech
375 #define mt_idassert_sasl_realm  mt_idassert.si_bc.sb_realm
376 #define mt_idassert_secprops    mt_idassert.si_bc.sb_secprops
377 #define mt_idassert_tls         mt_idassert.si_bc.sb_tls
378 #define mt_idassert_flags       mt_idassert.si_flags
379 #define mt_idassert_authz       mt_idassert.si_authz
380
381         struct ldaprwmap        mt_rwmap;
382
383         sig_atomic_t            mt_isquarantined;
384         ldap_pvt_thread_mutex_t mt_quarantine_mutex;
385
386         a_metacommon_t  mt_mc;
387 #define mt_nretries     mt_mc.mc_nretries
388 #define mt_flags        mt_mc.mc_flags
389 #define mt_version      mt_mc.mc_version
390 #define mt_ps           mt_mc.mc_ps
391 #define mt_network_timeout      mt_mc.mc_network_timeout
392 #define mt_bind_timeout mt_mc.mc_bind_timeout
393 #define mt_timeout      mt_mc.mc_timeout
394 #define mt_quarantine   mt_mc.mc_quarantine
395
396 #define META_BACK_TGT_ISSET(mt,f)               ( ( (mt)->mt_flags & (f) ) == (f) )
397 #define META_BACK_TGT_ISMASK(mt,m,f)            ( ( (mt)->mt_flags & (m) ) == (f) )
398
399 #define META_BACK_TGT_SAVECRED(mt)              META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_SAVECRED )
400
401 #define META_BACK_TGT_USE_TLS(mt)               META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_USE_TLS )
402 #define META_BACK_TGT_PROPAGATE_TLS(mt)         META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_PROPAGATE_TLS )
403 #define META_BACK_TGT_TLS_CRITICAL(mt)          META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_TLS_CRITICAL )
404
405 #define META_BACK_TGT_CHASE_REFERRALS(mt)       META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_CHASE_REFERRALS )
406
407 #define META_BACK_TGT_T_F(mt)                   META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_T_F_MASK, LDAP_BACK_F_T_F )
408 #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 )
409
410 #define META_BACK_TGT_ABANDON(mt)               META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_CANCEL_MASK, LDAP_BACK_F_CANCEL_ABANDON )
411 #define META_BACK_TGT_IGNORE(mt)                META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_CANCEL_MASK, LDAP_BACK_F_CANCEL_IGNORE )
412 #define META_BACK_TGT_CANCEL(mt)                META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_CANCEL_MASK, LDAP_BACK_F_CANCEL_EXOP )
413 #define META_BACK_TGT_CANCEL_DISCOVER(mt)       META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_CANCEL_MASK2, LDAP_BACK_F_CANCEL_EXOP_DISCOVER )
414 #define META_BACK_TGT_QUARANTINE(mt)            META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_QUARANTINE )
415
416 #ifdef SLAP_CONTROL_X_SESSION_TRACKING
417 #define META_BACK_TGT_ST_REQUEST(mt)            META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_ST_REQUEST )
418 #define META_BACK_TGT_ST_RESPONSE(mt)           META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_ST_RESPONSE )
419 #endif /* SLAP_CONTROL_X_SESSION_TRACKING */
420
421 #define META_BACK_TGT_NOREFS(mt)                META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_NOREFS )
422 #define META_BACK_TGT_NOUNDEFFILTER(mt)         META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_NOUNDEFFILTER )
423
424 #define META_BACK_CFG_MAX_PENDING_OPS          0x80
425 #define META_BACK_CFG_MAX_TARGET_CONNS          0xFF
426 /* the interval of the timeout checking loop in microseconds
427  * possibly make this configurabe? */
428 #define META_BACK_CFG_MAX_TIMEOUT_LOOP          0x70000
429         slap_mask_t             mt_rep_flags;
430         int                     mt_timeout_ops;
431 } a_metatarget_t;
432
433 typedef struct a_metadncache_t {
434         ldap_pvt_thread_mutex_t mutex;
435         Avlnode                 *tree;
436
437 #define META_DNCACHE_DISABLED   (0)
438 #define META_DNCACHE_FOREVER    ((time_t)(-1))
439         time_t                  ttl;  /* seconds; 0: no cache, -1: no expiry */
440 } a_metadncache_t;
441
442 typedef struct a_metacandidates_t {
443         int                     mc_ntargets;
444         SlapReply               *mc_candidates;
445 } a_metacandidates_t;
446
447 /*
448  * Hook to allow mucking with a_metainfo_t/a_metatarget_t when quarantine is over
449  */
450 typedef int (*asyncmeta_quarantine_f)( struct a_metainfo_t *, int target, void * );
451
452 struct meta_out_message_t;
453
454 typedef struct a_metainfo_t {
455         int                     mi_ntargets;
456         int                     mi_defaulttarget;
457 #define META_DEFAULT_TARGET_NONE        (-1)
458
459 #define mi_nretries     mi_mc.mc_nretries
460 #define mi_flags        mi_mc.mc_flags
461 #define mi_version      mi_mc.mc_version
462 #define mi_ps           mi_mc.mc_ps
463 #define mi_network_timeout      mi_mc.mc_network_timeout
464 #define mi_bind_timeout mi_mc.mc_bind_timeout
465 #define mi_timeout      mi_mc.mc_timeout
466 #define mi_quarantine   mi_mc.mc_quarantine
467
468         a_metatarget_t          **mi_targets;
469         a_metacandidates_t      *mi_candidates;
470
471         LDAP_REBIND_PROC        *mi_rebind_f;
472         LDAP_URLLIST_PROC       *mi_urllist_f;
473
474         a_metadncache_t         mi_cache;
475
476         struct {
477                 int                                             mic_num;
478                 LDAP_TAILQ_HEAD(mc_conn_priv_q, a_metaconn_t)   mic_priv;
479         }                       mi_conn_priv[ LDAP_BACK_PCONN_LAST ];
480         int                     mi_conn_priv_max;
481
482         /* NOTE: quarantine uses the connection mutex */
483         asyncmeta_quarantine_f  mi_quarantine_f;
484         void                    *mi_quarantine_p;
485
486 #define li_flags                mi_flags
487 /* uses flags as defined in <back-ldap/back-ldap.h> */
488 #define META_BACK_F_ONERR_STOP          LDAP_BACK_F_ONERR_STOP
489 #define META_BACK_F_ONERR_REPORT        (0x02000000U)
490 #define META_BACK_F_ONERR_MASK          (META_BACK_F_ONERR_STOP|META_BACK_F_ONERR_REPORT)
491 #define META_BACK_F_DEFER_ROOTDN_BIND   (0x04000000U)
492 #define META_BACK_F_PROXYAUTHZ_ALWAYS   (0x08000000U)   /* users always proxyauthz */
493 #define META_BACK_F_PROXYAUTHZ_ANON     (0x10000000U)   /* anonymous always proxyauthz */
494 #define META_BACK_F_PROXYAUTHZ_NOANON   (0x20000000U)   /* anonymous remains anonymous */
495
496 #define META_BACK_ONERR_STOP(mi)        LDAP_BACK_ISSET( (mi), META_BACK_F_ONERR_STOP )
497 #define META_BACK_ONERR_REPORT(mi)      LDAP_BACK_ISSET( (mi), META_BACK_F_ONERR_REPORT )
498 #define META_BACK_ONERR_CONTINUE(mi)    ( !LDAP_BACK_ISSET( (mi), META_BACK_F_ONERR_MASK ) )
499
500 #define META_BACK_DEFER_ROOTDN_BIND(mi) LDAP_BACK_ISSET( (mi), META_BACK_F_DEFER_ROOTDN_BIND )
501 #define META_BACK_PROXYAUTHZ_ALWAYS(mi) LDAP_BACK_ISSET( (mi), META_BACK_F_PROXYAUTHZ_ALWAYS )
502 #define META_BACK_PROXYAUTHZ_ANON(mi)   LDAP_BACK_ISSET( (mi), META_BACK_F_PROXYAUTHZ_ANON )
503 #define META_BACK_PROXYAUTHZ_NOANON(mi) LDAP_BACK_ISSET( (mi), META_BACK_F_PROXYAUTHZ_NOANON )
504
505 #define META_BACK_QUARANTINE(mi)        LDAP_BACK_ISSET( (mi), LDAP_BACK_F_QUARANTINE )
506
507         time_t                  mi_idle_timeout;
508         struct re_s *mi_task;
509
510         a_metacommon_t  mi_mc;
511         ldap_extra_t    *mi_ldap_extra;
512
513         int                    mi_max_timeout_ops;
514         int                    mi_max_pending_ops;
515         int                    mi_max_target_conns;
516         /* mutex for access to the connection structures */
517         ldap_pvt_thread_mutex_t mi_mc_mutex;
518         int                    mi_num_conns;
519         int                    mi_next_conn;
520         a_metaconn_t          *mi_conns;
521
522 } a_metainfo_t;
523
524 typedef enum meta_op_type {
525         META_OP_ALLOW_MULTIPLE = 0,
526         META_OP_REQUIRE_SINGLE,
527         META_OP_REQUIRE_ALL
528 } meta_op_type;
529
530 extern a_metaconn_t *
531 asyncmeta_getconn(
532         Operation               *op,
533         SlapReply               *rs,
534         SlapReply               *candidates,
535         int                     *candidate,
536         ldap_back_send_t        sendok,
537         int                     alloc_new);
538
539 extern int
540 asyncmeta_retry(
541         Operation               *op,
542         SlapReply               *rs,
543         a_metaconn_t            **mcp,
544         int                     candidate,
545         ldap_back_send_t        sendok );
546
547 extern void
548 asyncmeta_conn_free(
549         void                    *v_mc );
550
551 extern int
552 asyncmeta_init_one_conn(
553         Operation               *op,
554         SlapReply               *rs,
555         a_metaconn_t            *mc,
556         int                     candidate,
557         int                     ispriv,
558         ldap_back_send_t        sendok,
559         int                     dolock );
560
561 extern void
562 asyncmeta_quarantine(
563         Operation               *op,
564         a_metainfo_t            *mi,
565         SlapReply               *rs,
566         int                     candidate );
567
568 extern int
569 asyncmeta_dobind(
570         Operation               *op,
571         SlapReply               *rs,
572         a_metaconn_t            *mc,
573         ldap_back_send_t        sendok,
574         SlapReply               *candidates);
575
576 extern int
577 asyncmeta_single_dobind(
578         Operation               *op,
579         SlapReply               *rs,
580         a_metaconn_t            **mcp,
581         int                     candidate,
582         ldap_back_send_t        sendok,
583         int                     retries,
584         int                     dolock );
585
586 extern int
587 asyncmeta_proxy_authz_cred(
588         a_metaconn_t            *mc,
589         int                     candidate,
590         Operation               *op,
591         SlapReply               *rs,
592         ldap_back_send_t        sendok,
593         struct berval           *binddn,
594         struct berval           *bindcred,
595         int                     *method );
596
597 extern int
598 asyncmeta_cancel(
599         a_metaconn_t            *mc,
600         Operation               *op,
601         SlapReply               *rs,
602         ber_int_t               msgid,
603         int                     candidate,
604         ldap_back_send_t        sendok );
605
606 extern int
607 asyncmeta_op_result(
608         a_metaconn_t            *mc,
609         Operation               *op,
610         SlapReply               *rs,
611         int                     candidate,
612         ber_int_t               msgid,
613         time_t                  timeout,
614         ldap_back_send_t        sendok );
615
616 extern int
617 asyncmeta_controls_add(
618         Operation       *op,
619         SlapReply       *rs,
620         a_metaconn_t    *mc,
621         int             candidate,
622         LDAPControl     ***pctrls );
623
624 extern int
625 asyncmeta_LTX_init_module(
626         int                     argc,
627         char                    *argv[] );
628
629 /*
630  * Candidate stuff
631  */
632 extern int
633 asyncmeta_is_candidate(
634         a_metatarget_t          *mt,
635         struct berval           *ndn,
636         int                     scope );
637
638 extern int
639 asyncmeta_select_unique_candidate(
640         a_metainfo_t            *mi,
641         struct berval           *ndn );
642
643 extern int
644 asyncmeta_clear_unused_candidates(
645         Operation               *op,
646         int                     candidate,
647         a_metaconn_t            *mc,
648         SlapReply       *candidates);
649
650 /*
651  * Dn cache stuff (experimental)
652  */
653 extern int
654 asyncmeta_dncache_cmp(
655         const void              *c1,
656         const void              *c2 );
657
658 extern int
659 asyncmeta_dncache_dup(
660         void                    *c1,
661         void                    *c2 );
662
663 #define META_TARGET_NONE        (-1)
664 #define META_TARGET_MULTIPLE    (-2)
665 extern int
666 asyncmeta_dncache_get_target(
667         a_metadncache_t         *cache,
668         struct berval           *ndn );
669
670 extern int
671 meta_dncache_update_entry(
672         a_metadncache_t         *cache,
673         struct berval           *ndn,
674         int                     target );
675
676 extern int
677 asyncmeta_dncache_delete_entry(
678         a_metadncache_t         *cache,
679         struct berval           *ndn );
680
681 extern void
682 asyncmeta_dncache_free( void *entry );
683
684 extern void
685 asyncmeta_back_map_free( struct ldapmap *lm );
686
687 extern int
688 asyncmeta_subtree_destroy( a_metasubtree_t *ms );
689
690 extern void
691 asyncmeta_filter_destroy( metafilter_t *mf );
692
693 extern int
694 asyncmeta_target_finish( a_metainfo_t *mi, a_metatarget_t *mt,
695         const char *log, char *msg, size_t msize
696 );
697
698
699 extern LDAP_REBIND_PROC         asyncmeta_back_default_rebind;
700 extern LDAP_URLLIST_PROC        asyncmeta_back_default_urllist;
701
702 /* IGNORE means that target does not (no longer) participate
703  * in the search;
704  * NOTREADY means the search on that target has not been initialized yet
705  */
706 #define META_MSGID_IGNORE       (-1)
707 #define META_MSGID_NEED_BIND    (-2)
708 #define META_MSGID_CONNECTING   (-3)
709 #define META_MSGID_UNDEFINED    (-4)
710
711 typedef enum meta_search_candidate_t {
712         META_SEARCH_UNDEFINED = -2,
713         META_SEARCH_ERR = -1,
714         META_SEARCH_NOT_CANDIDATE,
715         META_SEARCH_CANDIDATE,
716         META_SEARCH_BINDING,
717         META_SEARCH_NEED_BIND,
718         META_SEARCH_CONNECTING
719 } meta_search_candidate_t;
720
721 Operation* asyncmeta_copy_op(Operation *op);
722 void asyncmeta_clear_bm_context(bm_context_t *bc);
723
724 int asyncmeta_add_message_queue(a_metaconn_t *mc, bm_context_t *bc);
725 void asyncmeta_drop_bc(a_metaconn_t *mc, bm_context_t *bc);
726
727 bm_context_t *
728 asyncmeta_find_message(ber_int_t msgid, a_metaconn_t *mc, int candidate);
729
730 bm_context_t *
731 asyncmeta_find_message_by_opmsguid(ber_int_t msgid, a_metaconn_t *mc, int remove);
732
733 void* asyncmeta_op_handle_result(void *ctx, void *arg);
734 int asyncmeta_back_cleanup( Operation *op, SlapReply *rs, bm_context_t *bm );
735
736 int
737 asyncmeta_clear_one_msc(
738         Operation       *op,
739         a_metaconn_t    *msc,
740         int             candidate );
741
742 a_metaconn_t *
743 asyncmeta_get_next_mc( a_metainfo_t *mi );
744
745 void* asyncmeta_timeout_loop(void *ctx, void *arg);
746 int
747 asyncmeta_start_timeout_loop(a_metatarget_t *mt, a_metainfo_t *mi);
748 void asyncmeta_set_msc_time(a_metasingleconn_t *msc);
749 void asyncmeta_clear_message_queue(a_metasingleconn_t *msc);
750
751 int asyncmeta_back_cancel(
752         a_metaconn_t    *mc,
753         Operation               *op,
754         ber_int_t               msgid,
755         int                             candidate );
756
757 int
758 asyncmeta_back_cancel_msc(
759         Operation               *op,
760         SlapReply               *rs,
761         ber_int_t               msgid,
762         a_metasingleconn_t      *msc,
763         int                     candidate,
764         ldap_back_send_t        sendok );
765
766 int
767 asyncmeta_back_abandon_candidate(
768         a_metaconn_t            *mc,
769         Operation               *op,
770         ber_int_t               msgid,
771         int                     candidate );
772 void
773 asyncmeta_send_result(bm_context_t* bc, int error, char *text);
774
775 int asyncmeta_new_bm_context(Operation *op, SlapReply *rs, bm_context_t **new_bc, int ntargets);
776 int asyncmeta_start_listeners(a_metaconn_t *mc, SlapReply *candidates);
777 int asyncmeta_start_one_listener(a_metaconn_t *mc, SlapReply *candidates, int candidate);
778
779 meta_search_candidate_t
780 asyncmeta_back_search_start(
781         Operation             *op,
782         SlapReply             *rs,
783         a_metaconn_t          *mc,
784         bm_context_t          *bc,
785         int                   candidate,
786         struct berval         *prcookie,
787         ber_int_t             prsize );
788
789 meta_search_candidate_t
790 asyncmeta_dobind_init(
791         Operation            *op,
792         SlapReply            *rs,
793         bm_context_t         *bc,
794         a_metaconn_t         *mc,
795         int                  candidate);
796
797 meta_search_candidate_t
798 asyncmeta_dobind_init_with_retry(
799         Operation            *op,
800         SlapReply            *rs,
801         bm_context_t         *bc,
802         a_metaconn_t         *mc,
803         int                  candidate);
804
805 meta_search_candidate_t
806 asyncmeta_back_add_start(Operation *op,
807                          SlapReply *rs,
808                          a_metaconn_t *mc,
809                          bm_context_t *bc,
810                          int candidate);
811 meta_search_candidate_t
812 asyncmeta_back_modify_start(Operation *op,
813                          SlapReply *rs,
814                          a_metaconn_t *mc,
815                          bm_context_t *bc,
816                          int candidate);
817
818 meta_search_candidate_t
819 asyncmeta_back_modrdn_start(Operation *op,
820                          SlapReply *rs,
821                          a_metaconn_t *mc,
822                          bm_context_t *bc,
823                          int candidate);
824 meta_search_candidate_t
825 asyncmeta_back_delete_start(Operation *op,
826                          SlapReply *rs,
827                          a_metaconn_t *mc,
828                          bm_context_t *bc,
829                          int candidate);
830
831 meta_search_candidate_t
832 asyncmeta_back_compare_start(Operation *op,
833                          SlapReply *rs,
834                          a_metaconn_t *mc,
835                          bm_context_t *bc,
836                          int candidate);
837
838
839 void
840 asyncmeta_sender_error(Operation *op,
841                        SlapReply *rs,
842                        slap_callback *cb);
843
844
845 LDAP_END_DECL
846
847 #endif /* SLAPD_ASYNCMETA_H */