X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-meta%2Fback-meta.h;h=620bb93e14c96ef7976c3e43c5cb6adff728166e;hb=be53e8265065e7de61a0996e37732f44e22fdec7;hp=e6d6464080153480a3e381875c3434ca312164f7;hpb=066a80bbbb6ae29b6f893b25d92b158bb0065232;p=openldap diff --git a/servers/slapd/back-meta/back-meta.h b/servers/slapd/back-meta/back-meta.h index e6d6464080..620bb93e14 100644 --- a/servers/slapd/back-meta/back-meta.h +++ b/servers/slapd/back-meta/back-meta.h @@ -1,7 +1,9 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1999-2003 The OpenLDAP Foundation. + * Copyright 1999-2005 The OpenLDAP Foundation. + * Portions Copyright 2001-2003 Pierangelo Masarati. + * Portions Copyright 1999-2003 Howard Chu. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -17,71 +19,6 @@ * in OpenLDAP Software and subsequently enhanced by Pierangelo * Masarati. */ -/* This is an altered version */ -/* - * Copyright 1999, Howard Chu, All rights reserved. - * - * Copyright 2001, Pierangelo Masarati, All rights reserved. - * - * This work has been developed to fulfill the requirements - * of SysNet s.n.c. and it has been donated - * to the OpenLDAP Foundation in the hope that it may be useful - * to the Open Source community, but WITHOUT ANY WARRANTY. - * - * Permission is granted to anyone to use this software for any purpose - * on any computer system, and to alter it and redistribute it, subject - * to the following restrictions: - * - * 1. The author and SysNet s.n.c. are not responsible for the consequences - * of use of this software, no matter how awful, even if they arise from - * flaws in it. - * - * 2. The origin of this software must not be misrepresented, either by - * explicit claim or by omission. Since few users ever read sources, - * credits should appear in the documentation. - * - * 3. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software. Since few users - * ever read sources, credits should appear in the documentation. - * SysNet s.n.c. cannot be responsible for the consequences of the - * alterations. - * - * 4. This notice may not be removed or altered. - * - * - * This software is based on the backend back-ldap, implemented - * by Howard Chu , and modified by Mark Valence - * , Pierangelo Masarati and other - * contributors. The contribution of the original software to the present - * implementation is acknowledged in this copyright statement. - * - * A special acknowledgement goes to Howard for the overall architecture - * (and for borrowing large pieces of code), and to Mark, who implemented - * from scratch the attribute/objectclass mapping. - * - * The original copyright statement follows. - * - * Copyright 1999, Howard Chu, All rights reserved. - * - * Permission is granted to anyone to use this software for any purpose - * on any computer system, and to alter it and redistribute it, subject - * to the following restrictions: - * - * 1. The author is not responsible for the consequences of use of this - * software, no matter how awful, even if they arise from flaws in it. - * - * 2. The origin of this software must not be misrepresented, either by - * explicit claim or by omission. Since few users ever read sources, - * credits should appear in the documentation. - * - * 3. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software. Since few users - * ever read sources, credits should appear in the - * documentation. - * - * 4. This notice may not be removed or altered. - * - */ #ifndef SLAPD_LDAP_H #error "include servers/slapd/back-ldap/back-ldap.h before this file!" @@ -90,7 +27,7 @@ #ifndef SLAPD_META_H #define SLAPD_META_H -#include "external.h" +#include "proto-meta.h" /* String rewrite library */ #include "rewrite.h" @@ -99,212 +36,351 @@ LDAP_BEGIN_DECL struct slap_conn; struct slap_op; -struct metasingleconn { - int candidate; -#define META_NOT_CANDIDATE 0 -#define META_CANDIDATE 1 -#define META_LAST_CONN -1 +/* from back-ldap.h before rwm removal */ +struct ldapmap { + int drop_missing; + + Avlnode *map; + Avlnode *remap; +}; + +struct ldapmapping { + struct berval src; + struct berval dst; +}; + +struct ldaprwmap { + /* + * DN rewriting + */ +#ifdef ENABLE_REWRITE + struct rewrite_info *rwm_rw; +#else /* !ENABLE_REWRITE */ + /* some time the suffix massaging without librewrite + * will be disabled */ + BerVarray rwm_suffix_massage; +#endif /* !ENABLE_REWRITE */ + + /* + * Attribute/objectClass mapping + */ + struct ldapmap rwm_oc; + struct ldapmap rwm_at; +}; + +/* Whatever context ldap_back_dn_massage needs... */ +typedef struct dncookie { + struct metatarget_t *target; + +#ifdef ENABLE_REWRITE + Connection *conn; + char *ctx; + SlapReply *rs; +#else + int normalized; + int tofrom; +#endif +} dncookie; + +/* TODO: allow to define it on a per-target basis */ +#define META_BIND_TIMEOUT 10000 + +int ldap_back_dn_massage(dncookie *dc, struct berval *dn, + struct berval *res); + +extern int ldap_back_conn_cmp( const void *c1, const void *c2); +extern int ldap_back_conn_dup( void *c1, void *c2 ); +extern void ldap_back_conn_free( void *c ); + +/* attributeType/objectClass mapping */ +int mapping_cmp (const void *, const void *); +int mapping_dup (void *, void *); + +void ldap_back_map_init ( struct ldapmap *lm, struct ldapmapping ** ); +int ldap_back_mapping ( struct ldapmap *map, struct berval *s, + struct ldapmapping **m, int remap ); +void ldap_back_map ( struct ldapmap *map, struct berval *s, struct berval *m, + int remap ); +#define BACKLDAP_MAP 0 +#define BACKLDAP_REMAP 1 +char * +ldap_back_map_filter( + struct ldapmap *at_map, + struct ldapmap *oc_map, + struct berval *f, + int remap ); + +int +ldap_back_map_attrs( + struct ldapmap *at_map, + AttributeName *a, + int remap, + char ***mapped_attrs ); + +extern int ldap_back_map_config( + struct ldapmap *oc_map, + struct ldapmap *at_map, + const char *fname, + int lineno, + int argc, + char **argv ); + +extern int +ldap_back_filter_map_rewrite( + dncookie *dc, + Filter *f, + struct berval *fstr, + int remap ); + +/* suffix massaging by means of librewrite */ +#ifdef ENABLE_REWRITE +extern int +suffix_massage_config( struct rewrite_info *info, + struct berval *pvnc, + struct berval *nvnc, + struct berval *prnc, + struct berval *nrnc ); +#endif /* ENABLE_REWRITE */ +extern int +ldap_back_referral_result_rewrite( + dncookie *dc, + BerVarray a_vals ); +extern int +ldap_dnattr_rewrite( + dncookie *dc, + BerVarray a_vals ); +extern int +ldap_dnattr_result_rewrite( + dncookie *dc, + BerVarray a_vals ); + +/* (end of) from back-ldap.h before rwm removal */ + +struct metainfo_t; + +typedef struct metasingleconn_t { + int msc_candidate; +#define META_NOT_CANDIDATE ((ber_tag_t)0) +#define META_CANDIDATE ((ber_tag_t)1) - LDAP *ld; - struct berval bound_dn; - struct berval cred; - int bound; + LDAP *msc_ld; + struct berval msc_bound_ndn; + struct berval msc_cred; + int msc_bound; #define META_UNBOUND 0 #define META_BOUND 1 #define META_ANONYMOUS 2 -}; -#define META_LAST(lsc) ((lsc)->candidate == META_LAST_CONN) + struct metainfo_t *msc_info; +} metasingleconn_t; -struct metaconn { - struct slap_conn *conn; - struct rewrite_info *rwinfo; +typedef struct metaconn_t { + struct slap_conn *mc_conn; + ldap_pvt_thread_mutex_t mc_mutex; /* * means that the connection is bound; * of course only one target actually is ... */ - int bound_target; -#define META_BOUND_NONE -1 -#define META_BOUND_ALL -2 + int mc_auth_target; +#define META_BOUND_NONE (-1) +#define META_BOUND_ALL (-2) /* supersedes the connection stuff */ - struct metasingleconn *conns; -}; + metasingleconn_t *mc_conns; +} metaconn_t; -struct metatarget { - char *uri; - struct berval psuffix; /* pretty suffix */ - struct berval suffix; /* normalized suffix */ - struct berval binddn; - struct berval bindpw; +typedef struct metatarget_t { + char *mt_uri; - struct berval pseudorootdn; - struct berval pseudorootpw; + struct berval mt_psuffix; /* pretty suffix */ + struct berval mt_nsuffix; /* normalized suffix */ -#if 0 - struct rewrite_info *rwinfo; + struct berval mt_binddn; + struct berval mt_bindpw; - struct ldapmap oc_map; - struct ldapmap at_map; -#endif - struct ldaprwmap rwmap; -}; + struct berval mt_pseudorootdn; + struct berval mt_pseudorootpw; -struct metadncache { + int mt_nretries; +#define META_RETRY_UNDEFINED (-2) +#define META_RETRY_FOREVER (-1) +#define META_RETRY_NEVER (0) +#define META_RETRY_DEFAULT (3) + + struct ldaprwmap mt_rwmap; + + unsigned mt_flags; + int mt_version; +} metatarget_t; + +typedef struct metadncache_t { ldap_pvt_thread_mutex_t mutex; Avlnode *tree; -#define META_DNCACHE_DISABLED 0 -#define META_DNCACHE_FOREVER -1 +#define META_DNCACHE_DISABLED (0) +#define META_DNCACHE_FOREVER (-1) long int ttl; /* seconds; 0: no cache, -1: no expiry */ -}; +} metadncache_t; -struct metainfo { - int ntargets; - int defaulttarget; - int network_timeout; -#define META_DEFAULT_TARGET_NONE -1 - struct metatarget **targets; +typedef struct metainfo_t { + int mi_ntargets; + int mi_defaulttarget; + int mi_network_timeout; +#define META_DEFAULT_TARGET_NONE (-1) + int mi_nretries; - struct rewrite_info *rwinfo; - Backend *glue_be; + metatarget_t *mi_targets; + SlapReply *mi_candidates; - struct metadncache cache; + metadncache_t mi_cache; - ldap_pvt_thread_mutex_t conn_mutex; - Avlnode *conntree; + ldap_pvt_thread_mutex_t mi_conn_mutex; + Avlnode *mi_conntree; - int savecred; -}; + unsigned flags; +#if 0 +/* defined in */ +#define LDAP_BACK_F_NONE 0x00U +#define LDAP_BACK_F_SAVECRED 0x01U +#define LDAP_BACK_F_USE_TLS 0x02U +#define LDAP_BACK_F_PROPAGATE_TLS 0x04U +#define LDAP_BACK_F_TLS_CRITICAL 0x08U +#define LDAP_BACK_F_TLS_MASK (LDAP_BACK_F_USE_TLS|LDAP_BACK_F_PROPAGATE_TLS|LDAP_BACK_F_TLS_CRITICAL) +#define LDAP_BACK_F_CHASE_REFERRALS 0x10U +#endif + + int mi_version; +} metainfo_t; -#define META_OP_ALLOW_MULTIPLE 0x00 -#define META_OP_REQUIRE_SINGLE 0x01 -#define META_OP_REQUIRE_ALL 0x02 -extern struct metaconn * +typedef enum meta_op_type { + META_OP_ALLOW_MULTIPLE = 0, + META_OP_REQUIRE_SINGLE, + META_OP_REQUIRE_ALL +} meta_op_type; + +SlapReply * +meta_back_candidates_get( Operation *op ); + +extern metaconn_t * meta_back_getconn( - Operation *op, - SlapReply *rs, - int op_type, - struct berval *dn, - int *candidate -); + Operation *op, + SlapReply *rs, + int *candidate, + ldap_back_send_t sendok ); extern int -meta_back_dobind( - struct metaconn *lc, - Operation *op -); +meta_back_retry( + Operation *op, + SlapReply *rs, + metaconn_t *mc, + int candidate, + ldap_back_send_t sendok ); + +extern void +meta_back_conn_free( metaconn_t *mc ); + +extern int +meta_back_init_one_conn( + Operation *op, + SlapReply *rs, + metatarget_t *mt, + metasingleconn_t *msc, + ldap_back_send_t sendok ); extern int -meta_back_is_valid( - struct metaconn *lc, - int candidate -); +meta_back_dobind( + Operation *op, + SlapReply *rs, + metaconn_t *mc, + ldap_back_send_t sendok ); + +int +meta_back_single_dobind( + Operation *op, + SlapReply *rs, + metaconn_t *msc, + int candidate, + ldap_back_send_t sendok, + int retries ); extern int meta_back_op_result( - struct metaconn *lc, - Operation *op, - SlapReply *rs -); + metaconn_t *mc, + Operation *op, + SlapReply *rs, + int candidate ); extern int back_meta_LTX_init_module( - int argc, - char *argv[] -); + int argc, + char *argv[] ); extern int meta_back_conn_cmp( - const void *c1, - const void *c2 -); + const void *c1, + const void *c2 ); extern int meta_back_conn_dup( - void *c1, - void *c2 -); + void *c1, + void *c2 ); /* * Candidate stuff */ extern int meta_back_is_candidate( - struct berval *nsuffix, - struct berval *ndn -); - -extern int -meta_back_count_candidates( - struct metainfo *li, - struct berval *ndn -); - -extern int -meta_back_is_candidate_unique( - struct metainfo *li, - struct berval *ndn -); + struct berval *nsuffix, + struct berval *ndn, + int scope ); extern int meta_back_select_unique_candidate( - struct metainfo *li, - struct berval *ndn -); + metainfo_t *mi, + struct berval *ndn ); extern int meta_clear_unused_candidates( - struct metainfo *li, - struct metaconn *lc, - int candidate, - int reallyclean -); + Operation *op, + int candidate ); extern int meta_clear_one_candidate( - struct metasingleconn *lc, - int reallyclean -); + metasingleconn_t *mc ); /* * Dn cache stuff (experimental) */ extern int meta_dncache_cmp( - const void *c1, - const void *c2 -); + const void *c1, + const void *c2 ); extern int meta_dncache_dup( - void *c1, - void *c2 -); + void *c1, + void *c2 ); +#define META_TARGET_NONE (-1) +#define META_TARGET_MULTIPLE (-2) extern int meta_dncache_get_target( - struct metadncache *cache, - struct berval *ndn -); + metadncache_t *cache, + struct berval *ndn ); extern int meta_dncache_update_entry( - struct metadncache *cache, - struct berval *ndn, - int target -); + metadncache_t *cache, + struct berval *ndn, + int target ); extern int meta_dncache_delete_entry( - struct metadncache *cache, - struct berval *ndn -); + metadncache_t *cache, + struct berval *ndn ); extern void -meta_dncache_free( - void *entry -); +meta_dncache_free( void *entry ); LDAP_END_DECL