svn commit: samba r8740 - in branches/SAMBA_4_0: source/dsdb/samdb/ldb_modules source/lib/ldb/modules source/setup testprogs/ejs

abartlet at samba.org abartlet at samba.org
Mon Jul 25 01:17:12 GMT 2005


Author: abartlet
Date: 2005-07-25 01:17:09 +0000 (Mon, 25 Jul 2005)
New Revision: 8740

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

Log:
Extend the rdn_name module to handle adding the rdn as an attribute.  ie:

dn: cn=foo,ou=bar
objectClass: person

implies

dn: cn=foo,ou=bar
objectClass: person
cn: foo
(as well as a pile more default attributes)

We also correct the case in the attirbute to match that in the DN
(win2k3 behaviour) and I have a testsuite (in ejs) to prove it.

This module also found a bug in our provision.ldif, so and reduces
code complexity in the samdb module.

Andrew Bartlett


Added:
   branches/SAMBA_4_0/testprogs/ejs/ldap.js
Modified:
   branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/samldb.c
   branches/SAMBA_4_0/source/lib/ldb/modules/rdn_name.c
   branches/SAMBA_4_0/source/setup/provision.ldif
   branches/SAMBA_4_0/testprogs/ejs/ldb.js


Changeset:
Modified: branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/samldb.c
===================================================================
--- branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/samldb.c	2005-07-24 22:24:46 UTC (rev 8739)
+++ branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/samldb.c	2005-07-25 01:17:09 UTC (rev 8740)
@@ -410,17 +410,6 @@
 		return NULL;
 	}
 
-	if ((attribute = samldb_find_attribute(msg2, "cn", NULL)) != NULL) {
-		if (strcasecmp(rdn->value.data, attribute->values[0].data) != 0) {
-			ldb_debug(module->ldb, LDB_DEBUG_FATAL, "samldb_fill_group_object: Bad Attribute Syntax for CN\n");
-			return NULL;
-		}
-	} else { /* FIXME: remove this if ldb supports natively aliasing between the rdn and the "cn" attribute */
-		if ( ldb_msg_add_value(module->ldb, msg2, "cn", &rdn->value)) {
-			return NULL;
-		}
-	}
-
 	if ((attribute = samldb_find_attribute(msg2, "objectSid", NULL)) == NULL ) {
 		struct dom_sid *sid = samldb_get_new_sid(module, msg2, msg2->dn);
 		if (sid == NULL) {
@@ -481,7 +470,7 @@
 		return NULL;
 	}
 	if (strcasecmp(rdn->name, "cn") != 0) {
-		ldb_debug(module->ldb, LDB_DEBUG_FATAL, "samldb_fill_user_or_computer_object: Bad RDN (%s) for group!\n", rdn->name);
+		ldb_debug(module->ldb, LDB_DEBUG_FATAL, "samldb_fill_user_or_computer_object: Bad RDN (%s) for user/computer!\n", rdn->name);
 		return NULL;
 	}
 
@@ -490,17 +479,6 @@
 		return NULL;
 	}
 
