diff options
-rw-r--r-- | source4/lib/ldb/ldb_map/ldb_map.c | 74 | ||||
-rw-r--r-- | source4/lib/ldb/samba/samba3sam.c | 40 |
2 files changed, 102 insertions, 12 deletions
diff --git a/source4/lib/ldb/ldb_map/ldb_map.c b/source4/lib/ldb/ldb_map/ldb_map.c index 2082abe79a..89c6934f5c 100644 --- a/source4/lib/ldb/ldb_map/ldb_map.c +++ b/source4/lib/ldb/ldb_map/ldb_map.c @@ -73,7 +73,12 @@ static struct ldb_parse_tree *ldb_map_parse_tree(struct ldb_module *module, cons { int i; const struct ldb_map_attribute *attr; - struct ldb_parse_tree *new_tree = talloc_memdup(module, tree, sizeof(*tree)); + struct ldb_parse_tree *new_tree; + + if (tree == NULL) + return NULL; + + new_tree = talloc_memdup(module, tree, sizeof(*tree)); /* Find attr in question and: * - if it has a convert_operator function, run that @@ -102,7 +107,7 @@ static struct ldb_parse_tree *ldb_map_parse_tree(struct ldb_module *module, cons attr = map_find_attr_local(module, tree->u.equality.attr); if (!attr) { - DEBUG(0, ("Unable to find local attribute '%s', leaving as is", tree->u.equality.attr)); + DEBUG(0, ("Unable to find local attribute '%s', leaving as is\n", tree->u.equality.attr)); return new_tree; } @@ -323,22 +328,77 @@ static const char **ldb_map_attrs(struct ldb_module *module, const char *const a return NULL; } +static const char **available_local_attributes(struct ldb_module *module, const struct ldb_message *msg) +{ + struct map_private *map = module->private_data; + int i, j; + int count = 0; + const char **ret = talloc_array(module, const char *, 1); + + ret[0] = NULL; + + for (i = 0; map->attribute_maps[i].local_name; i++) { + BOOL avail = False; + const struct ldb_map_attribute *attr = &map->attribute_maps[i]; + + /* If all remote attributes for this attribute are present, add the + * local one to the list */ + + switch (attr->type) { + case MAP_IGNORE: break; + case MAP_KEEP: + avail = (ldb_msg_find_ldb_val(msg, attr->local_name) != NULL); + break; + + case MAP_RENAME: + case MAP_CONVERT: + avail = (ldb_msg_find_ldb_val(msg, attr->u.rename.remote_name) != NULL); + break; + + case MAP_GENERATE: + avail = True; + for (j = 0; attr->u.generate.remote_names[j]; j++) { + avail &= (ldb_msg_find_ldb_val(msg, attr->u.generate.remote_names[j]) != NULL); + } + break; + } + + if (!avail) + continue; + + ret = talloc_realloc(module, ret, const char *, count+2); + ret[count] = attr->local_name; + ret[count+1] = NULL; + count++; + } + + return ret; +} + static struct ldb_message *ldb_map_message_incoming(struct ldb_module *module, const char * const*attrs, const struct ldb_message *mi) { int i; struct ldb_message *msg = talloc_zero(module, struct ldb_message); struct ldb_message_element *elm, *oldelm; + const char **newattrs = NULL; msg->dn = map_remote_dn(module, mi->dn); /* Loop over attrs, find in ldb_map_attribute array and * run generate() */ + if (attrs == NULL) { + /* Generate list of the local attributes that /can/ be generated + * using the specific remote attributes */ + + attrs = newattrs = available_local_attributes(module, mi); + } + for (i = 0; attrs[i]; i++) { const struct ldb_map_attribute *attr = map_find_attr_local(module, attrs[i]); if (!attr) { - DEBUG(0, ("Unable to find local attribute '%s' when generating incoming message", attrs[i])); + DEBUG(0, ("Unable to find local attribute '%s' when generating incoming message\n", attrs[i])); continue; } @@ -373,6 +433,8 @@ static struct ldb_message *ldb_map_message_incoming(struct ldb_module *module, c } } + talloc_free(newattrs); + return msg; } @@ -482,8 +544,10 @@ static int map_search_bytree(struct ldb_module *module, const struct ldb_dn *bas talloc_free(new_tree); talloc_free(newattrs); + *res = talloc_array(module, struct ldb_message *, ret); + for (i = 0; i < ret; i++) { - *res[i] = ldb_map_message_incoming(module, attrs, newres[i]); + (*res)[i] = ldb_map_message_incoming(module, attrs, newres[i]); talloc_free(newres[i]); } @@ -500,7 +564,7 @@ static int map_search(struct ldb_module *module, const struct ldb_dn *base, struct ldb_parse_tree *tree; int ret; - tree = ldb_parse_tree(map, expression); + tree = ldb_parse_tree(NULL, expression); if (tree == NULL) { map->last_err_string = "expression parse failed"; return -1; diff --git a/source4/lib/ldb/samba/samba3sam.c b/source4/lib/ldb/samba/samba3sam.c index 6c98ffc5c1..7c1e61ca4d 100644 --- a/source4/lib/ldb/samba/samba3sam.c +++ b/source4/lib/ldb/samba/samba3sam.c @@ -60,7 +60,33 @@ * sambaMungedDial * sambaLogonHours */ +static struct ldb_message_element *convert_sid_rid(TALLOC_CTX *ctx, const char *remote_attr, const struct ldb_message_element *el) +{ + printf("Converting SID TO RID *\n"); + + return talloc_memdup(ctx, el, sizeof(*el)); +} + +static struct ldb_message_element *convert_rid_sid(TALLOC_CTX *ctx, const char *remote_attr, const struct ldb_message_element *el) +{ + printf("Converting RID TO SID *\n"); + + return talloc_memdup(ctx, el, sizeof(*el)); +} +static struct ldb_message_element *convert_unix_id2name(TALLOC_CTX *ctx, const char *remote_attr, const struct ldb_message_element *el) +{ + printf("Converting UNIX ID to name\n"); + + return talloc_memdup(ctx, el, sizeof(*el)); +} + +static struct ldb_message_element *convert_unix_name2id(TALLOC_CTX *ctx, const char *remote_attr, const struct ldb_message_element *el) +{ + printf("Converting UNIX name to ID\n"); + + return talloc_memdup(ctx, el, sizeof(*el)); +} const struct ldb_map_objectclass samba3_objectclasses[] = { { "group", "sambaGroupMapping" }, @@ -110,8 +136,8 @@ const struct ldb_map_attribute samba3_attributes[] = .local_name = "primaryGroupID", .type = MAP_CONVERT, .u.convert.remote_name = "sambaPrimaryGroupSID", - .u.convert.convert_local = NULL, /* FIXME: Add domain SID */ - .u.convert.convert_remote = NULL, /* FIXME: Extract RID */ + .u.convert.convert_local = convert_rid_sid, + .u.convert.convert_remote = convert_sid_rid, }, /* sambaBadPasswordCount -> badPwdCount */ @@ -140,8 +166,8 @@ const struct ldb_map_attribute samba3_attributes[] = .local_name = "unixName", .type = MAP_CONVERT, .u.convert.remote_name = "gidNumber", - .u.convert.convert_local = NULL, /* FIXME: Lookup gid */ - .u.convert.convert_remote = NULL, /* FIXME: Lookup groupname */ + .u.convert.convert_local = convert_unix_id2name, + .u.convert.convert_remote = convert_unix_name2id, }, /* uid -> unixName */ @@ -149,8 +175,8 @@ const struct ldb_map_attribute samba3_attributes[] = .local_name = "unixName", .type = MAP_CONVERT, .u.convert.remote_name = "uid", - .u.convert.convert_local = NULL, /* FIXME: Lookup uid */ - .u.convert.convert_remote = NULL, /* FIXME: Lookup username */ + .u.convert.convert_local = convert_unix_id2name, + .u.convert.convert_remote = convert_unix_name2id, }, /* displayName -> name */ @@ -194,5 +220,5 @@ struct ldb_module *init_module(struct ldb_context *ldb, const char *options[]) struct ldb_module *ldb_samba3sam_module_init(struct ldb_context *ldb, const char *options[]) #endif { - return ldb_map_init(ldb, &samba3_attributes, &samba3_objectclasses, options); + return ldb_map_init(ldb, samba3_attributes, samba3_objectclasses, options); } |