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) {
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;
}
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);
/* 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");
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);
dn: CN=${DEFAULTSITE},CN=Sites,CN=Configuration,${BASEDN}
objectClass: top
objectClass: site
-cn: Sites
+cn: ${DEFAULTSITE}
instanceType: 4
uSNCreated: ${USN}
uSNChanged: ${USN}
--- /dev/null
+#!/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;
dn: cn=x9,cn=test
objectClass: foo
x: 9
+cn: X9
");
assert(ok);
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);