From eb7596e66bd69e09b3ab405c9aba287b715a0c0d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 23 Jan 2007 15:36:36 +0000 Subject: r20973: add functions to create the autocreated subSchema Attributes: attributeTypes, objectClasses and dITContentRules this is just a start and doesn't create anything useful yet... metze (This used to be commit 4c8b717092c201c30be4d266bbb45b1142a9d627) --- source4/dsdb/schema/schema_constructed.c | 191 +++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 source4/dsdb/schema/schema_constructed.c (limited to 'source4/dsdb/schema') diff --git a/source4/dsdb/schema/schema_constructed.c b/source4/dsdb/schema/schema_constructed.c new file mode 100644 index 0000000000..1835b7aa42 --- /dev/null +++ b/source4/dsdb/schema/schema_constructed.c @@ -0,0 +1,191 @@ +/* + Unix SMB/CIFS mplementation. + DSDB schema constructed attributes + attributeTypes, objectClasses, dITContentRules... + + Copyright (C) Stefan Metzmacher 2006 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ +#include "includes.h" +#include "dsdb/samdb/samdb.h" +#include "librpc/gen_ndr/ndr_drsuapi.h" +#include "lib/ldb/include/ldb.h" +#include "system/time.h" +#include "lib/charset/charset.h" +#include "librpc/ndr/libndr.h" + +static char *dsdb_subSchema_list_append(char *v, const char *list_name) +{ + bool first = true; + uint32_t i; + const char *attrs[] = { + "attr1", + "attr2", + "attr3", + NULL + }; + + if (!attrs) { + return v; + } + + v = talloc_asprintf_append(v, "%s ( ", list_name); + if (!v) return NULL; + + for (i=0; attrs[i]; i++) { + v = talloc_asprintf_append(v, "%s%s ", + (!first ? "$ " : ""), + attrs[i]); + if (!v) return NULL; + first = false; + } + + v = talloc_asprintf_append(v, ") "); + if (!v) return NULL; + + return v; +} + +WERROR dsdb_subSchema_attributeTypes(const struct dsdb_schema *schema, + TALLOC_CTX *mem_ctx) +{ + struct ldb_message_element *e; + struct dsdb_attribute *a; + + e = talloc_zero(mem_ctx, struct ldb_message_element); + W_ERROR_HAVE_NO_MEMORY(e); + + for (a = schema->attributes; a; a = a->next) { + char *v; + + v = talloc_asprintf(e, "( %s NAME '%s' SYNTAX '%s' ", + a->attributeID_oid, a->lDAPDisplayName, + a->syntax->ldap_oid); + W_ERROR_HAVE_NO_MEMORY(v); + + if (a->isSingleValued) { + v = talloc_asprintf_append(v, "SINGLE-VALUE "); + W_ERROR_HAVE_NO_MEMORY(v); + } + + if (a->systemOnly) { + v = talloc_asprintf_append(v, "NO-USER-MODIFICATION "); + W_ERROR_HAVE_NO_MEMORY(v); + } + + v = talloc_asprintf_append(v, ")"); + W_ERROR_HAVE_NO_MEMORY(v); + + DEBUG(0,("%s\n", v)); + } + + return WERR_FOOBAR; +} + +WERROR dsdb_subSchema_objectClasses(const struct dsdb_schema *schema, + TALLOC_CTX *mem_ctx) +{ + struct ldb_message_element *e; + struct dsdb_class *c; + + e = talloc_zero(mem_ctx, struct ldb_message_element); + W_ERROR_HAVE_NO_MEMORY(e); + + for (c = schema->classes; c; c = c->next) { + const char *class_type; + char *v; + + switch (c->objectClassCategory) { + case 0: + /* + * NOTE: this is an type 88 class + * e.g. 2.5.6.6 NAME 'person' + * but w2k3 gives STRUCTURAL here! + */ + class_type = "STRUCTURAL"; + break; + case 1: + class_type = "STRUCTURAL"; + break; + case 2: + class_type = "ABSTRACT"; + break; + case 3: + class_type = "AUXILIARY"; + break; + default: + class_type = "UNKNOWN"; + break; + } + + v = talloc_asprintf(e, "( %s NAME '%s' SUB %s %s ", + c->governsID_oid, c->lDAPDisplayName, + c->subClassOf, class_type); + W_ERROR_HAVE_NO_MEMORY(v); + + v = dsdb_subSchema_list_append(v, "MUST"); + W_ERROR_HAVE_NO_MEMORY(v); + + v = dsdb_subSchema_list_append(v, "MAY"); + W_ERROR_HAVE_NO_MEMORY(v); + + v = talloc_asprintf_append(v, ")"); + W_ERROR_HAVE_NO_MEMORY(v); + + DEBUG(0,("%s\n", v)); + } + + return WERR_FOOBAR; +} + +WERROR dsdb_subSchema_dITContentRules(const struct dsdb_schema *schema, + TALLOC_CTX *mem_ctx) +{ + struct ldb_message_element *e; + struct dsdb_class *c; + + e = talloc_zero(mem_ctx, struct ldb_message_element); + W_ERROR_HAVE_NO_MEMORY(e); + + for (c = schema->classes; c; c = c->next) { + char *v; + + /* + * TODO: filter out classes without auxiliary classes + */ + + v = talloc_asprintf(e, "( %s NAME '%s' ", + c->governsID_oid, c->lDAPDisplayName); + W_ERROR_HAVE_NO_MEMORY(v); + + v = dsdb_subSchema_list_append(v, "AUX"); + W_ERROR_HAVE_NO_MEMORY(v); + + v = dsdb_subSchema_list_append(v, "MUST"); + W_ERROR_HAVE_NO_MEMORY(v); + + v = dsdb_subSchema_list_append(v, "MAY"); + W_ERROR_HAVE_NO_MEMORY(v); + + v = talloc_asprintf_append(v, ")"); + W_ERROR_HAVE_NO_MEMORY(v); + + DEBUG(0,("%s\n", v)); + } + + return WERR_FOOBAR; +} -- cgit