svn commit: samba r20863 - in branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules: .

metze at samba.org metze at samba.org
Wed Jan 17 19:45:17 GMT 2007


Author: metze
Date: 2007-01-17 19:45:17 +0000 (Wed, 17 Jan 2007)
New Revision: 20863

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=20863

Log:
check that there's a current partition control attached to the request

metze
Modified:
   branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/repl_meta_data.c


Changeset:
Modified: branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/repl_meta_data.c
===================================================================
--- branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/repl_meta_data.c	2007-01-17 19:20:11 UTC (rev 20862)
+++ branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/repl_meta_data.c	2007-01-17 19:45:17 UTC (rev 20863)
@@ -170,7 +170,8 @@
 
 static int replmd_add_originating(struct ldb_module *module,
 				  struct ldb_request *req,
-				  const struct dsdb_schema *schema)
+				  const struct dsdb_schema *schema,
+				  const struct dsdb_control_current_partition *partition)
 {
 	struct ldb_request *down_req;
 	struct ldb_message_element *attribute;
@@ -251,6 +252,8 @@
 static int replmd_add(struct ldb_module *module, struct ldb_request *req)
 {
 	const struct dsdb_schema *schema;
+	const struct ldb_control *partition_ctrl;
+	const struct dsdb_control_current_partition *partition;
 
 	/* do not manipulate our control entries */
 	if (ldb_dn_is_special(req->op.add.message->dn)) {
@@ -259,16 +262,40 @@
 
 	schema = dsdb_get_schema(module->ldb);
 	if (!schema) {
-		ldb_debug_set(module->ldb, LDB_DEBUG_FATAL, "replmd_add: no dsdb_schema loaded");
+		ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+			      "replmd_add: no dsdb_schema loaded");
 		return LDB_ERR_CONSTRAINT_VIOLATION;
 	}
 
-	return replmd_add_originating(module, req, schema);
+	partition_ctrl = get_control_from_list(req->controls, DSDB_CONTROL_CURRENT_PARTITION_OID);
+	if (!partition_ctrl) {
+		ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+			      "replmd_add: no current partition control found");
+		return LDB_ERR_CONSTRAINT_VIOLATION;
+	}
+
+	partition = talloc_get_type(partition_ctrl->data,
+				    struct dsdb_control_current_partition);
+	if (!partition) {
+		ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+			      "replmd_add: current partition control contains invalid data");
+		return LDB_ERR_CONSTRAINT_VIOLATION;
+	}
+
+	if (partition->version != DSDB_CONTROL_CURRENT_PARTITION_VERSION) {
+		ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+			      "replmd_add: current partition control contains invalid version [%u != %u]\n",
+			      partition->version, DSDB_CONTROL_CURRENT_PARTITION_VERSION);
+		return LDB_ERR_CONSTRAINT_VIOLATION;
+	}
+
+	return replmd_add_originating(module, req, schema, partition);
 }
 
 static int replmd_modify_originating(struct ldb_module *module,
 				     struct ldb_request *req,
-				     const struct dsdb_schema *schema)
+				     const struct dsdb_schema *schema,
+				     const struct dsdb_control_current_partition *partition)
 {
 	struct ldb_request *down_req;
 	struct ldb_message *msg;
@@ -323,6 +350,8 @@
 static int replmd_modify(struct ldb_module *module, struct ldb_request *req)
 {
 	const struct dsdb_schema *schema;
+	const struct ldb_control *partition_ctrl;
+	const struct dsdb_control_current_partition *partition;
  
 	/* do not manipulate our control entries */
 	if (ldb_dn_is_special(req->op.mod.message->dn)) {
@@ -331,11 +360,41 @@
 
 	schema = dsdb_get_schema(module->ldb);
 	if (!schema) {
-		ldb_debug_set(module->ldb, LDB_DEBUG_FATAL, "replmd_modify: no dsdb_schema loaded");
+		ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+			      "replmd_modify: no dsdb_schema loaded");
 		return LDB_ERR_CONSTRAINT_VIOLATION;
 	}
 
-	return replmd_modify_originating(module, req, schema);
+	schema = dsdb_get_schema(module->ldb);
+	if (!schema) {
+		ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+			      "replmd_modify: no dsdb_schema loaded");
+		return LDB_ERR_CONSTRAINT_VIOLATION;
+	}
+
+	partition_ctrl = get_control_from_list(req->controls, DSDB_CONTROL_CURRENT_PARTITION_OID);
+	if (!partition_ctrl) {
+		ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+			      "replmd_modify: no current partition control found");
+		return LDB_ERR_CONSTRAINT_VIOLATION;
+	}
+
+	partition = talloc_get_type(partition_ctrl->data,
+				    struct dsdb_control_current_partition);
+	if (!partition) {
+		ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+			      "replmd_modify: current partition control contains invalid data");
+		return LDB_ERR_CONSTRAINT_VIOLATION;
+	}
+
+	if (partition->version != DSDB_CONTROL_CURRENT_PARTITION_VERSION) {
+		ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
+			      "replmd_modify: current partition control contains invalid version [%u != %u]\n",
+			      partition->version, DSDB_CONTROL_CURRENT_PARTITION_VERSION);
+		return LDB_ERR_CONSTRAINT_VIOLATION;
+	}
+
+	return replmd_modify_originating(module, req, schema, partition);
 }
 
 static int replmd_replicated_request_reply_helper(struct replmd_replicated_request *ar, int ret)



More information about the samba-cvs mailing list