X-Git-Url: http://git.samba.org/samba.git/?p=sfrench%2Fsamba-autobuild%2F.git;a=blobdiff_plain;f=source4%2Flib%2Fldb%2Fldb_map%2Fldb_map.c;h=f68ba3d545fedf2be558cbd1fda104005dd7ac7a;hp=79d3c26f9061638a39a60b750dddf2e7d9ff0180;hb=615e1c55bfd0b5e5cb2ac77b19a0c395ef566bd2;hpb=442d147f6d39a9ac9545a096c7f62386cbe8b480 diff --git a/source4/lib/ldb/ldb_map/ldb_map.c b/source4/lib/ldb/ldb_map/ldb_map.c index 79d3c26f906..f68ba3d545f 100644 --- a/source4/lib/ldb/ldb_map/ldb_map.c +++ b/source4/lib/ldb/ldb_map/ldb_map.c @@ -62,10 +62,35 @@ static struct ldb_map_context *map_get_privdat(struct ldb_module *module) return &((struct map_private *)module->private_data)->context; } +static const struct ldb_map_objectclass *map_find_objectclass_local(struct ldb_map_context *privdat, const char *name) +{ + int i; + for (i = 0; privdat->objectclass_maps[i].local_name; i++) { + if (!ldb_attr_cmp(privdat->objectclass_maps[i].local_name, name)) + return &privdat->objectclass_maps[i]; + } + + return NULL; +} + +/* Decide whether a add/modify should be pushed to the + * remote LDAP server. We currently only do this if we see an objectClass we know */ static BOOL map_is_mappable(struct ldb_map_context *privdat, const struct ldb_message *msg) { - /* FIXME */ - return True; + int i; + struct ldb_message_element *el = ldb_msg_find_element(msg, "objectClass"); + + /* No objectClass... */ + if (el == NULL) { + return False; + } + + for (i = 0; i < el->num_values; i++) { + if (map_find_objectclass_local(privdat, (char *)el->values[i].data)) + return True; + } + + return False; } /* find an attribute by the local name */ @@ -745,22 +770,29 @@ static int map_search_bytree_mp(struct ldb_module *module, const struct ldb_dn * int extraret; /* Merge with additional data from local database */ - extraret = ldb_next_search(module, merged->dn, LDB_SCOPE_ONELEVEL, "", NULL, &extrares); + extraret = ldb_next_search(module, merged->dn, LDB_SCOPE_BASE, "", NULL, &extrares); - if (extraret > 1) { + if (extraret == -1) { + ldb_debug(module->ldb, LDB_DEBUG_ERROR, "Error searching for extra data!\n"); + } else if (extraret > 1) { ldb_debug(module->ldb, LDB_DEBUG_ERROR, "More then one result for extra data!\n"); + talloc_free(newres); return -1; - } else if (extraret == 1) { + } else if (extraret == 0) { + ldb_debug(module->ldb, LDB_DEBUG_TRACE, "No extra data found for remote DN"); + } + + if (extraret == 1) { int j; ldb_debug(module->ldb, LDB_DEBUG_TRACE, "Extra data found for remote DN"); - for (j = 0; j < merged->num_elements; j++) { - ldb_msg_add(module->ldb, merged, &extrares[0]->elements[j], extrares[0]->elements[j].flags); + for (j = 0; j < extrares[0]->num_elements; j++) { + ldb_msg_add(module->ldb, merged, &(extrares[0]->elements[j]), extrares[0]->elements[j].flags); } + + ldb_msg_add_string(module->ldb, merged, "extraMapped", "TRUE"); } else { - ldb_debug(module->ldb, LDB_DEBUG_TRACE, "No extra data found for remote DN"); + ldb_msg_add_string(module->ldb, merged, "extraMapped", "FALSE"); } - - talloc_free(extrares); if (ldb_match_msg(module->ldb, merged, tree, base, scope)) { (*res)[ret] = merged; @@ -768,10 +800,10 @@ static int map_search_bytree_mp(struct ldb_module *module, const struct ldb_dn * } else { ldb_debug(module->ldb, LDB_DEBUG_TRACE, "Discarded merged message because it did not match"); } - - talloc_free(newres[i]); } + talloc_free(newres); + return ret; } @@ -783,7 +815,6 @@ static int map_search_bytree(struct ldb_module *module, const struct ldb_dn *bas enum ldb_scope scope, struct ldb_parse_tree *tree, const char * const *attrs, struct ldb_message ***res) { - int ret; struct ldb_message **fbres, **mpres; int i; int ret_fb, ret_mp; @@ -803,8 +834,6 @@ static int map_search_bytree(struct ldb_module *module, const struct ldb_dn *bas for (i = 0; i < ret_mp; i++) (*res)[ret_fb+i] = mpres[i]; return ret_fb + ret_mp; - - return ret; } /* search for matching records