Author: abartlet Date: 2006-08-02 02:24:00 +0000 (Wed, 02 Aug 2006) New Revision: 17372
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17372 Log: Changes to ldb_map to handle wildcard mappings, and not rebasing the DN. Andrew Bartlett Modified: branches/SOC/mkhl/ldb-map/modules/ldb_map.c Changeset: Modified: branches/SOC/mkhl/ldb-map/modules/ldb_map.c =================================================================== --- branches/SOC/mkhl/ldb-map/modules/ldb_map.c 2006-08-02 01:25:05 UTC (rev 17371) +++ branches/SOC/mkhl/ldb-map/modules/ldb_map.c 2006-08-02 02:24:00 UTC (rev 17372) @@ -218,6 +218,11 @@ struct ldb_dn *new; int i, offset; + /* Perhaps we don't need to rebase at all? */ + if (!old_base || !new_base) { + return ldb_dn_copy(mem_ctx, old); + } + offset = old->comp_num - old_base->comp_num; new = ldb_dn_copy_partial(mem_ctx, new_base, offset + new_base->comp_num); @@ -319,7 +324,7 @@ { int i; - for (i = 0; data->objectclass_maps[i].local_name; i++) + for (i = 0; data->objectclass_maps && data->objectclass_maps[i].local_name; i++) if (ldb_attr_cmp(data->objectclass_maps[i] .local_name, name) == 0) return &data->objectclass_maps[i]; @@ -334,7 +339,7 @@ { int i; - for (i = 0; data->objectclass_maps[i].remote_name; i++) + for (i = 0; data->objectclass_maps && data->objectclass_maps[i].remote_name; i++) if (ldb_attr_cmp(data->objectclass_maps[i] .remote_name, name) == 0) return &data->objectclass_maps[i]; @@ -350,11 +355,16 @@ { int i; - for (i = 0; data->attribute_maps[i].local_name; i++) + for (i = 0; data->attribute_maps[i].local_name; i++) { if (ldb_attr_cmp(data->attribute_maps[i] .local_name, name) == 0) return &data->attribute_maps[i]; - + } + for (i = 0; data->attribute_maps[i].local_name; i++) { + if (ldb_attr_cmp(data->attribute_maps[i] + .local_name, "*") == 0) + return &data->attribute_maps[i]; + } return NULL; } @@ -365,8 +375,14 @@ const char *name) { int i, j; + const struct ldb_map_attribute *wildcard = NULL; for (i = 0; data->attribute_maps[i].local_name; i++) { + if (ldb_attr_cmp(data->attribute_maps[i] + .local_name, "*") == 0) { + wildcard = &data->attribute_maps[i]; + } + switch (data->attribute_maps[i].type) { case MAP_KEEP: if (ldb_attr_cmp(data->attribute_maps[i] .local_name, name) == 0) @@ -390,7 +406,8 @@ } } - return NULL; + /* We didn't find it, so return the wildcard record if one was configured */ + return wildcard; } @@ -404,6 +421,10 @@ { const struct ldb_map_context *data = map_get_context(module); + if (!data->local_base_dn) { + return True; + } + return ldb_dn_compare_base(module->ldb, data->local_base_dn, dn) == 0; } @@ -572,7 +593,7 @@ continue; case MAP_KEEP: - name = map->local_name; + name = attrs[i]; goto named; case MAP_RENAME: @@ -1601,13 +1622,16 @@ partition_msg_el(struct ldb_module *module, struct ldb_message *local, struct ldb_message *remote, - const struct ldb_map_attribute *map, + const char *attr_name, const struct ldb_message *msg, /* const char * const names[], */ const struct ldb_message_element *old) { struct ldb_message_element *el; + const struct ldb_map_context *data = map_get_context(module); + const struct ldb_map_attribute *map = find_local_attr(data, attr_name); + /* no mapping: ignore */ if (map == NULL) { ldb_debug(module->ldb, LDB_DEBUG_WARNING, "ldb_map: " @@ -1698,10 +1722,8 @@ struct ldb_message *remote, const struct ldb_message *msg) { - const struct ldb_map_context *data = map_get_context(module); /* names of remote attributes the original message can map */ /* const char * const names[]; */ - const struct ldb_map_attribute *map; int i, ret; /* try to map each attribute; @@ -1716,9 +1738,7 @@ continue; } - map = find_local_attr(data, msg->elements[i].name); - - ret = partition_msg_el(module, local, remote, map, + ret = partition_msg_el(module, local, remote, msg->elements[i].name, msg, &msg->elements[i]); if (ret != 0) return ret; @@ -1783,6 +1803,10 @@ goto failed; case MAP_KEEP: + el = copy_conv_msg_el(module, local, old, + old->name, NULL); + break; + case MAP_RENAME: el = copy_conv_msg_el(module, local, old, map->local_name, NULL); @@ -1844,7 +1868,8 @@ for (i = 0; i < remote->num_elements; i++) { map = find_remote_attr(data, remote->elements[i].name); - ret = merge_msg_el(module, local, remote, map, + ret = merge_msg_el(module, local, remote, + map, &remote->elements[i]); if (ret != 0) return ret; @@ -2035,7 +2060,8 @@ } /* XXX: ugly kludge: pass only requested attrs */ - if (req->op.search.attrs) { + if (req->op.search.attrs + && (!ldb_attr_in_list(req->op.search.attrs, "*"))) { struct ldb_message *msg = ldb_msg_new(ares); if (msg == NULL) goto error; @@ -2046,6 +2072,7 @@ ldb_msg_add(msg, el, 0); } + msg->dn = talloc_steal(msg, ares->message->dn); talloc_free(ares->message); ares->message = msg; } @@ -2242,9 +2269,8 @@ /* XXX: ugly kludge ac->local_attrs = local_attrs; + */ ac->remote_req->op.search.attrs = remote_attrs; - */ - ac->remote_req->op.search.attrs = NULL; /* split local from remote tree */ ret = partition_tree(module, ac->remote_req, ac, @@ -2642,7 +2668,7 @@ if (ldb_dn_is_special(req->op.del.dn)) return ldb_next_request(module, req); - /* no mapping requested, skip to next module */ + /* no mapping requested (perhaps no DN mapping specified), skip to next module */ if (!check_dn_local(module, req->op.del.dn)) return ldb_next_request(module, req); @@ -2672,6 +2698,13 @@ ac->remote_req->op.del.dn = map_local_dn(module, ac->remote_req, req->op.del.dn); + /* The DN didn't change, so just pretend we were never here */ + if (ldb_dn_compare(module->ldb, ac->remote_req->op.del.dn, + req->op.del.dn) == 0) { + talloc_free(h); + return ldb_next_request(module, req); + } + ac->remote_req->context = NULL; ac->remote_req->callback = NULL; @@ -2774,10 +2807,11 @@ if (ldb_dn_is_special(req->op.rename.olddn)) return ldb_next_request(module, req); - /* no mapping requested, skip to next module */ - if (!check_dn_local(module, req->op.rename.olddn) && - !check_dn_local(module, req->op.rename.newdn)) + /* no mapping requested, (perhaps no DN mapping specified), skip to next module */ + if ((!check_dn_local(module, req->op.rename.olddn) && + !check_dn_local(module, req->op.rename.newdn))) { return ldb_next_request(module, req); + } /* rename into/out of the mapped partition requested, bail out */ if (!check_dn_local(module, req->op.rename.olddn) || @@ -3078,6 +3112,12 @@ struct ldb_result *res; int ret; + if (!name) { + data->local_base_dn = NULL; + data->remote_base_dn = NULL; + return LDB_SUCCESS; + } + dn = ldb_dn_string_compose(data, NULL, "%s=%s", MAP_DN_NAME, name); if (dn == NULL) { ldb_debug(module->ldb, LDB_DEBUG_ERROR, "ldb_map: "