[SCM] Samba Shared Repository - branch v4-0-test updated - release-4-0-0alpha4-180-g9018b85

Stefan Metzmacher metze at samba.org
Tue Jul 1 16:25:01 GMT 2008


The branch, v4-0-test has been updated
       via  9018b85e834de6714a78304ba1c7018838e30a61 (commit)
       via  8538d305c803268c712a90879f29a2a74ba0ef03 (commit)
      from  cd5e48649ce0987952b2b55ea79c3ecceecfafd5 (commit)

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


- Log -----------------------------------------------------------------
commit 9018b85e834de6714a78304ba1c7018838e30a61
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jun 30 17:17:24 2008 +0200

    schema_fsmo: prepare auto allocation of schema oid prefixes
    
    This implements the logic in the schema_fsmo_add() function,
    but it only calls a dummy dsdb_create_prefix_mapping() yet.
    
    metze

commit 8538d305c803268c712a90879f29a2a74ba0ef03
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Jul 1 16:35:13 2008 +0200

    schema_fsmo: move fsmo info into struct dsdb_schema
    
    metze

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

Summary of changes:
 source/dsdb/samdb/ldb_modules/rootdse.c     |    5 +-
 source/dsdb/samdb/ldb_modules/schema_fsmo.c |   90 +++++++++++++++++++-------
 source/dsdb/samdb/samdb.h                   |    5 --
 source/dsdb/schema/schema.h                 |    5 ++
 source/dsdb/schema/schema_init.c            |   29 +++++++++
 5 files changed, 101 insertions(+), 33 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/dsdb/samdb/ldb_modules/rootdse.c b/source/dsdb/samdb/ldb_modules/rootdse.c
