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);