-	if ((attribute = samldb_find_attribute(msg2, "cn", NULL)) != NULL) {
-		if (strcasecmp(rdn->value.data, attribute->values[0].data) != 0) {
-			ldb_debug(module->ldb, LDB_DEBUG_FATAL, "samldb_fill_group_object: Bad Attribute Syntax for CN\n");
-			return NULL;
-		}
-	} else { /* FIXME: remove this if ldb supports natively aliasing between the rdn and the "cn" attribute */
-		if ( ldb_msg_add_value(module->ldb, msg2, "cn", &rdn->value)) {
-			return NULL;
-		}
-	}
-
 	if ((attribute = samldb_find_attribute(msg2, "objectSid", NULL)) == NULL ) {
 		struct dom_sid *sid;
 		sid = samldb_get_new_sid(module, msg2, msg2->dn);

Modified: branches/SAMBA_4_0/source/lib/ldb/modules/rdn_name.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/modules/rdn_name.c	2005-07-24 22:24:46 UTC (rev 8739)
+++ branches/SAMBA_4_0/source/lib/ldb/modules/rdn_name.c	2005-07-25 01:17:09 UTC (rev 8740)
@@ -88,10 +88,12 @@
 /* add_record: add crateTimestamp/modifyTimestamp attributes */
 static int rdn_name_add_record(struct ldb_module *module, const struct ldb_message *msg)
 {
+	struct private_data *data = (struct private_data *)module->private_data;
+
 	struct ldb_message *msg2;
 	struct ldb_message_element *attribute;
 	struct ldb_dn_component *rdn;
-	int ret, i;
+	int i, ret;
 
 	ldb_debug(module->ldb, LDB_DEBUG_TRACE, "rdn_name_add_record\n");
 
@@ -126,6 +128,29 @@
 		return -1;
 	}
 
+	attribute = rdn_name_find_attribute(msg2, rdn->name);
+
+	if (!attribute) {
+		if (ldb_msg_add_value(module->ldb, msg2, rdn->name, &rdn->value) != 0) {
+			return -1;
+		}
+	} else {
+		const struct ldb_attrib_handler *handler
+			= ldb_attrib_handler(module->ldb, rdn->name);
+		for (i=0; i < attribute->num_values; i++) {
+			if (handler->comparison_fn(module->ldb, msg2, &rdn->value, &attribute->values[i]) == 0) {
+				/* overwrite so it matches in case */
+				attribute->values[i] = rdn->value;
+				break;
+			}
+		}
+		if (i == attribute->num_values) {
+			data->error_string = talloc_asprintf(data, "RDN mismatch on %s: %s", msg2->dn, rdn->name);
+			ldb_debug(module->ldb, LDB_DEBUG_FATAL, "%s\n", data->error_string);
+			return -1;
+		}
+	}
+
 	ret = ldb_next_add_record(module, msg2);
 	talloc_free(msg2);
 

Modified: branches/SAMBA_4_0/source/setup/provision.ldif
===================================================================
--- branches/SAMBA_4_0/source/setup/provision.ldif	2005-07-24 22:24:46 UTC (rev 8739)
+++ branches/SAMBA_4_0/source/setup/provision.ldif	2005-07-25 01:17:09 UTC (rev 8740)
@@ -713,7 +713,7 @@
 dn: CN=${DEFAULTSITE},CN=Sites,CN=Configuration,${BASEDN}
 objectClass: top
 objectClass: site
-cn: Sites
+cn: ${DEFAULTSITE}
 instanceType: 4
 uSNCreated: ${USN}
 uSNChanged: ${USN}

Added: branches/SAMBA_4_0/testprogs/ejs/ldap.js
===================================================================
--- branches/SAMBA_4_0/testprogs/ejs/ldap.js	2005-07-24 22:24:46 UTC (rev 8739)
+++ branches/SAMBA_4_0/testprogs/ejs/ldap.js	2005-07-25 01:17:09 UTC (rev 8740)
@@ -0,0 +1,56 @@
+#!/bin/sh
+exec smbscript "$0" ${1+"$@"}
+/*
+	test certin LDAP behaviours
+*/
+
+var ldb = ldb_init();
+
+var options = new Object();
+
+ok = GetOptions(ARGV, options,
+		"POPT_AUTOHELP",
+		"POPT_COMMON_SAMBA",
+		"POPT_COMMON_CREDENTIALS");
+if (ok == false) {
+   println("Failed to parse options: " + options.ERROR);
+   return -1;
+}
+
+if (options.ARGV.length != 2) {
+   println("Usage: ldap.js <BASEDN> <HOST>");
+   return -1;
+}
+
+var base_dn = options.ARGV[0];
+var host = options.ARGV[1];
+
+function basic_tests(ldb, base_dn)
+{
+	println("Running basic tests");
+
+	ldb.del("cn=ldaptestuser,cn=users," + base_dn);
+
+	ok = ldb.add("
+dn: cn=ldaptestuser,cn=users," + base_dn + "
+objectClass: user
+objectClass: person
+cn: LDAPtestUSER
+");
+	assert(ok);
+
+	println("Testing ldb.search");
+	var res = ldb.search("(&(cn=ldaptestuser)(objectClass=user))");
+
+	assert(res[0].dn == "cn=ldaptestuser,cn=users," + base_dn);
+	assert(res[0].cn == "ldaptestuser");
+	assert(res[0].name == "ldaptestuser");
+	assert(res[0].objectGUID != undefined);
+	assert(res[0].whenCreated != undefined);
+
+}
+
+var ok = ldb.connect("ldap://" + host);
+basic_tests(ldb, base_dn)
+
+return 0;


Property changes on: branches/SAMBA_4_0/testprogs/ejs/ldap.js
___________________________________________________________________
Name: svn:executable
   + *

Modified: branches/SAMBA_4_0/testprogs/ejs/ldb.js
===================================================================
--- branches/SAMBA_4_0/testprogs/ejs/ldb.js	2005-07-24 22:24:46 UTC (rev 8739)
+++ branches/SAMBA_4_0/testprogs/ejs/ldb.js	2005-07-25 01:17:09 UTC (rev 8740)
@@ -86,6 +86,7 @@
 dn: cn=x9,cn=test
 objectClass: foo
 x: 9
+cn: X9
 ");
 	assert(ok);
 
@@ -94,12 +95,14 @@
 	assert(res[0].createTimestamp != undefined);
 	assert(res[0].whenCreated != undefined);
 	assert(res[0].name == "x8");
+	assert(res[0].cn == "x8");
 
 	var res2 = ldb.search("x=9", NULL, ldb.SCOPE_DEFAULT);
 	assert(res2[0].objectGUID != undefined);
 	assert(res2[0].createTimestamp != undefined);
 	assert(res2[0].whenCreated != undefined);
 	assert(res2[0].name == "x9");
+	assert(res2[0].cn == "x9");
 
 	assert(res[0].objectGUID != res2[0].objectGUID);
 



More information about the samba-cvs mailing list