summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/lib/ldb/modules/ldb_map.c165
-rw-r--r--source4/lib/ldb/modules/ldb_map.h4
-rw-r--r--source4/lib/samba3/PLAN5
-rwxr-xr-xtestprogs/ejs/samba3sam2
4 files changed, 99 insertions, 77 deletions
diff --git a/source4/lib/ldb/modules/ldb_map.c b/source4/lib/ldb/modules/ldb_map.c
index f3ece2621e..3bbf893a27 100644
--- a/source4/lib/ldb/modules/ldb_map.c
+++ b/source4/lib/ldb/modules/ldb_map.c
@@ -1001,37 +1001,39 @@ static int map_add(struct ldb_module *module, const struct ldb_message *msg)
for (i = 0; i < msg->num_elements; i++) {
const struct ldb_map_attribute *attr;
struct ldb_message_element *elm = NULL;
- enum ldb_map_attr_type map_type;
- int j;
+ int j, k;
int mapped = 0;
if (ldb_attr_cmp(msg->elements[i].name, "objectClass") == 0)
continue;
- attr = map_find_attr_local(privdat, msg->elements[i].name);
+ /* Loop over all attribute_maps with msg->elements[i].name as local_name */
+ for (k = 0; privdat->attribute_maps[k].local_name; k++) {
+ if (ldb_attr_cmp(msg->elements[i].name, privdat->attribute_maps[k].local_name) != 0)
+ continue;
- if (!attr) {
- ldb_debug(module->ldb, LDB_DEBUG_WARNING, "Undefined local attribute '%s', ignoring\n", msg->elements[i].name);
- map_type = MAP_IGNORE;
- } else map_type = attr->type;
+ attr = &privdat->attribute_maps[k];
- /* Decide whether or not we need to map or fallback */
- switch (map_type) {
- case MAP_GENERATE:
- ldb_debug(module->ldb, LDB_DEBUG_TRACE, "Generating from %s", attr->local_name);
- attr->u.generate.generate_remote(module, attr->local_name, msg, mp, fb);
- continue;
- case MAP_KEEP:
- mapped = map_msg_valid_attr(module, mp, attr->local_name);
- break;
- case MAP_IGNORE: mapped = 0; break;
- case MAP_CONVERT:
- case MAP_RENAME: mapped = map_msg_valid_attr(module, mp, attr->u.rename.remote_name);
- break;
- }
+ /* Decide whether or not we need to map or fallback */
+ switch (attr->type) {
+ case MAP_GENERATE:
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "Generating from %s", attr->local_name);
+ attr->u.generate.generate_remote(module, attr->local_name, msg, mp, fb);
+ mapped++;
+ continue;
+ case MAP_KEEP:
+ if (!map_msg_valid_attr(module, mp, attr->local_name))
+ continue;
+ break;
+ case MAP_IGNORE: continue;
+ case MAP_CONVERT:
+ case MAP_RENAME:
+ if (!map_msg_valid_attr(module, mp, attr->u.rename.remote_name))
+ continue;
+ break;
+ }
- if (mapped) {
- switch (map_type) {
+ switch (attr->type) {
case MAP_KEEP:
ldb_debug(module->ldb, LDB_DEBUG_TRACE, "Keeping %s", attr->local_name);
elm = talloc(fb, struct ldb_message_element);
@@ -1062,8 +1064,6 @@ static int map_add(struct ldb_module *module, const struct ldb_message *msg)
elm->values[j] = attr->u.convert.convert_local(module, mp, &msg->elements[i].values[j]);
}
- mapped = map_msg_valid_attr(module, mp, attr->u.convert.remote_name);
-
break;
case MAP_GENERATE:
@@ -1071,8 +1071,12 @@ static int map_add(struct ldb_module *module, const struct ldb_message *msg)
ldb_debug(module->ldb, LDB_DEBUG_FATAL, "This line should never be reached");
continue;
}
+
ldb_msg_add(module->ldb, mp, elm, 0);
- } else {
+ mapped++;
+ }
+
+ if (mapped == 0) {
ldb_debug(module->ldb, LDB_DEBUG_TRACE, "Fallback storing %s", msg->elements[i].name);
elm = talloc(fb, struct ldb_message_element);
@@ -1131,69 +1135,82 @@ static int map_modify(struct ldb_module *module, const struct ldb_message *msg)
/* Loop over mi and call generate_remote for each attribute */
for (i = 0; i < msg->num_elements; i++) {
const struct ldb_map_attribute *attr;
- enum ldb_map_attr_type map_type;
+ int k;
+ int mapped = 0;
if (ldb_attr_cmp(msg->elements[i].name, "isMapped") == 0)
continue;
- attr = map_find_attr_local(privdat, msg->elements[i].name);
+ for (k = 0; privdat->attribute_maps[k].local_name; k++)
+ {
+ if (ldb_attr_cmp(privdat->attribute_maps[k].local_name, msg->elements[i].name) != 0)
+ continue;
- if (!attr) {
- ldb_debug(module->ldb, LDB_DEBUG_WARNING, "Undefined local attribute '%s', ignoring\n", msg->elements[i].name);
- map_type = MAP_IGNORE;
- } else map_type = attr->type;
-
- switch (map_type) {
- case MAP_IGNORE: /* Add to fallback message */
- elm = talloc(fb, struct ldb_message_element);
+ attr = &privdat->attribute_maps[k];
- elm->num_values = msg->elements[i].num_values;
- elm->values = talloc_reference(elm, msg->elements[i].values);
- elm->name = talloc_strdup(elm, msg->elements[i].name);
-
- ldb_msg_add(module->ldb, fb, elm, msg->elements[i].flags);
- break;
- case MAP_RENAME:
- elm = talloc(mp, struct ldb_message_element);
+ switch (attr->type) {
+ case MAP_IGNORE: continue;
+ case MAP_RENAME:
+ elm = talloc(mp, struct ldb_message_element);
- elm->name = talloc_strdup(elm, attr->u.rename.remote_name);
- elm->num_values = msg->elements[i].num_values;
- elm->values = talloc_array(elm, struct ldb_val, elm->num_values);
- for (j = 0; j < elm->num_values; j++) {
- elm->values[j] = msg->elements[i].values[j];
- }
+ elm->name = talloc_strdup(elm, attr->u.rename.remote_name);
+ elm->num_values = msg->elements[i].num_values;
+ elm->values = talloc_array(elm, struct ldb_val, elm->num_values);
+ for (j = 0; j < elm->num_values; j++) {
+ elm->values[j] = msg->elements[i].values[j];
+ }
- ldb_msg_add(module->ldb, mp, elm, msg->elements[i].flags);
- break;
+ ldb_msg_add(module->ldb, mp, elm, msg->elements[i].flags);
+ mapped++;
+ continue;
- case MAP_CONVERT:
- elm = talloc(mp, struct ldb_message_element);
+ case MAP_CONVERT:
+ elm = talloc(mp, struct ldb_message_element);
- elm->name = talloc_strdup(elm, attr->u.rename.remote_name);
- elm->num_values = msg->elements[i].num_values;
- elm->values = talloc_array(elm, struct ldb_val, elm->num_values);
-
- for (j = 0; j < elm->num_values; j++) {
- elm->values[j] = attr->u.convert.convert_local(module, mp, &msg->elements[i].values[j]);
- }
+ elm->name = talloc_strdup(elm, attr->u.rename.remote_name);
+ elm->num_values = msg->elements[i].num_values;
+ elm->values = talloc_array(elm, struct ldb_val, elm->num_values);
- ldb_msg_add(module->ldb, mp, elm, msg->elements[i].flags);
- break;
+ for (j = 0; j < elm->num_values; j++) {
+ elm->values[j] = attr->u.convert.convert_local(module, mp, &msg->elements[i].values[j]);
+ }
- case MAP_KEEP:
- elm = talloc(mp, struct ldb_message_element);
+ ldb_msg_add(module->ldb, mp, elm, msg->elements[i].flags);
+ mapped++;
+ continue;
+
+ case MAP_KEEP:
+ elm = talloc(mp, struct ldb_message_element);
+
+ elm->num_values = msg->elements[i].num_values;
+ elm->values = talloc_array(elm, struct ldb_val, elm->num_values);
+ for (j = 0; j < elm->num_values; j++) {
+ elm->values[j] = msg->elements[i].values[j];
+ }
+
+ elm->name = talloc_strdup(elm, msg->elements[i].name);
+
+ ldb_msg_add(module->ldb, mp, elm, msg->elements[i].flags);
+ mapped++;
+ continue;
+
+ case MAP_GENERATE:
+ attr->u.generate.generate_remote(module, attr->local_name, msg, mp, fb);
+ mapped++;
+ continue;
+ }
+ }
+
+ if (mapped == 0) {/* Add to fallback message */
+ elm = talloc(fb, struct ldb_message_element);
elm->num_values = msg->elements[i].num_values;
elm->values = talloc_reference(elm, msg->elements[i].values);
elm->name = talloc_strdup(elm, msg->elements[i].name);
- ldb_msg_add(module->ldb, mp, elm, msg->elements[i].flags);
- break;
+ ldb_msg_add(module->ldb, fb, elm, msg->elements[i].flags);
- case MAP_GENERATE:
- attr->u.generate.generate_remote(module, attr->local_name, msg, mp, fb);
- break;
- }
+ }
}
if (fb->num_elements > 0) {
@@ -1356,7 +1373,11 @@ static struct ldb_val map_convert_local_dn(struct ldb_module *module, TALLOC_CTX
newval = talloc(ctx, struct ldb_val);
newval->data = (uint8_t *)ldb_dn_linearize(ctx, newdn);
- newval->length = strlen((char *)newval->data);
+ if (newval->data) {
+ newval->length = strlen((char *)newval->data);
+ } else {
+ newval->length = 0;
+ }
talloc_free(newdn);
diff --git a/source4/lib/ldb/modules/ldb_map.h b/source4/lib/ldb/modules/ldb_map.h
index 984a4a2cd5..42eba23aa6 100644
--- a/source4/lib/ldb/modules/ldb_map.h
+++ b/source4/lib/ldb/modules/ldb_map.h
@@ -2,6 +2,7 @@
ldb database library - map backend
Copyright (C) Jelmer Vernooij 2005
+ Development sponsored by the Google Summer of Code program
** NOTE! The following LGPL license applies to the ldb
** library. This does NOT imply that all of Samba is released
@@ -65,6 +66,9 @@ struct ldb_map_attribute
struct {
const char *remote_name;
struct ldb_val (*convert_local) (struct ldb_module *, TALLOC_CTX *, const struct ldb_val *);
+
+ /* an entry can have convert_remote set to NULL, as long as there as an entry with the same local_name
+ * that is non-NULL before it. */
struct ldb_val (*convert_remote) (struct ldb_module *, TALLOC_CTX *, const struct ldb_val *);
} convert;
diff --git a/source4/lib/samba3/PLAN b/source4/lib/samba3/PLAN
index 916617638b..9a24f70271 100644
--- a/source4/lib/samba3/PLAN
+++ b/source4/lib/samba3/PLAN
@@ -1,7 +1,2 @@
TODO (SoC project):
- fix ntPwdHash / lmPwdHash bug
- - ldb_map
- - convert_remote() can be NULL!
- - new way of finding remote attribute in map_add()
- - loop over all attributes
- - if local one present, run!
diff --git a/testprogs/ejs/samba3sam b/testprogs/ejs/samba3sam
index 6ca7592650..6ea8da3492 100755
--- a/testprogs/ejs/samba3sam
+++ b/testprogs/ejs/samba3sam
@@ -128,6 +128,7 @@ assert(msg[0].cn == "Niemand");
println("Checking for data in destination database");
msg = s3.search("(cn=Niemand)");
assert(msg.length >= 1);
+printVars(msg);
assert(msg[0].sambaSID == "S-1-5-21-4231626423-2410014848-2360679739-2001");
assert(msg[0].displayName == "Niemand");
@@ -189,3 +190,4 @@ println("Checking whether record is gone...");
msg = s4.search("(cn=Niemand)");
assert(msg.length == 0);
+return 0;