[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Tue Aug 9 05:11:02 MDT 2011


The branch, master has been updated
       via  e2733d3 s4-dsdb clarify that failure to load the schema items from DRS is expected
       via  b206a36 move schema_fill_constructed() call to dsdb_setup_sorted_accessors()
       via  dee678a s4-dsdb Remove unused schema function
       via  0e9cf38 s4-dsdb: added SAMDB_INDEXING_VERSION to @INDEXLIST
       via  6853b3a s4-dsdb: fixed booling conversion to check value length
       via  cba88a2 ldb: fix the canonicalisation of booleans
       via  60b6b33 s4-dbcheck: enable dbcheck now that backlinks are fixed
       via  4ede333 s4-dsdb: add auto-normalisation of attributes
       via  2ba18d8 s4-dsdb: ensure rIDSetReferences is stored as an extended DN
       via  55b25e1 s4-dsdb: ensure we setup the dn_format field in schema attributes
       via  6ef36a0 s4-acl-test: use symbolic names for groupType
       via  ff58087 s4-pysamba: fixed double conversion of int32
       via  fd04a38 s4-dsdb: make extended_dn_in a bit more efficient
       via  4e4953d s4-samdb: support relative paths in SamDB() connect
       via  8ce8107 s4-dsdb: use dn_format shortcut to find DN format
       via  d994ef2 pysamdb: move normalise_int32() to common module
      from  68d79eb s3-rpc_server: Fix sending of packets over named pipe proxy.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit e2733d362d97f0dca5b622e54d73ae0e0cc643f0
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Aug 9 13:10:21 2011 +1000

    s4-dsdb clarify that failure to load the schema items from DRS is expected
    
    This happens if we have a custom schema - we need to build up the schema until
    it loads, by converting more objects.
    
    Andrew Bartlett
    
    Autobuild-User: Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date: Tue Aug  9 13:10:25 CEST 2011 on sn-devel-104

commit b206a365eade7fbd2defddbadf14ca293409ede3
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Aug 9 12:55:57 2011 +1000

    move schema_fill_constructed() call to dsdb_setup_sorted_accessors()

commit dee678a7be373bbe6497e60d9283dae4ca4793ec
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Aug 9 11:54:17 2011 +1000

    s4-dsdb Remove unused schema function

commit 0e9cf380eaae413b904503bc9676f965ef71ef16
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Aug 9 16:54:36 2011 +1000

    s4-dsdb: added SAMDB_INDEXING_VERSION to @INDEXLIST
    
    this can be used to force re-indexing of samdb when we change
    something that affects index comparison, in this case the
    canonicalisation of booleans
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit 6853b3a805938ca6fdc69a35d9fdcefb1338101f
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Aug 9 16:50:51 2011 +1000

    s4-dsdb: fixed booling conversion to check value length
    
    this ensures we don't look past the end of the data
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit cba88a2b623e47cf97885bd45387049da1105930
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Aug 9 16:41:16 2011 +1000

    ldb: fix the canonicalisation of booleans
    
    we were canonicalising "FALSE" to "FALS"
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit 60b6b338f7921bc3c5895e0d0fdbe79305f1be0c
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Aug 5 11:19:30 2011 +1000

    s4-dbcheck: enable dbcheck now that backlinks are fixed

commit 4ede333f468b36fb7435c9de1216da3b66bf0490
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Aug 9 14:41:20 2011 +1000

    s4-dsdb: add auto-normalisation of attributes
    
    this auto-normalises some attributes when they are added/modified. The
    list that we auto-normalise is currently:
    
    Boolean
    INT32
    INTEGER
    UTC_TIME
    
    This fixes a problem with groupType being stored in an unnormalised
    form
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit 2ba18d89eb066cf52d8bbd18a28e494bb4247d9c
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Aug 9 13:18:08 2011 +1000

    s4-dsdb: ensure rIDSetReferences is stored as an extended DN
    
    Signed-off-by: Andrew Bartlett <abartlet at samba.org>

commit 55b25e1e23882fb8eb476408790b12f03a5d65e8
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Aug 9 11:47:25 2011 +1000

    s4-dsdb: ensure we setup the dn_format field in schema attributes
    
    this ensures we setup dn_format when we do runtime schema changes
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit 6ef36a0e6ad3363445e1250495873738e83b108a
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Aug 5 14:03:58 2011 +1000

    s4-acl-test: use symbolic names for groupType
    
    clearer than magic numbers

commit ff58087a3f686bfcfa304c28179fb2b03c4a0a46
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Aug 5 14:02:39 2011 +1000

    s4-pysamba: fixed double conversion of int32
    
    if the number is already negative, we shouldn't convert it

commit fd04a38d5063cd5b90970c7a89a1f12701833df7
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Aug 5 13:10:22 2011 +1000

    s4-dsdb: make extended_dn_in a bit more efficient
    
    checking filter elements in the right order makes it a little faster

commit 4e4953dd48467cf96a17cc48ccf1139e175845fe
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Aug 5 13:09:35 2011 +1000

    s4-samdb: support relative paths in SamDB() connect
    
    don't add the private path unless the database doesn't exist with the
    supplied path

commit 8ce8107a5bcd821585138fd6e7c690547b783bbf
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Aug 5 11:28:12 2011 +1000

    s4-dsdb: use dn_format shortcut to find DN format
    
    this saves some string comparisons

commit d994ef20567c1368f6bdea163d12ed3837f79a03
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Aug 5 11:17:06 2011 +1000

    pysamdb: move normalise_int32() to common module
    
    this will be needed in quite a few places

-----------------------------------------------------------------------

Summary of changes:
 lib/ldb/common/attrib_handlers.c                   |    6 +-
 source4/dsdb/repl/replicated_objects.c             |    6 +-
 source4/dsdb/samdb/ldb_modules/extended_dn_in.c    |   26 ++++--
 source4/dsdb/samdb/ldb_modules/extended_dn_out.c   |    4 +-
 source4/dsdb/samdb/ldb_modules/extended_dn_store.c |    4 +-
 source4/dsdb/samdb/ldb_modules/objectclass_attrs.c |   47 +++++++++++
 source4/dsdb/samdb/ldb_modules/ridalloc.c          |   18 ++++-
 source4/dsdb/samdb/ldb_modules/util.c              |    2 +-
 source4/dsdb/schema/schema.h                       |    1 +
 source4/dsdb/schema/schema_inferiors.c             |   31 --------
 source4/dsdb/schema/schema_set.c                   |   81 ++++++++++++++------
 source4/dsdb/schema/schema_syntax.c                |   37 ++++++----
 source4/dsdb/tests/python/acl.py                   |   27 ++++---
 source4/scripting/python/samba/common.py           |    5 +
 source4/scripting/python/samba/samdb.py            |   12 +--
 source4/selftest/knownfail                         |    1 -
 16 files changed, 199 insertions(+), 109 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/ldb/common/attrib_handlers.c b/lib/ldb/common/attrib_handlers.c
index 2f4454c..73e1705 100644
--- a/lib/ldb/common/attrib_handlers.c
+++ b/lib/ldb/common/attrib_handlers.c
@@ -166,12 +166,12 @@ static int ldb_comparison_Integer(struct ldb_context *ldb, void *mem_ctx,
 static int ldb_canonicalise_Boolean(struct ldb_context *ldb, void *mem_ctx,
 			     const struct ldb_val *in, struct ldb_val *out)
 {
-	if (strncasecmp((char *)in->data, "TRUE", in->length) == 0) {
+	if (in->length >= 4 && strncasecmp((char *)in->data, "TRUE", in->length) == 0) {
 		out->data = (uint8_t *)talloc_strdup(mem_ctx, "TRUE");
 		out->length = 4;
-	} else if (strncasecmp((char *)in->data, "FALSE", in->length) == 0) {
+	} else if (in->length >= 5 && strncasecmp((char *)in->data, "FALSE", in->length) == 0) {
 		out->data = (uint8_t *)talloc_strdup(mem_ctx, "FALSE");
-		out->length = 4;
+		out->length = 5;
 	} else {
 		return -1;
 	}
diff --git a/source4/dsdb/repl/replicated_objects.c b/source4/dsdb/repl/replicated_objects.c
index d11de92..f8c1517 100644
--- a/source4/dsdb/repl/replicated_objects.c
+++ b/source4/dsdb/repl/replicated_objects.c
@@ -122,8 +122,8 @@ WERROR dsdb_repl_make_working_schema(struct ldb_context *ldb,
 						      ignore_attids,
 						      tmp_ctx, &object);
 			if (!W_ERROR_IS_OK(werr)) {
-				DEBUG(1,("Warning: Failed to convert schema object %s into ldb msg\n",
-					 cur->object.identifier->dn));
+				DEBUG(4,("debug: Failed to convert schema object %s into ldb msg, will try during next loop\n",
+					  cur->object.identifier->dn));
 
 				failed_obj_count++;
 			} else {
@@ -136,7 +136,7 @@ WERROR dsdb_repl_make_working_schema(struct ldb_context *ldb,
 								       working_schema,
 								       object.msg);
 				if (!W_ERROR_IS_OK(werr)) {
-					DEBUG(1,("Warning: failed to convert object %s into a schema element: %s\n",
+					DEBUG(4,("debug: failed to convert object %s into a schema element, will try during next loop: %s\n",
 						 ldb_dn_get_linearized(object.msg->dn),
 						 win_errstr(werr)));
 					failed_obj_count++;
diff --git a/source4/dsdb/samdb/ldb_modules/extended_dn_in.c b/source4/dsdb/samdb/ldb_modules/extended_dn_in.c
index 76a9518..760dd64 100644
--- a/source4/dsdb/samdb/ldb_modules/extended_dn_in.c
+++ b/source4/dsdb/samdb/ldb_modules/extended_dn_in.c
@@ -343,6 +343,11 @@ static int extended_dn_filter_callback(struct ldb_parse_tree *tree, void *privat
 
 	filter_ctx = talloc_get_type_abort(private_context, struct extended_dn_filter_ctx);
 
+	if (filter_ctx->test_only && filter_ctx->matched) {
+		/* the tree already matched */
+		return LDB_SUCCESS;
+	}
+
 	attribute = dsdb_attribute_by_lDAPDisplayName(filter_ctx->schema, tree->u.equality.attr);
 	if (attribute == NULL) {
 		return LDB_SUCCESS;
@@ -366,7 +371,19 @@ static int extended_dn_filter_callback(struct ldb_parse_tree *tree, void *privat
 		return LDB_SUCCESS;
 	}
 
+	guid_val = ldb_dn_get_extended_component(dn, "GUID");
+	sid_val  = ldb_dn_get_extended_component(dn, "SID");
+
+	if (!guid_val && !sid_val && (attribute->searchFlags & SEARCH_FLAG_ATTINDEX)) {
+		/* if it is indexed, then fixing the string DN will do
+		   no good here, as we will not find the attribute in
+		   the index. So for now fall through to a standard DN
+		   component comparison */
+		return LDB_SUCCESS;
+	}
+
 	if (filter_ctx->test_only) {
+		/* we need to copy the tree */
 		filter_ctx->matched = true;
 		return LDB_SUCCESS;
 	}
@@ -378,9 +395,6 @@ static int extended_dn_filter_callback(struct ldb_parse_tree *tree, void *privat
 		return LDB_SUCCESS;
 	}
 
-	guid_val = ldb_dn_get_extended_component(dn, "GUID");
-	sid_val  = ldb_dn_get_extended_component(dn, "SID");
-
 	if (guid_val) {
 		expression = talloc_asprintf(filter_ctx, "objectGUID=%s", ldb_binary_encode(filter_ctx, *guid_val));
 		scope = LDB_SCOPE_SUBTREE;
@@ -389,12 +403,6 @@ static int extended_dn_filter_callback(struct ldb_parse_tree *tree, void *privat
 		expression = talloc_asprintf(filter_ctx, "objectSID=%s", ldb_binary_encode(filter_ctx, *sid_val));
 		scope = LDB_SCOPE_SUBTREE;
 		base_dn = NULL;
-	} else if (attribute->searchFlags & SEARCH_FLAG_ATTINDEX) {
-		/* if it is indexed, then fixing the string DN will do
-		   no good here, as we will not find the attribute in
-		   the index. So for now fall through to a standard DN
-		   component comparison */
-		return LDB_SUCCESS;
 	} else {
 		/* fallback to searching using the string DN as the base DN */
 		expression = "objectClass=*";
diff --git a/source4/dsdb/samdb/ldb_modules/extended_dn_out.c b/source4/dsdb/samdb/ldb_modules/extended_dn_out.c
index 3333a37..0f37bbe 100644
--- a/source4/dsdb/samdb/ldb_modules/extended_dn_out.c
+++ b/source4/dsdb/samdb/ldb_modules/extended_dn_out.c
@@ -76,7 +76,7 @@ static int extended_dn_out_dereference_setup_control(struct ldb_context *ldb, st
 	}
 
 	for (cur = schema->attributes; cur; cur = cur->next) {
-		if (dsdb_dn_oid_to_format(cur->syntax->ldap_oid) != DSDB_NORMAL_DN) {
+		if (cur->dn_format != DSDB_NORMAL_DN) {
 			continue;
 		}
 		dereference_control->dereference
@@ -508,7 +508,7 @@ static int extended_callback(struct ldb_request *req, struct ldb_reply *ares,
 		}
 
 		/* Look to see if this attributeSyntax is a DN */
-		if (dsdb_dn_oid_to_format(attribute->syntax->ldap_oid) == DSDB_INVALID_DN) {
+		if (attribute->dn_format == DSDB_INVALID_DN) {
 			continue;
 		}
 
diff --git a/source4/dsdb/samdb/ldb_modules/extended_dn_store.c b/source4/dsdb/samdb/ldb_modules/extended_dn_store.c
index c423520..57dc883 100644
--- a/source4/dsdb/samdb/ldb_modules/extended_dn_store.c
+++ b/source4/dsdb/samdb/ldb_modules/extended_dn_store.c
@@ -325,7 +325,7 @@ static int extended_dn_add(struct ldb_module *module, struct ldb_request *req)
 		}
 
 		/* We only setup an extended DN GUID on DN elements */
-		if (dsdb_dn_oid_to_format(schema_attr->syntax->ldap_oid) == DSDB_INVALID_DN) {
+		if (schema_attr->dn_format == DSDB_INVALID_DN) {
 			continue;
 		}
 
@@ -400,7 +400,7 @@ static int extended_dn_modify(struct ldb_module *module, struct ldb_request *req
 		}
 
 		/* We only setup an extended DN GUID on these particular DN objects */
-		if (dsdb_dn_oid_to_format(schema_attr->syntax->ldap_oid) == DSDB_INVALID_DN) {
+		if (schema_attr->dn_format == DSDB_INVALID_DN) {
 			continue;
 		}
 
diff --git a/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c b/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c
index 4525cf3..9893ada 100644
--- a/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c
+++ b/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c
@@ -88,6 +88,45 @@ static int oc_validate_dsheuristics(struct ldb_message_element *el)
 	return LDB_SUCCESS;
 }
 
+/*
+  auto normalise values on input
+ */
+static int oc_auto_normalise(struct ldb_context *ldb, const struct dsdb_attribute *attr,
+			     struct ldb_message *msg, struct ldb_message_element *el)
+{
+	int i;
+	bool values_copied = false;
+
+	for (i=0; i<el->num_values; i++) {
+		struct ldb_val v;
+		int ret;
+		ret = attr->ldb_schema_attribute->syntax->canonicalise_fn(ldb, el->values, &el->values[i], &v);
+		if (ret != LDB_SUCCESS) {
+			return ret;
+		}
+		if (data_blob_cmp(&v, &el->values[i]) == 0) {
+			/* no need to replace it */
+			talloc_free(v.data);
+			continue;
+		}
+
+		/* we need to copy the values array on the first change */
+		if (!values_copied) {
+			struct ldb_val *v2;
+			v2 = talloc_array(msg->elements, struct ldb_val, el->num_values);
+			if (v2 == NULL) {
+				return ldb_oom(ldb);
+			}
+			memcpy(v2, el->values, sizeof(struct ldb_val) * el->num_values);
+			el->values = v2;
+			values_copied = true;
+		}
+
+		el->values[i] = v;
+	}
+	return LDB_SUCCESS;
+}
+
 static int attr_handler(struct oc_context *ac)
 {
 	struct ldb_context *ldb;
@@ -174,6 +213,14 @@ static int attr_handler(struct oc_context *ac)
 			}
 		}
 
+		/* auto normalise some attribute values */
+		if (attr->syntax->auto_normalise) {
+			ret = oc_auto_normalise(ldb, attr, msg, &msg->elements[i]);
+			if (ret != LDB_SUCCESS) {
+				return ret;
+			}
+		}
+
 		/* Substitute the attribute name to match in case */
 		msg->elements[i].name = attr->lDAPDisplayName;
 	}
diff --git a/source4/dsdb/samdb/ldb_modules/ridalloc.c b/source4/dsdb/samdb/ldb_modules/ridalloc.c
index 28fade1..ed87f86 100644
--- a/source4/dsdb/samdb/ldb_modules/ridalloc.c
+++ b/source4/dsdb/samdb/ldb_modules/ridalloc.c
@@ -263,6 +263,8 @@ static int ridalloc_create_rid_set_ntds(struct ldb_module *module, TALLOC_CTX *m
 		.next_rid	= 0,
 		.used_pool	= 0,
 	};
+	const char *no_attrs[] = { NULL };
+	struct ldb_result *res;
 
 	/*
 	  steps:
@@ -339,7 +341,21 @@ static int ridalloc_create_rid_set_ntds(struct ldb_module *module, TALLOC_CTX *m
 	msg = ldb_msg_new(tmp_ctx);
 	msg->dn = machine_dn;
 
-	ret = ldb_msg_add_string(msg, "rIDSetReferences", ldb_dn_get_linearized(rid_set_dn));
+	/* we need the extended DN of the RID Set object for
+	 * rIDSetReferences */
+	ret = dsdb_module_search_dn(module, msg, &res, rid_set_dn, no_attrs,
+				    DSDB_FLAG_NEXT_MODULE | DSDB_SEARCH_SHOW_DN_IN_STORAGE_FORMAT, parent);
+	if (ret != LDB_SUCCESS) {
+		ldb_asprintf_errstring(ldb, "Failed to find extended DN of RID Set %s - %s",
+				       ldb_dn_get_linearized(msg->dn),
+				       ldb_errstring(ldb));
+		talloc_free(tmp_ctx);
+		return ret;
+	}
+	rid_set_dn = res->msgs[0]->dn;
+
+
+	ret = ldb_msg_add_string(msg, "rIDSetReferences", ldb_dn_get_extended_linearized(msg, rid_set_dn, 1));
 	if (ret != LDB_SUCCESS) {
 		talloc_free(tmp_ctx);
 		return ret;
diff --git a/source4/dsdb/samdb/ldb_modules/util.c b/source4/dsdb/samdb/ldb_modules/util.c
index ebb214d..dfb8600 100644
--- a/source4/dsdb/samdb/ldb_modules/util.c
+++ b/source4/dsdb/samdb/ldb_modules/util.c
@@ -751,7 +751,7 @@ int dsdb_module_reference_dn(struct ldb_module *module, TALLOC_CTX *mem_ctx, str
 	attrs[1] = NULL;
 
 	ret = dsdb_module_search_dn(module, mem_ctx, &res, base, attrs,
-	                            DSDB_FLAG_NEXT_MODULE, parent);
+	                            DSDB_FLAG_NEXT_MODULE | DSDB_SEARCH_SHOW_EXTENDED_DN, parent);
 	if (ret != LDB_SUCCESS) {
 		return ret;
 	}
diff --git a/source4/dsdb/schema/schema.h b/source4/dsdb/schema/schema.h
index 13cc31c..58cf82b 100644
--- a/source4/dsdb/schema/schema.h
+++ b/source4/dsdb/schema/schema.h
@@ -73,6 +73,7 @@ struct dsdb_syntax {
 	WERROR (*validate_ldb)(const struct dsdb_syntax_ctx *ctx,
 			       const struct dsdb_attribute *attr,
 			       const struct ldb_message_element *in);
+	bool auto_normalise;
 };
 
 struct dsdb_attribute {
diff --git a/source4/dsdb/schema/schema_inferiors.c b/source4/dsdb/schema/schema_inferiors.c
index fe45641..d2c134e 100644
--- a/source4/dsdb/schema/schema_inferiors.c
+++ b/source4/dsdb/schema/schema_inferiors.c
@@ -328,7 +328,6 @@ int schema_fill_constructed(const struct dsdb_schema *schema)
 {
 	int ret;
 	struct dsdb_class *schema_class;
-	struct dsdb_attribute *attribute;
 
 	schema_fill_from_ids(schema);
 
@@ -354,35 +353,5 @@ int schema_fill_constructed(const struct dsdb_schema *schema)
 		schema_class->posssuperiors = NULL;
 	}
 
-	/* setup fast access to one_way_link and DN format */
-	for (attribute=schema->attributes; attribute; attribute=attribute->next) {
-		attribute->dn_format = dsdb_dn_oid_to_format(attribute->syntax->ldap_oid);
-
-		if (attribute->dn_format == DSDB_INVALID_DN) {
-			attribute->one_way_link = false;
-			continue;
-		}
-
-		/* these are not considered to be one way links for
-		   the purpose of DN link fixups */
-		if (ldb_attr_cmp("distinguishedName", attribute->lDAPDisplayName) == 0 ||
-		    ldb_attr_cmp("objectCategory", attribute->lDAPDisplayName) == 0) {
-			attribute->one_way_link = false;
-			continue;
-		}
-
-		if (attribute->linkID == 0) {
-			attribute->one_way_link = true;
-			continue;
-		}
-		/* handle attributes with a linkID but no backlink */
-		if (dsdb_attribute_by_linkID(schema, attribute->linkID) == NULL) {
-			attribute->one_way_link = true;
-			continue;
-		}
-		attribute->one_way_link = false;
-	}
-
-
 	return LDB_SUCCESS;
 }
diff --git a/source4/dsdb/schema/schema_set.c b/source4/dsdb/schema/schema_set.c
index 9dee0a4..8cb06bb 100644
--- a/source4/dsdb/schema/schema_set.c
+++ b/source4/dsdb/schema/schema_set.c
@@ -30,6 +30,11 @@
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "lib/util/tsort.h"
 
+/* change this when we change something in our schema code that
+ * requires a re-index of the database
+ */
+#define SAMDB_INDEXING_VERSION "2"
+
 /*
   override the name to attribute handler function
  */
@@ -95,6 +100,12 @@ static int dsdb_schema_set_attributes(struct ldb_context *ldb, struct dsdb_schem
 		goto op_error;
 	}
 
+
+	ret = ldb_msg_add_string(msg_idx, "@IDXVERSION", SAMDB_INDEXING_VERSION);
+	if (ret != LDB_SUCCESS) {
+		goto op_error;
+	}
+
 	for (attr = schema->attributes; attr; attr = attr->next) {
 		const char *syntax = attr->syntax->ldb_syntax;
 
@@ -200,6 +211,44 @@ op_error:
 	return ldb_operr(ldb);
 }
 
+
+/*
+  create extra attribute shortcuts
+ */
+static void dsdb_setup_attribute_shortcuts(struct ldb_context *ldb, struct dsdb_schema *schema)
+{
+	struct dsdb_attribute *attribute;
+
+	/* setup fast access to one_way_link and DN format */
+	for (attribute=schema->attributes; attribute; attribute=attribute->next) {
+		attribute->dn_format = dsdb_dn_oid_to_format(attribute->syntax->ldap_oid);
+
+		if (attribute->dn_format == DSDB_INVALID_DN) {
+			attribute->one_way_link = false;
+			continue;
+		}
+
+		/* these are not considered to be one way links for
+		   the purpose of DN link fixups */
+		if (ldb_attr_cmp("distinguishedName", attribute->lDAPDisplayName) == 0 ||
+		    ldb_attr_cmp("objectCategory", attribute->lDAPDisplayName) == 0) {
+			attribute->one_way_link = false;
+			continue;
+		}
+
+		if (attribute->linkID == 0) {
+			attribute->one_way_link = true;
+			continue;
+		}
+		/* handle attributes with a linkID but no backlink */
+		if (dsdb_attribute_by_linkID(schema, attribute->linkID) == NULL) {
+			attribute->one_way_link = true;
+			continue;
+		}
+		attribute->one_way_link = false;
+	}
+}
+
 static int uint32_cmp(uint32_t c1, uint32_t c2)
 {
 	if (c1 == c2) return 0;
@@ -272,6 +321,7 @@ int dsdb_setup_sorted_accessors(struct ldb_context *ldb,
 	struct dsdb_attribute *a;
 	unsigned int i;
 	unsigned int num_int_id;
+	int ret;
 
 	/* free all caches */
 	dsdb_sorted_accessors_free(schema);
@@ -354,6 +404,14 @@ int dsdb_setup_sorted_accessors(struct ldb_context *ldb,
 	TYPESAFE_QSORT(schema->attributes_by_attributeID_oid, schema->num_attributes, dsdb_compare_attribute_by_attributeID_oid);
 	TYPESAFE_QSORT(schema->attributes_by_linkID, schema->num_attributes, dsdb_compare_attribute_by_linkID);
 
+	dsdb_setup_attribute_shortcuts(ldb, schema);
+
+	ret = schema_fill_constructed(schema);
+	if (ret != LDB_SUCCESS) {
+		dsdb_sorted_accessors_free(schema);
+		return ret;
+	}
+
 	return LDB_SUCCESS;
 
 failed:
@@ -361,24 +419,6 @@ failed:
 	return ldb_oom(ldb);
 }
 
-int dsdb_setup_schema_inversion(struct ldb_context *ldb, struct dsdb_schema *schema)
-{
-	/* Walk the list of schema classes */
-
-	/*  For each subClassOf, add us to subclasses of the parent */
-
-	/* collect these subclasses into a recursive list of total subclasses, preserving order */
-
-	/* For each subclass under 'top', write the index from it's
-	 * order as an integer in the dsdb_class (for sorting
-	 * objectClass lists efficiently) */
-
-	/* Walk the list of schema classes */
-
-	/*  Create a 'total possible superiors' on each class */
-	return LDB_SUCCESS;
-}
-
 /**
  * Attach the schema to an opaque pointer on the ldb,
  * so ldb modules can find it
@@ -393,11 +433,6 @@ int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema)
 		return ret;
 	}
 
-	ret = schema_fill_constructed(schema);
-	if (ret != LDB_SUCCESS) {
-		return ret;
-	}
-
 	old_schema = ldb_get_opaque(ldb, "dsdb_schema");
 
 	ret = ldb_set_opaque(ldb, "dsdb_schema", schema);
diff --git a/source4/dsdb/schema/schema_syntax.c b/source4/dsdb/schema/schema_syntax.c
index d443c00..e875bee 100644
--- a/source4/dsdb/schema/schema_syntax.c
+++ b/source4/dsdb/schema/schema_syntax.c
@@ -229,9 +229,11 @@ static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(const struct dsdb_syntax_ctx *ctx,
 		blobs[i] = data_blob_talloc(blobs, NULL, 4);
 		W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
-		if (strcmp("TRUE", (const char *)in->values[i].data) == 0) {
+		if (in->values[i].length >= 4 &&
+		    strncmp("TRUE", (const char *)in->values[i].data, in->values[i].length) == 0) {
 			SIVAL(blobs[i].data, 0, 0x00000001);
-		} else if (strcmp("FALSE", (const char *)in->values[i].data) == 0) {
+		} else if (in->values[i].length >= 5 &&
+			   strncmp("FALSE", (const char *)in->values[i].data, in->values[i].length) == 0) {
 			SIVAL(blobs[i].data, 0, 0x00000000);
 		} else {
 			return WERR_FOOBAR;
@@ -252,22 +254,23 @@ static WERROR dsdb_syntax_BOOL_validate_ldb(const struct dsdb_syntax_ctx *ctx,
 	}
 
 	for (i=0; i < in->num_values; i++) {
-		int t, f;
-
 		if (in->values[i].length == 0) {
 			return WERR_DS_INVALID_ATTRIBUTE_SYNTAX;
 		}
 
-		t = strncmp("TRUE",
+		if (in->values[i].length >= 4 &&
+		    strncmp("TRUE",
 			    (const char *)in->values[i].data,
-			    in->values[i].length);
-		f = strncmp("FALSE",
+			    in->values[i].length) == 0) {
+			continue;
+		}
+		if (in->values[i].length >= 5 &&
+		    strncmp("FALSE",
 			    (const char *)in->values[i].data,
-			    in->values[i].length);
-
-		if (t != 0 && f != 0) {
-			return WERR_DS_INVALID_ATTRIBUTE_SYNTAX;
+			    in->values[i].length) == 0) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list