svn commit: samba r20580 - in branches/SAMBA_4_0/source: dsdb/samdb dsdb/samdb/ldb_modules torture/libnet

metze at samba.org metze at samba.org
Sat Jan 6 01:13:59 GMT 2007


Author: metze
Date: 2007-01-06 01:13:59 +0000 (Sat, 06 Jan 2007)
New Revision: 20580

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

Log:
pass the DSDB_CONTROL_REPLICATED_OBJECT_OID with the ldb_add request
when applying replicated objects.

the samldb module ignores such requests now...
and the repl_meta_data module has different functions
for the replicated and originating cases...

metze
Modified:
   branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/repl_meta_data.c
   branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/samldb.c
   branches/SAMBA_4_0/source/dsdb/samdb/samdb.h
   branches/SAMBA_4_0/source/torture/libnet/libnet_BecomeDC.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-06 01:10:36 UTC (rev 20579)
+++ branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/repl_meta_data.c	2007-01-06 01:13:59 UTC (rev 20580)
@@ -40,8 +40,11 @@
  */
 
 #include "includes.h"
-#include "ldb/include/includes.h"
+#include "lib/ldb/include/ldb.h"
+#include "lib/ldb/include/ldb_errors.h"
+#include "lib/ldb/include/ldb_private.h"
 #include "librpc/gen_ndr/ndr_misc.h"
+#include "dsdb/samdb/samdb.h"
 
 static struct ldb_message_element *replmd_find_attribute(const struct ldb_message *msg, const char *name)
 {
@@ -108,9 +111,25 @@
 	return 0;
 }
 