index 50f333d..75f99a1 100644
--- a/source/dsdb/samdb/ldb_modules/rootdse.c
+++ b/source/dsdb/samdb/ldb_modules/rootdse.c
@@ -164,14 +164,11 @@ static int rootdse_add_dynamic(struct ldb_module *module, struct ldb_message *ms
 	}
 
 	if (do_attribute_explicit(attrs, "validFSMOs")) {
-		const struct dsdb_schema_fsmo *schema_fsmo;
 		const struct dsdb_naming_fsmo *naming_fsmo;
 		const struct dsdb_pdc_fsmo *pdc_fsmo;
 		const char *dn_str;
 
-		schema_fsmo = talloc_get_type(ldb_get_opaque(module->ldb, "dsdb_schema_fsmo"),
-					      struct dsdb_schema_fsmo);
-		if (schema_fsmo && schema_fsmo->we_are_master) {
+		if (schema && schema->fsmo.we_are_master) {
 			dn_str = ldb_dn_get_linearized(samdb_schema_dn(module->ldb));
 			if (dn_str && dn_str[0]) {
 				if (ldb_msg_add_fmt(msg, "validFSMOs", "%s", dn_str) != 0) {
diff --git a/source/dsdb/samdb/ldb_modules/schema_fsmo.c b/source/dsdb/samdb/ldb_modules/schema_fsmo.c
index bc1e60a..0110860 100644
--- a/source/dsdb/samdb/ldb_modules/schema_fsmo.c
+++ b/source/dsdb/samdb/ldb_modules/schema_fsmo.c
@@ -38,7 +38,6 @@ static int schema_fsmo_init(struct ldb_module *module)
 	TALLOC_CTX *mem_ctx;
 	struct ldb_dn *schema_dn;
 	struct dsdb_schema *schema;
-	struct dsdb_schema_fsmo *schema_fsmo;
 	struct ldb_result *schema_res;
 	const struct ldb_val *prefix_val;
 	const struct ldb_val *info_val;
@@ -54,8 +53,6 @@ static int schema_fsmo_init(struct ldb_module *module)
 		NULL
 	};
 
-	module->private_data = NULL;
-
 	if (dsdb_get_schema(module->ldb)) {
 		return ldb_next_init(module);
 	}
@@ -74,12 +71,6 @@ static int schema_fsmo_init(struct ldb_module *module)
 		return LDB_ERR_OPERATIONS_ERROR;
 	}
 
-	schema_fsmo = talloc_zero(mem_ctx, struct dsdb_schema_fsmo);
-	if (!schema_fsmo) {
-		ldb_oom(module->ldb);
-		return LDB_ERR_OPERATIONS_ERROR;
-	}
-
 	schema = dsdb_new_schema(mem_ctx, lp_iconv_convenience(ldb_get_opaque(module->ldb, "loadparm")));
 	if (!schema) {
 		ldb_oom(module->ldb);
@@ -225,6 +216,13 @@ static int schema_fsmo_init(struct ldb_module *module)
 	}
 	talloc_free(c_res);
 
+	schema->fsmo.master_dn = ldb_msg_find_attr_as_dn(module->ldb, schema, schema_res->msgs[0], "fSMORoleOwner");
+	if (ldb_dn_compare(samdb_ntds_settings_dn(module->ldb), schema->fsmo.master_dn) == 0) {
+		schema->fsmo.we_are_master = true;
+	} else {
+		schema->fsmo.we_are_master = false;
+	}
+
 	/* dsdb_set_schema() steal schema into the ldb_context */
 	ret = dsdb_set_schema(module->ldb, schema);
 	if (ret != LDB_SUCCESS) {
@@ -235,29 +233,73 @@ static int schema_fsmo_init(struct ldb_module *module)
 		return ret;
 	}
 
-	schema_fsmo->master_dn = ldb_msg_find_attr_as_dn(module->ldb, schema_fsmo, schema_res->msgs[0], "fSMORoleOwner");
-	if (ldb_dn_compare(samdb_ntds_settings_dn(module->ldb), schema_fsmo->master_dn) == 0) {
-		schema_fsmo->we_are_master = true;
-	} else {
-		schema_fsmo->we_are_master = false;
+	ldb_debug(module->ldb, LDB_DEBUG_TRACE,
+			  "schema_fsmo_init: we are master: %s\n",
+			  (schema->fsmo.we_are_master?"yes":"no"));
+
+	talloc_free(mem_ctx);
+	return ldb_next_init(module);
+}
+
+static int schema_fsmo_add(struct ldb_module *module, struct ldb_request *req)
+{
+	struct dsdb_schema *schema;
+	const char *attributeID = NULL;
+	const char *governsID = NULL;
+	const char *oid_attr = NULL;
+	const char *oid = NULL;
+	uint32_t id32;
+	WERROR status;
+
+	schema = dsdb_get_schema(module->ldb);
+	if (!schema) {
+		return ldb_next_request(module, req);
 	}
 
-	if (ldb_set_opaque(module->ldb, "dsdb_schema_fsmo", schema_fsmo) != LDB_SUCCESS) {
-		ldb_oom(module->ldb);
-		return LDB_ERR_OPERATIONS_ERROR;
+	if (!schema->fsmo.we_are_master) {
+		ldb_debug_set(module->ldb, LDB_DEBUG_ERROR,
+			  "schema_fsmo_add: we are not master: reject request\n");
+		return LDB_ERR_UNWILLING_TO_PERFORM;
 	}
 
-	module->private_data = talloc_steal(module, schema_fsmo);
+	attributeID = samdb_result_string(req->op.add.message, "attributeID", NULL);
+	governsID = samdb_result_string(req->op.add.message, "governsID", NULL);
 
-	ldb_debug(module->ldb, LDB_DEBUG_TRACE,
-			  "schema_fsmo_init: we are master: %s\n",
-			  (schema_fsmo->we_are_master?"yes":"no"));
+	if (attributeID) {
+		oid_attr = "attributeID";
+		oid = attributeID;
+	} else if (governsID) {
+		oid_attr = "governsID";
+		oid = governsID;
+	}
 
-	talloc_free(mem_ctx);
-	return ldb_next_init(module);
+	if (!oid) {
+		return ldb_next_request(module, req);
+	}
+
+	status = dsdb_map_oid2int(schema, oid, &id32);
+	if (W_ERROR_IS_OK(status)) {
+		return ldb_next_request(module, req);
+	} else if (!W_ERROR_EQUAL(WERR_DS_NO_MSDS_INTID, status)) {
+		ldb_debug_set(module->ldb, LDB_DEBUG_ERROR,
+			  "schema_fsmo_add: failed to map %s[%s]: %s\n",
+			  oid_attr, oid, win_errstr(status));
+		return LDB_ERR_UNWILLING_TO_PERFORM;
+	}
+
+	status = dsdb_create_prefix_mapping(module->ldb, schema, oid);
+	if (!W_ERROR_IS_OK(status)) {
+		ldb_debug_set(module->ldb, LDB_DEBUG_ERROR,
+			  "schema_fsmo_add: failed to create prefix mapping for %s[%s]: %s\n",
+			  oid_attr, oid, win_errstr(status));
+		return LDB_ERR_UNWILLING_TO_PERFORM;
+	}
+
+	return ldb_next_request(module, req);
 }
 
 _PUBLIC_ const struct ldb_module_ops ldb_schema_fsmo_module_ops = {
 	.name		= "schema_fsmo",
-	.init_context	= schema_fsmo_init
+	.init_context	= schema_fsmo_init,
+	.add		= schema_fsmo_add
 };
diff --git a/source/dsdb/samdb/samdb.h b/source/dsdb/samdb/samdb.h
index 8370857..75aa819 100644
--- a/source/dsdb/samdb/samdb.h
+++ b/source/dsdb/samdb/samdb.h
@@ -80,11 +80,6 @@ struct dsdb_extended_replicated_objects {
 	struct dsdb_extended_replicated_object *objects;
 };
 
-struct dsdb_schema_fsmo {
-	bool we_are_master;
-	struct ldb_dn *master_dn;
-};
-
 struct dsdb_naming_fsmo {
 	bool we_are_master;
 	struct ldb_dn *master_dn;
diff --git a/source/dsdb/schema/schema.h b/source/dsdb/schema/schema.h
index bb34235..6fce354 100644
--- a/source/dsdb/schema/schema.h
+++ b/source/dsdb/schema/schema.h
@@ -150,6 +150,11 @@ struct dsdb_schema {
 	struct dsdb_attribute *attributes;
 	struct dsdb_class *classes;
 
+	struct {
+		bool we_are_master;
+		struct ldb_dn *master_dn;
+	} fsmo;
+
 	struct smb_iconv_convenience *iconv_convenience;
 };
 
diff --git a/source/dsdb/schema/schema_init.c b/source/dsdb/schema/schema_init.c
index c046cb5..9c70e9b 100644
--- a/source/dsdb/schema/schema_init.c
+++ b/source/dsdb/schema/schema_init.c
@@ -334,6 +334,29 @@ WERROR dsdb_map_int2oid(const struct dsdb_schema *schema, uint32_t in, TALLOC_CT
 	return WERR_DS_NO_MSDS_INTID;
 }
 
+/*
+ * this function is called from within a ldb transaction from the schema_fsmo module
+ */
+WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *schema, const char *full_oid)
+{
+	/*
+	 * TODO:
+	 *	- (maybe) read the old prefixMap attribute and parse it
+	 *
+	 *	- recheck the prefix doesn't exist (because the ldb
+	 *	  has maybe a more uptodate value than schem->prefixes
+	 *
+	 *	- calculate a new mapping for the oid prefix of full_oid
+	 *	- store the new prefixMap attribute
+	 *
+	 *	- (maybe) update schema->prefixes
+	 *	or
+	 *	- better find a way to indicate a schema reload,
+	 *	  so that other processes also notice the schema change
+	 */
+	return WERR_NOT_SUPPORTED;
+}
+
 #define GET_STRING_LDB(msg, attr, mem_ctx, p, elem, strict) do { \
 	(p)->elem = samdb_result_string(msg, attr, NULL);\
 	if (strict && (p)->elem == NULL) { \
@@ -1164,6 +1187,12 @@ WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf
 
 	schema = dsdb_new_schema(mem_ctx, lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")));
 
+	schema->fsmo.we_are_master = true;
+	schema->fsmo.master_dn = ldb_dn_new_fmt(schema, ldb, "@PROVISION_SCHEMA_MASTER");
+	if (!schema->fsmo.master_dn) {
+		goto nomem;
+	}
+
 	/*
 	 * load the prefixMap attribute from pf
 	 */


-- 
Samba Shared Repository


More information about the samba-cvs mailing list