From 679e95db033fd11d17c1f1ac5e44f6cc4df2220e Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Mon, 15 Nov 2004 11:40:27 +0000 Subject: r3754: merge in ldb modules support from the tmp branch ldbPlugins (This used to be commit 71323f424b4561af1fdddd2358629049be3dad8c) --- source4/ldap_server/ldap_parse.c | 75 ++++++++++++++++++++++++++++++++++- source4/ldap_server/ldap_parse.h | 4 ++ source4/ldap_server/ldap_simple_ldb.c | 9 +---- 3 files changed, 80 insertions(+), 8 deletions(-) (limited to 'source4/ldap_server') diff --git a/source4/ldap_server/ldap_parse.c b/source4/ldap_server/ldap_parse.c index b4e0eaadf9..269f51704c 100644 --- a/source4/ldap_server/ldap_parse.c +++ b/source4/ldap_server/ldap_parse.c @@ -75,7 +75,80 @@ static char *parse_slash(char *p, char *end) { } \ } while(0) -struct ldap_dn *ldap_parse_dn(TALLOC_CTX *mem_ctx, const char *orig_dn) +#if 0 +static void ldap_parse_attributetypedescription(struct ldap_schema *schema, DATA_BLOB *data) +{ + char *desc; + + desc = (char *)talloc(schema, data->lenght + 1); + memcpy(desc, data->data, data->lenght); + desc[data->lenght] = '\0'; + +} + +static void ldap_parse_objectclassdescription(struct ldap_schema *schema, DATA_BLOB *data) +{ + char *desc; + + desc = (char *)talloc(schema, data->lenght + 1); + memcpy(desc, data->data, data->lenght); + desc[data->lenght] = '\0'; + +} + +static struct ldap_schema *ldap_get_schema(void *mem_ctx, struct ldap_schema *schema, struct ldb_context *ldb) +{ + NTSTATUS status; + struct ldap_schema *local_schema; + struct ldb_message **res; + const char *errstr; + const char *schema_dn = "cn=schema"; + const char *attr_filter = "attributeTypeDescription=*"; + const char *class_filter = "objectClassDescription=*"; + const char *attrs = "attributeTypeDescription"; + const char *classes = "objectClassDescription"; + enum ldb_scope scope = LDAP_SCOPE_SUBTREE; + int count, i, j, k; + + local_schema = schema; + if (local_schema == NULL) { + local_schema = talloc_p(mem_ctx, struct ldap_schema); + ALLOC_CHECK(local_schema); + } + + count = ldb_search(ldb, schema_dn, scope, attr_filter, attrs, &res); + + for (i = 0; i < count; i++) { + if (res[i]->num_elements == 0) { + goto attr_done; + } + for (j = 0; j < res[i]->num_elements; j++) { + for (k = 0; res[i]->elements[j].num_values; k++) { + ldap_parse_attributetypedescription(local_schema, &(res[i]->elements[j].values[k])); + } + } +attr_done: + } + + count = ldb_search(ldb, schema_dn, scope, class_filter, classes, &res); + + for (i = 0; i < count; i++) { + if (res[i]->num_elements == 0) { + goto class_done; + } + for (j = 0; j < res[i]->num_elements; j++) { + for (k = 0; res[i]->elements[j].num_values; k++) { + ldap_parse_objectclassdescription(local_schema, &(res[i]->elements[j].values[k])); + } + } +class_done: + } + + return local_schema; +} +#endif + +struct ldap_dn *ldap_parse_dn(void *mem_ctx, const char *orig_dn) { struct ldap_dn *dn; struct dn_component *component; diff --git a/source4/ldap_server/ldap_parse.h b/source4/ldap_server/ldap_parse.h index 91df7c5e49..5b870896c4 100644 --- a/source4/ldap_server/ldap_parse.h +++ b/source4/ldap_server/ldap_parse.h @@ -35,3 +35,7 @@ struct ldap_dn { int comp_num; struct dn_component **components; }; + +struct ldap_schema { + int dummy; +}; diff --git a/source4/ldap_server/ldap_simple_ldb.c b/source4/ldap_server/ldap_simple_ldb.c index 8f40636a5c..4edd456c6e 100644 --- a/source4/ldap_server/ldap_simple_ldb.c +++ b/source4/ldap_server/ldap_simple_ldb.c @@ -385,8 +385,8 @@ static NTSTATUS sldb_Modify(struct ldapsrv_partition *partition, struct ldapsrv_ break; } - if (r->mods[i].attrib.num_values > 0) { - msg->elements[i].num_values = r->mods[i].attrib.num_values; + msg->elements[i].num_values = r->mods[i].attrib.num_values; + if (msg->elements[i].num_values > 0) { msg->elements[i].values = talloc_array_p(msg, struct ldb_val, msg->elements[i].num_values); ALLOC_CHECK(msg->elements[i].values); @@ -399,11 +399,6 @@ static NTSTATUS sldb_Modify(struct ldapsrv_partition *partition, struct ldapsrv_ msg->elements[i].values[j].length = r->mods[i].attrib.values[j].length; msg->elements[i].values[j].data = r->mods[i].attrib.values[j].data; } - } else { - /* TODO: test what we should do here - * - * LDAP_MODIFY_DELETE is ok to pass here - */ } } } else { -- cgit