svn commit: samba r23762 - in branches/SAMBA_4_0: source/dsdb/samdb/ldb_modules source/ldap_server source/lib/ldb/ldb_tdb testprogs/ejs

abartlet at samba.org abartlet at samba.org
Mon Jul 9 12:31:37 GMT 2007


Author: abartlet
Date: 2007-07-09 12:31:35 +0000 (Mon, 09 Jul 2007)
New Revision: 23762

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

Log:
Fix DN renames over LDAP, and instrument the partition module.  Add a
test to prove the behaviour of LDAP renames etc.

Fix LDB to return correct error code when failing to rename one DN
onto another.

Andrew Bartlett

Modified:
   branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/partition.c
   branches/SAMBA_4_0/source/ldap_server/ldap_backend.c
   branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c
   branches/SAMBA_4_0/testprogs/ejs/ldap.js


Changeset:
Modified: branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/partition.c
===================================================================
--- branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/partition.c	2007-07-09 09:43:41 UTC (rev 23761)
+++ branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/partition.c	2007-07-09 12:31:35 UTC (rev 23762)
@@ -120,25 +120,6 @@
 	return NULL;
 };
 
-static struct ldb_module *find_backend(struct ldb_module *module, struct ldb_request *req, struct ldb_dn *dn)
-{
-	struct dsdb_control_current_partition *partition;
-	struct partition_private_data *data = talloc_get_type(module->private_data, 
-							      struct partition_private_data);
-
-	/* Skip the lot if 'data' isn't here yet (initialistion) */
-	if (!data) {
-		return module;
-	}
-
-	partition = find_partition(data, dn);
-	if (!partition) {
-		return module;
-	}
-
-	return make_module_for_next_request(req, module->ldb, partition->module);
-};
-
 /*
   fire the caller's callback for every entry, but only send 'done' once.
 */
@@ -442,13 +423,34 @@
 static int partition_rename(struct ldb_module *module, struct ldb_request *req)
 {
 	/* Find backend */
-	struct ldb_module *backend = find_backend(module, req, req->op.rename.olddn);
-	struct ldb_module *backend2 = find_backend(module, req, req->op.rename.newdn);
+	struct dsdb_control_current_partition *backend, *backend2;
+	
+	struct partition_private_data *data = talloc_get_type(module->private_data, 
+							      struct partition_private_data);
 
-	if (backend->next != backend2->next) {
+	/* Skip the lot if 'data' isn't here yet (initialistion) */
+	if (!data) {
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	backend = find_partition(data, req->op.rename.olddn);
+	backend2 = find_partition(data, req->op.rename.newdn);
+
+	if ((backend && !backend2) || (!backend && backend2)) {
 		return LDB_ERR_AFFECTS_MULTIPLE_DSAS;
 	}
 
+	if (backend != backend2) {
+		ldb_asprintf_errstring(module->ldb, 
+				       "Cannot rename from %s in %s to %s in %s: %s",
+				       ldb_dn_get_linearized(req->op.rename.olddn),
+				       ldb_dn_get_linearized(backend->dn),
+				       ldb_dn_get_linearized(req->op.rename.newdn),
+				       ldb_dn_get_linearized(backend2->dn),
+				       ldb_strerror(LDB_ERR_AFFECTS_MULTIPLE_DSAS));
+		return LDB_ERR_AFFECTS_MULTIPLE_DSAS;
+	}
+
 	return partition_replicate(module, req, req->op.rename.olddn);
 }
 

Modified: branches/SAMBA_4_0/source/ldap_server/ldap_backend.c
===================================================================
--- branches/SAMBA_4_0/source/ldap_server/ldap_backend.c	2007-07-09 09:43:41 UTC (rev 23761)
+++ branches/SAMBA_4_0/source/ldap_server/ldap_backend.c	2007-07-09 12:31:35 UTC (rev 23762)
@@ -621,6 +621,7 @@
 		result = LDAP_OTHER;
 		goto reply;
 	}
+	newdn = parentdn;
 
 reply:
 	modifydn_r = ldapsrv_init_reply(call, LDAP_TAG_ModifyDNResponse);

Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c	2007-07-09 09:43:41 UTC (rev 23761)
+++ branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c	2007-07-09 12:31:35 UTC (rev 23762)
@@ -857,9 +857,8 @@
 		goto done;
 	}
 
-	tret = ltdb_add_internal(module, msg);
-	if (tret != LDB_SUCCESS) {
-		ret = LDB_ERR_OPERATIONS_ERROR;
+	ret = ltdb_add_internal(module, msg);
+	if (ret != LDB_SUCCESS) {
 		goto done;
 	}
 

Modified: branches/SAMBA_4_0/testprogs/ejs/ldap.js
===================================================================
--- branches/SAMBA_4_0/testprogs/ejs/ldap.js	2007-07-09 09:43:41 UTC (rev 23761)
+++ branches/SAMBA_4_0/testprogs/ejs/ldap.js	2007-07-09 12:31:35 UTC (rev 23762)
@@ -140,7 +140,61 @@
 		}
 	}
 
+	ok = ldb.del("cn=ldaptestuser3,cn=users," + base_dn);
+
+	ok = ldb.rename("cn=ldaptestuser2,cn=users," + base_dn, "cn=ldaptestuser3,cn=users," + base_dn);
+	if (ok.error != 0) {
+		println("Could not rename cn=ldaptestuser2,cn=users," + base_dn + " into cn=ldaptestuser3,cn=users," + base_dn + ": " + ok.errstr);
+		assert(ok.error == 0);
+	}
+
+	// ensure we cannot add it again
 	ok = ldb.add("
+dn: cn=ldaptestuser3,cn=users," + base_dn + "
+objectClass: person
+objectClass: user
+cn: LDAPtestUSER3
+");
+//LDB_ERR_ENTRY_ALREADY_EXISTS
+	if (ok.error != 68) {
+		println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS, got: " + ok.errstr);
+		assert(ok.error == 68);
+	}
+
+	// rename back
+	ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser2,cn=users," + base_dn);
+	if (ok.error != 0) {
+		println(ok.errstr);
+		assert(ok.error == 0);
+	}
+
+	// ensure we cannnot rename it twice
+	ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser2,cn=users," + base_dn);
+//LDB_ERR_NO_SUCH_OBJECT
+	assert(ok.error == 32);
+
+	// ensure can now use that name
+	ok = ldb.add("
+dn: cn=ldaptestuser3,cn=users," + base_dn + "
+objectClass: person
+objectClass: user
+cn: LDAPtestUSER3
+");
+	
+	// ensure we now cannnot rename
+	ok = ldb.rename("cn=ldaptestuser2,cn=users," + base_dn, "cn=ldaptestuser3,cn=users," + base_dn);
+//LDB_ERR_ENTRY_ALREADY_EXISTS
+	if (ok.error != 68) {
+		println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS, got: " + ok.errstr);
+		assert(ok.error == 68);
+	}
+	assert(ok.error == 68);
+	ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser3,cn=configuration," + base_dn);
+	assert(ok.error == 71);
+
+	ok = ldb.del("cn=ldaptestuser3,cn=users," + base_dn);
+
+	ok = ldb.add("
 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
 objectClass: user
 ");



More information about the samba-cvs mailing list