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: "

Reply via email to