mirror of
https://github.com/samba-team/samba.git
synced 2024-12-28 07:21:54 +03:00
r9686: Another round of bugfixes. Works somewhat now, when running under valgrind ;-)
(This used to be commit 786379064f
)
This commit is contained in:
parent
7e3838dd2d
commit
e8635da74d
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user