-/* add_record: add objectGUID attribute */
-static int replmd_add(struct ldb_module *module, struct ldb_request *req)
+static int replmd_add_replicated(struct ldb_module *module, struct ldb_request *req, struct ldb_control *ctrl)
 {
+	struct ldb_control **saved_ctrls;
+	int ret;
+
+	ldb_debug(module->ldb, LDB_DEBUG_TRACE, "replmd_add_replicated\n");
+
+	if (!save_controls(ctrl, req, &saved_ctrls)) {
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	ret = ldb_next_request(module, req);
+	req->controls = saved_ctrls;
+
+	return ret;
+}
+
+static int replmd_add_originating(struct ldb_module *module, struct ldb_request *req)
+{
 	struct ldb_request *down_req;
 	struct ldb_message_element *attribute;
 	struct ldb_message *msg;
@@ -121,13 +140,8 @@
 	int ret;
 	time_t t = time(NULL);
 
-	ldb_debug(module->ldb, LDB_DEBUG_TRACE, "replmd_add_record\n");
+	ldb_debug(module->ldb, LDB_DEBUG_TRACE, "replmd_add_originating\n");
 
-	/* do not manipulate our control entries */
-	if (ldb_dn_is_special(req->op.add.message->dn)) {
-		return ldb_next_request(module, req);
-	}
-
 	if ((attribute = replmd_find_attribute(req->op.add.message, "objectGUID")) != NULL ) {
 		return ldb_next_request(module, req);
 	}
@@ -192,22 +206,51 @@
 	return ret;
 }
 
-/* modify_record: update timestamps */
-static int replmd_modify(struct ldb_module *module, struct ldb_request *req)
+static int replmd_add(struct ldb_module *module, struct ldb_request *req)
 {
+	struct ldb_control *ctrl;
+
+	/* do not manipulate our control entries */
+	if (ldb_dn_is_special(req->op.add.message->dn)) {
+		return ldb_next_request(module, req);
+	}
+
+	ctrl = get_control_from_list(req->controls, DSDB_CONTROL_REPLICATED_OBJECT_OID);
+	if (ctrl) {
+		/* handle replicated objects different */
+		return replmd_add_replicated(module, req, ctrl);
+	}
+
+	return replmd_add_originating(module, req);
+}
+
+static int replmd_modify_replicated(struct ldb_module *module, struct ldb_request *req, struct ldb_control *ctrl)
+{
+	struct ldb_control **saved_ctrls;
+	int ret;
+
+	ldb_debug(module->ldb, LDB_DEBUG_TRACE, "replmd_modify_replicated\n");
+
+	if (!save_controls(ctrl, req, &saved_ctrls)) {
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	ret = ldb_next_request(module, req);
+	req->controls = saved_ctrls;
+
+	return ret;
+}
+
+static int replmd_modify_originating(struct ldb_module *module, struct ldb_request *req)
+{
 	struct ldb_request *down_req;
 	struct ldb_message *msg;
 	int ret;
 	time_t t = time(NULL);
 	uint64_t seq_num;
 
-	ldb_debug(module->ldb, LDB_DEBUG_TRACE, "replmd_modify\n");
+	ldb_debug(module->ldb, LDB_DEBUG_TRACE, "replmd_modify_originating\n");
 
-	/* do not manipulate our control entries */
-	if (ldb_dn_is_special(req->op.add.message->dn)) {
-		return ldb_next_request(module, req);
-	}
-
 	down_req = talloc(req, struct ldb_request);
 	if (down_req == NULL) {
 		return LDB_ERR_OPERATIONS_ERROR;
@@ -250,6 +293,24 @@
 	return ret;
 }
 
+static int replmd_modify(struct ldb_module *module, struct ldb_request *req)
+{
+	struct ldb_control *ctrl;
+
+	/* do not manipulate our control entries */
+	if (ldb_dn_is_special(req->op.mod.message->dn)) {
+		return ldb_next_request(module, req);
+	}
+
+	ctrl = get_control_from_list(req->controls, DSDB_CONTROL_REPLICATED_OBJECT_OID);
+	if (ctrl) {
+		/* handle replicated objects different */
+		return replmd_modify_replicated(module, req, ctrl);
+	}
+
+	return replmd_modify_originating(module, req);
+}
+
 static const struct ldb_module_ops replmd_ops = {
 	.name          = "repl_meta_data",
 	.add           = replmd_add,

Modified: branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/samldb.c
===================================================================
--- branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/samldb.c	2007-01-06 01:10:36 UTC (rev 20579)
+++ branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/samldb.c	2007-01-06 01:13:59 UTC (rev 20580)
@@ -680,6 +680,11 @@
 		return ldb_next_request(module, req);
 	}
 
+	if (get_control_from_list(req->controls, DSDB_CONTROL_REPLICATED_OBJECT_OID)) {
+		/* if it's a replicated object we have nothing to do */
+		return ldb_next_request(module, req);
+	}
+
 	/* is user or computer? */
 	if ((samdb_find_attribute(module->ldb, msg, "objectclass", "user") != NULL) ||
 	    (samdb_find_attribute(module->ldb, msg, "objectclass", "computer") != NULL)) {

Modified: branches/SAMBA_4_0/source/dsdb/samdb/samdb.h
===================================================================
--- branches/SAMBA_4_0/source/dsdb/samdb/samdb.h	2007-01-06 01:10:36 UTC (rev 20579)
+++ branches/SAMBA_4_0/source/dsdb/samdb/samdb.h	2007-01-06 01:13:59 UTC (rev 20580)
@@ -29,6 +29,11 @@
 struct drsuapi_DsReplicaOIDMapping_Ctr;
 struct drsuapi_DsReplicaAttribute;
 
+#define DSDB_CONTROL_REPLICATED_OBJECT_OID "1.3.6.1.4.1.7165.4.3.1"
+struct dsdb_control_replicated_object {
+	uint8_t __dummy;
+};
+
 #include "librpc/gen_ndr/security.h"
 #include "lib/ldb/include/ldb.h"
 #include "librpc/gen_ndr/samr.h"

Modified: branches/SAMBA_4_0/source/torture/libnet/libnet_BecomeDC.c
===================================================================
--- branches/SAMBA_4_0/source/torture/libnet/libnet_BecomeDC.c	2007-01-06 01:10:36 UTC (rev 20579)
+++ branches/SAMBA_4_0/source/torture/libnet/libnet_BecomeDC.c	2007-01-06 01:13:59 UTC (rev 20580)
@@ -182,16 +182,16 @@
 		"                                \"server_sort\",\n"
 		"                                \"extended_dn\",\n"
 		"                                \"asq\",\n"
-		"                                //\"samldb\",should only handle originating changes...\n"
+		"                                \"samldb\",\n"
 		"                                \"password_hash\",\n"
 		"                                \"operational\",\n"
 		"                                \"objectclass\",\n"
 		"                                \"rdn_name\",\n"
 		"                                \"partition\");\n"
 		"subobj.MODULES_LIST = join(\",\", modules_list);\n"
-		"subobj.DOMAINDN_MOD = \"objectguid\";\n"
-		"subobj.CONFIGDN_MOD = \"objectguid\";\n"
-		"subobj.SCHEMADN_MOD = \"objectguid\";\n"
+		"subobj.DOMAINDN_MOD = \"repl_meta_data\";\n"
+		"subobj.CONFIGDN_MOD = \"repl_meta_data\";\n"
+		"subobj.SCHEMADN_MOD = \"repl_meta_data\";\n"
 		"\n"
 		"var paths = provision_default_paths(subobj);\n"
 		"paths.samdb = \"%s\";\n"
@@ -265,6 +265,9 @@
 	struct drsuapi_DsReplicaMetaData *name_d;
 	struct replPropertyMetaData1 *rdn_m;
 	struct drsuapi_DsReplicaObjMetaData *rdn_mc;
+	struct ldb_request *req;
+	struct ldb_control **ctrls;
+	struct dsdb_control_replicated_object *ctrl;
 	int ret;
 
 	if (!obj->object.identifier) {
@@ -424,8 +427,38 @@
 		NDR_PRINT_DEBUG(drsuapi_DsReplicaObjMetaDataCtr, &mdc);
 	}
 
-	ret = ldb_add(s->ldb, msg);
+	/*
+	 * apply the record to the ldb
+	 * using an ldb_control so indicate
+	 * that it's a replicated change
+	 */
+	ret = ldb_msg_sanity_check(s->ldb, msg);
 	if (ret != LDB_SUCCESS) {
+		return WERR_FOOBAR;
+	}
+	ctrls = talloc_array(msg, struct ldb_control *, 2);
+	W_ERROR_HAVE_NO_MEMORY(ctrls);
+	ctrls[0] = talloc(ctrls, struct ldb_control);
+	W_ERROR_HAVE_NO_MEMORY(ctrls[0]);
+	ctrls[1] = NULL;
+
+	ctrl = talloc(ctrls, struct dsdb_control_replicated_object);
+	W_ERROR_HAVE_NO_MEMORY(ctrl);
+	ctrls[0]->oid		= DSDB_CONTROL_REPLICATED_OBJECT_OID;
+	ctrls[0]->critical	= True;
+	ctrls[0]->data		= ctrl;
+
+	ret = ldb_build_add_req(&req, s->ldb, msg, msg, ctrls, NULL, NULL);
+	if (ret != LDB_SUCCESS) {
+		return WERR_FOOBAR;
+	}
+	ldb_set_timeout(s->ldb, req, 0); /* use default timeout */
+	ret = ldb_request(s->ldb, req);
+	if (ret == LDB_SUCCESS) {
+		ret = ldb_wait(req->handle, LDB_WAIT_ALL);
+	}
+	talloc_free(req);
+	if (ret != LDB_SUCCESS) {
 		if (ret == LDB_ERR_ENTRY_ALREADY_EXISTS) {
 			DEBUG(0,("record exists (ignored): %s: %d\n",
 				obj->object.identifier->dn, ret));



More information about the samba-cvs mailing list