1 #include "replace.h" 2 #include "system/filesys.h" 3 #include "system/time.h" 4 5 /* A handy macro to report Out of Memory conditions */ 6 #define map_oom(module) ldb_set_errstring(ldb_module_get_ctx(module), talloc_asprintf(module, "Out of Memory")); 7 8 /* The type of search callback functions */ 9 typedef int (*ldb_map_callback_t)(struct ldb_request *, struct ldb_reply *); 10 11 /* The special DN from which the local and remote base DNs are fetched */ 12 #define MAP_DN_NAME "@MAP" 13 #define MAP_DN_FROM "@FROM" 14 #define MAP_DN_TO "@TO" 15 16 /* Private data structures 17 * ======================= */ 18 19 struct map_reply { 20 struct map_reply *next; 21 struct ldb_reply *remote; 22 struct ldb_reply *local; 23 }; 24 25 /* Context data for mapped requests */ 26 struct map_context { 27 28 struct ldb_module *module; 29 struct ldb_request *req; 30 31 struct ldb_dn *local_dn; 32 const struct ldb_parse_tree *local_tree; 33 const char * const *local_attrs; 34 const char * const *remote_attrs; 35 const char * const *all_attrs; 36 37 struct ldb_message *local_msg; 38 struct ldb_request *remote_req; 39 40 struct map_reply *r_list; 41 struct map_reply *r_current; 42 43 /* The response continaing any controls the remote server gave */ 44 struct ldb_reply *remote_done_ares; 45 }; 46 47 /* Common operations 48 * ================= */ 49 50 /* The following definitions come from lib/ldb/modules/ldb_map.c */ 51 const struct ldb_map_context *map_get_context(struct ldb_module *module); 52 struct map_context *map_init_context(struct ldb_module *module, 53 struct ldb_request *req); 54 55 int ldb_next_remote_request(struct ldb_module *module, struct ldb_request *request); 56 57 bool map_check_local_db(struct ldb_module *module); 58 bool map_attr_check_remote(const struct ldb_map_context *data, const char *attr); 59 bool ldb_dn_check_local(struct ldb_module *module, struct ldb_dn *dn); 60 61 const struct ldb_map_attribute *map_attr_find_local(const struct ldb_map_context *data, const char *name); 62 const struct ldb_map_attribute *map_attr_find_remote(const struct ldb_map_context *data, const char *name); 63 64 const char *map_attr_map_local(void *mem_ctx, const struct ldb_map_attribute *map, const char *attr); 65 const char *map_attr_map_remote(void *mem_ctx, const struct ldb_map_attribute *map, const char *attr); 66 int map_attrs_merge(struct ldb_module *module, void *mem_ctx, const char ***attrs, const char * const *more_attrs); 67 68 struct ldb_val ldb_val_map_local(struct ldb_module *module, void *mem_ctx, const struct ldb_map_attribute *map, const struct ldb_val *val); 69 struct ldb_val ldb_val_map_remote(struct ldb_module *module, void *mem_ctx, const struct ldb_map_attribute *map, const struct ldb_val *val); 70 71 struct ldb_dn *ldb_dn_map_local(struct ldb_module *module, void *mem_ctx, struct ldb_dn *dn); 72 struct ldb_dn *ldb_dn_map_remote(struct ldb_module *module, void *mem_ctx, struct ldb_dn *dn); 73 struct ldb_dn *ldb_dn_map_rebase_remote(struct ldb_module *module, void *mem_ctx, struct ldb_dn *dn); 74 75 struct ldb_request *map_search_base_req(struct map_context *ac, 76 struct ldb_dn *dn, 77 const char * const *attrs, 78 struct ldb_parse_tree *tree, 79 void *context, 80 ldb_map_callback_t callback); 81 struct ldb_request *map_build_fixup_req(struct map_context *ac, 82 struct ldb_dn *olddn, 83 struct ldb_dn *newdn, 84 void *context, 85 ldb_map_callback_t callback); 86 int map_subtree_collect_remote_simple(struct ldb_module *module, void *mem_ctx, 87 struct ldb_parse_tree **new, 88 const struct ldb_parse_tree *tree, 89 const struct ldb_map_attribute *map); 90 int map_return_fatal_error(struct ldb_request *req, 91 struct ldb_reply *ares); 92 int map_return_normal_error(struct ldb_request *req, 93 struct ldb_reply *ares, 94 int error); 95 96 int map_return_entry(struct map_context *ac, struct ldb_reply *ares); 97