[SCM] Samba Shared Repository - branch v4-0-test updated - release-4-0-0alpha5-50-g0a79738

Andrew Bartlett abartlet at samba.org
Fri Jul 11 05:12:07 GMT 2008


The branch, v4-0-test has been updated
       via  0a797388ca442c3ad4809888897b1c63b65a7fdf (commit)
      from  f956908cde7dd40643ff49cf433d0cf7765027de (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v4-0-test


- Log -----------------------------------------------------------------
commit 0a797388ca442c3ad4809888897b1c63b65a7fdf
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Fri Jul 11 15:11:32 2008 +1000

    Use common code to fill in allowedAttributes in kludge_acl.
    
    This code is now in common with ad2oLschema.
    
    Andrew Bartlett

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

Summary of changes:
 source/dsdb/samdb/ldb_modules/kludge_acl.c |   64 ++++++++++++----------------
 source/dsdb/schema/schema.h                |    3 +-
 source/dsdb/schema/schema_init.c           |   13 +++++-
 3 files changed, 41 insertions(+), 39 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/dsdb/samdb/ldb_modules/kludge_acl.c b/source/dsdb/samdb/ldb_modules/kludge_acl.c
index e418031..bc30fbc 100644
--- a/source/dsdb/samdb/ldb_modules/kludge_acl.c
+++ b/source/dsdb/samdb/ldb_modules/kludge_acl.c
@@ -93,8 +93,9 @@ static int kludge_acl_allowedAttributes(struct ldb_context *ldb, struct ldb_mess
 	struct ldb_message_element *oc_el;
 	struct ldb_message_element *allowedAttributes;
 	const struct dsdb_schema *schema = dsdb_get_schema(ldb);
-	const struct dsdb_class *class;
-	int i, j, ret;
+	TALLOC_CTX *mem_ctx;
+	char **objectclass_list, **attr_list;
+	int i, ret;
 
  	/* If we don't have a schema yet, we can't do anything... */
 	if (schema == NULL) {
@@ -108,48 +109,39 @@ static int kludge_acl_allowedAttributes(struct ldb_context *ldb, struct ldb_mess
 		return ret;
 	}
 	
+	mem_ctx = talloc_new(msg);
+	if (!mem_ctx) {
+		ldb_oom(ldb);
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
 	/* To ensure that oc_el is valid, we must look for it after 
 	   we alter the element array in ldb_msg_add_empty() */
 	oc_el = ldb_msg_find_element(msg, "objectClass");
+	
+	objectclass_list = talloc_array(mem_ctx, char *, oc_el->num_values + 1);
+	if (!objectclass_list) {
+		ldb_oom(ldb);
+		talloc_free(mem_ctx);
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
 
 	for (i=0; oc_el && i < oc_el->num_values; i++) {
-		class = dsdb_class_by_lDAPDisplayName(schema, (const char *)oc_el->values[i].data);
-		if (!class) {
-			/* We don't know this class?  what is going on? */
-			continue;
-		}
-
-		for (j=0; class->mayContain && class->mayContain[j]; j++) {
-			ldb_msg_add_string(msg, attrName, class->mayContain[j]);
-		}
-		for (j=0; class->mustContain && class->mustContain[j]; j++) {
-			ldb_msg_add_string(msg, attrName, class->mustContain[j]);
-		}
-		for (j=0; class->systemMayContain && class->systemMayContain[j]; j++) {
-			ldb_msg_add_string(msg, attrName, class->systemMayContain[j]);
-		}
-		for (j=0; class->systemMustContain && class->systemMustContain[j]; j++) {
-			ldb_msg_add_string(msg, attrName, class->systemMustContain[j]);
-		}
+		objectclass_list[i] = (char *)oc_el->values[i].data;
 	}
-		
-	if (allowedAttributes->num_values > 1) {
-		qsort(allowedAttributes->values, 
-		      allowedAttributes->num_values, 
-		      sizeof(*allowedAttributes->values),
-		      (comparison_fn_t)data_blob_cmp);
-	
-		for (i=1 ; i < allowedAttributes->num_values; i++) {
-			struct ldb_val *val1 = &allowedAttributes->values[i-1];
-			struct ldb_val *val2 = &allowedAttributes->values[i];
-			if (data_blob_cmp(val1, val2) == 0) {
-				memmove(val1, val2, (allowedAttributes->num_values - i) * sizeof( struct ldb_val)); 
-				allowedAttributes->num_values--;
-				i--;
-			}
-		}
+	objectclass_list[i] = NULL;
+
+	attr_list = dsdb_full_attribute_list(mem_ctx, schema, (const char **)objectclass_list, DSDB_SCHEMA_ALL);
+	if (!attr_list) {
+		ldb_asprintf_errstring(ldb, "kludge_acl: Failed to get list of attributes create %s attribute", attrName);
+		talloc_free(mem_ctx);
+		return LDB_ERR_OPERATIONS_ERROR;
 	}
 
+	for (i=0; attr_list && attr_list[i]; i++) {
+		ldb_msg_add_string(msg, attrName, attr_list[i]);
+	}
+	talloc_free(mem_ctx);
 	return 0;
 
 }
diff --git a/source/dsdb/schema/schema.h b/source/dsdb/schema/schema.h
index 66cc867..a4e455a 100644
--- a/source/dsdb/schema/schema.h
+++ b/source/dsdb/schema/schema.h
@@ -164,7 +164,8 @@ enum dsdb_attr_list_query {
 	DSDB_SCHEMA_SYS_MAY,
 	DSDB_SCHEMA_SYS_MUST,
 	DSDB_SCHEMA_MAY,
-	DSDB_SCHEMA_MUST
+	DSDB_SCHEMA_MUST,
+	DSDB_SCHEMA_ALL
 };
 
 #include "dsdb/schema/proto.h"
diff --git a/source/dsdb/schema/schema_init.c b/source/dsdb/schema/schema_init.c
index 3a6a8f5..71d952b 100644
--- a/source/dsdb/schema/schema_init.c
+++ b/source/dsdb/schema/schema_init.c
@@ -1404,7 +1404,8 @@ static char **merge_attr_list(TALLOC_CTX *mem_ctx,
 	return ret_attrs;
 }
 
-char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, struct dsdb_schema *schema, 
+char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, 
+					 const struct dsdb_schema *schema, 
 					 const char **class_list,
 					 enum dsdb_attr_list_query query)
 {
@@ -1443,6 +1444,13 @@ char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, struct dsdb_schema
 		case DSDB_SCHEMA_MUST:
 			attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain);
 			break;
+
+		case DSDB_SCHEMA_ALL:
+			attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain);
+			attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain);
+			attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain);
+			attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain);
+			break;
 		}
 
 		recursive_list = dsdb_full_attribute_list_internal(mem_ctx, schema, 
@@ -1461,7 +1469,8 @@ char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, struct dsdb_schema
 	return attr_list;
 }
 
-char **dsdb_full_attribute_list(TALLOC_CTX *mem_ctx, struct dsdb_schema *schema, 
+char **dsdb_full_attribute_list(TALLOC_CTX *mem_ctx, 
+				const struct dsdb_schema *schema, 
 				const char **class_list,
 				enum dsdb_attr_list_query query)
 {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list