1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-12 09:18:10 +03:00
samba-mirror/testprogs/ejs/ldap.js
Andrew Bartlett 16d0395047 r25750: Update the objectclass module to improve consistency in Samba4.
The aim here is to ensure that if we have

CN=Users,DC=samba,DC=example,DC=com

that we cannot have a DN of the form

cn=admin ,cn=useRS,DC=samba,DC=example,DC=com

This module pulls apart the DN, fixes up the relative DN part, and
searches for the parent to copy the base from.

I've used the objectclass module, as I intend to also validate the
placement of child objects, by reading the allowedChildClasses virtual
attribute.

In the future, I'll also force the attribute names to be consistant
(using the case from the schema).

Andrew Bartlett
(This used to be commit c0a0c69ac5)
2007-12-21 05:43:43 +01:00

785 lines
26 KiB
JavaScript
Executable File

#!/bin/sh
exec smbscript "$0" ${1+"$@"}
/*
test certin LDAP behaviours
*/
var ldb = ldb_init();
var gc_ldb = ldb_init();
var options = GetOptions(ARGV,
"POPT_AUTOHELP",
"POPT_COMMON_SAMBA",
"POPT_COMMON_CREDENTIALS");
if (options == undefined) {
println("Failed to parse options");
return -1;
}
libinclude("base.js");
if (options.ARGV.length != 1) {
println("Usage: ldap.js <HOST>");
return -1;
}
var host = options.ARGV[0];
function basic_tests(ldb, gc_ldb, base_dn, configuration_dn, schema_dn)
{
println("Running basic tests");
ldb.del("cn=ldaptestuser,cn=users," + base_dn);
var ok = ldb.add("
dn: cn=ldaptestuser,cn=uSers," + base_dn + "
objectClass: user
objectClass: person
cn: LDAPtestUSER
");
if (ok.error != 0) {
ok = ldb.del("cn=ldaptestuser,cn=users," + base_dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
ok = ldb.add("
dn: cn=ldaptestuser,cn=uSers," + base_dn + "
objectClass: user
objectClass: person
cn: LDAPtestUSER
");
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
}
var ok = ldb.add("
dn: cn=ldaptestcomputer,cn=computers," + base_dn + "
objectClass: computer
cn: LDAPtestCOMPUTER
");
if (ok.error != 0) {
ok = ldb.del("cn=ldaptestcomputer,cn=computers," + base_dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
ok = ldb.add("
dn: cn=ldaptestcomputer,cn=computers," + base_dn + "
objectClass: computer
cn: LDAPtestCOMPUTER
");
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
}
var ok = ldb.add("
dn: cn=ldaptest2computer,cn=computers," + base_dn + "
objectClass: computer
cn: LDAPtest2COMPUTER
userAccountControl: 4096
");
if (ok.error != 0) {
ok = ldb.del("cn=ldaptest2computer,cn=computers," + base_dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
ok = ldb.add("
dn: cn=ldaptest2computer,cn=computers," + base_dn + "
objectClass: computer
cn: LDAPtest2COMPUTER
userAccountControl: 4096
");
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
}
ok = ldb.modify("
dn: cn=ldaptest2computer,cn=computers," + base_dn + "
changetype: modify
replace: servicePrincipalName
servicePrincipalName: host/ldaptest2computer
servicePrincipalName: host/ldaptest2computer
servicePrincipalName: cifs/ldaptest2computer
");
//LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS
if (ok.error != 20) {
println("Expected error LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS, got :" + ok.errstr);
assert(ok.error == 20);
}
ok = ldb.add("
dn: cn=ldaptestuser2,cn=useRs," + base_dn + "
objectClass: person
objectClass: user
cn: LDAPtestUSER2
");
if (ok.error != 0) {
ok = ldb.del("cn=ldaptestuser2,cn=users," + base_dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
ok = ldb.add("
dn: cn=ldaptestuser2,cn=useRs," + base_dn + "
objectClass: person
objectClass: user
cn: LDAPtestUSER2
");
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
}
ok = ldb.del("cn=ldaptestuser3,cn=users," + base_dn);
println("Testing Renames");
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);
if (ok.error != 71 && ok.error != 64) {
println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS or LDAP_NAMING_VIOLATION, got: " + ok.errstr);
assert(ok.error == 71 || ok.error == 64);
}
assert(ok.error == 71 || ok.error == 64);
ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser5,cn=users," + base_dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
ok = ldb.del("cn=ldaptestuser5,cn=users," + base_dn);
println("Testing subtree Renames");
ok = ldb.add("
dn: cn=ldaptestcontainer," + base_dn + "
objectClass: container
");
ok = ldb.add("
dn: CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + "
objectClass: person
objectClass: user
cn: LDAPtestUSER4
");
if (ok.error != 0) {
ok = ldb.del("cn=ldaptestuser4,cn=ldaptestcontainer," + base_dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
ok = ldb.add("
dn: CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + "
objectClass: person
objectClass: user
cn: LDAPtestUSER4
");
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
}
println("Testing ldb.rename of cn=ldaptestcontainer," + base_dn + " to cn=ldaptestcontainer2," + base_dn);
ok = ldb.rename("CN=ldaptestcontainer," + base_dn, "CN=ldaptestcontainer2," + base_dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
println("Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user))");
var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))");
if (res.error != 0 || res.msgs.length != 1) {
println("Could not find (&(cn=ldaptestuser4)(objectClass=user))");
assert(res.error == 0);
assert(res.msgs.length == 1);
}
assert(res.msgs[0].dn == ("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn));
println("Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in renamed container");
var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer2," + base_dn, ldb.SCOPE_SUBTREE);
if (res.error != 0 || res.msgs.length != 1) {
println("Could not find (&(cn=ldaptestuser4)(objectClass=user)) under cn=ldaptestcontainer2," + base_dn);
assert(res.error == 0);
assert(res.msgs.length == 1);
}
assert(res.msgs[0].dn == ("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn));
println("Testing delete (should fail, not a leaf node) of renamed cn=ldaptestcontainer2," + base_dn);
ok = ldb.del("cn=ldaptestcontainer2," + base_dn);
if (ok.error != 66) { /* LDB_ERR_NOT_ALLOWED_ON_NON_LEAF */
println(ok.errstr);
assert(ok.error == 66);
}
println("Testing delete of subtree renamed "+res.msgs[0].dn);
ok = ldb.del(res.msgs[0].dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
println("Testing delete of renamed cn=ldaptestcontainer2," + base_dn);
ok = ldb.del("cn=ldaptestcontainer2," + base_dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
ok = ldb.add("
dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
objectClass: user
");
if (ok.error != 0) {
ok = ldb.del("cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
ok = ldb.add("
dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
objectClass: user
");
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
}
ok = ldb.add("
dn: cn=ldaptestutf8user2 èùéìòà ,cn=users," + base_dn + "
objectClass: user
");
if (ok.error != 0) {
ok = ldb.del("cn=ldaptestutf8user2 èùéìòà ,cn=users," + base_dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
ok = ldb.add("
dn: cn=ldaptestutf8user2 èùéìòà ,cn=users," + base_dn + "
objectClass: user
");
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
}
println("Testing ldb.search for (&(cn=ldaptestuser)(objectClass=user))");
var res = ldb.search("(&(cn=ldaptestuser)(objectClass=user))");
if (res.error != 0 || res.msgs.length != 1) {
println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
assert(res.error == 0);
assert(res.msgs.length == 1);
}
assert(res.msgs[0].dn == ("CN=ldaptestuser,CN=Users," + base_dn));
assert(res.msgs[0].cn == "ldaptestuser");
assert(res.msgs[0].name == "ldaptestuser");
assert(res.msgs[0].objectClass[0] == "top");
assert(res.msgs[0].objectClass[1] == "person");
assert(res.msgs[0].objectClass[2] == "organizationalPerson");
assert(res.msgs[0].objectClass[3] == "user");
assert(res.msgs[0].objectGUID != undefined);
assert(res.msgs[0].whenCreated != undefined);
assert(res.msgs[0].objectCategory == ("CN=Person,CN=Schema,CN=Configuration," + base_dn));
assert(res.msgs[0].sAMAccountType == 805306368);
// assert(res[0].userAccountControl == 546);
println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
var res2 = ldb.search("(&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
if (res2.error != 0 || res2.msgs.length != 1) {
println("Could not find (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
assert(res2.error == 0);
assert(res2.msgs.length == 1);
}
assert(res.msgs[0].dn == res2.msgs[0].dn);
println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon))");
var res3 = ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
if (res3.error != 0) {
println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): " + res3.errstr);
assert(res3.error == 0);
} else if (res3.msgs.length != 1) {
println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): matched " + res3.msgs.length);
assert(res3.msgs.length == 1);
}
assert(res.msgs[0].dn == res3.msgs[0].dn);
if (gc_ldb != undefined) {
println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
var res3gc = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
if (res3gc.error != 0) {
println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog: " + res3gc.errstr);
assert(res3gc.error == 0);
} else if (res3gc.msgs.length != 1) {
println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog: matched " + res3gc.msgs.length);
assert(res3gc.msgs.length == 1);
}
assert(res.msgs[0].dn == res3gc.msgs[0].dn);
}
println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in with 'phantom root' control");
var attrs = new Array("cn");
var controls = new Array("search_options:1:2");
var res3control = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
if (res3control.error != 0 || res3control.msgs.length != 1) {
println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
assert(res3control.error == 0);
assert(res3control.msgs.length == 1);
}
assert(res.msgs[0].dn == res3control.msgs[0].dn);
ok = ldb.del(res.msgs[0].dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectClass=user))");
var res = ldb.search("(&(cn=ldaptestcomputer)(objectClass=user))");
if (res.error != 0 || res.msgs.length != 1) {
println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
assert(res.error == 0);
assert(res.msgs.length == 1);
}
assert(res.msgs[0].dn == ("CN=ldaptestcomputer,CN=Computers," + base_dn));
assert(res.msgs[0].cn == "ldaptestcomputer");
assert(res.msgs[0].name == "ldaptestcomputer");
assert(res.msgs[0].objectClass[0] == "top");
assert(res.msgs[0].objectClass[1] == "person");
assert(res.msgs[0].objectClass[2] == "organizationalPerson");
assert(res.msgs[0].objectClass[3] == "user");
assert(res.msgs[0].objectClass[4] == "computer");
assert(res.msgs[0].objectGUID != undefined);
assert(res.msgs[0].whenCreated != undefined);
assert(res.msgs[0].objectCategory == ("CN=Computer,CN=Schema,CN=Configuration," + base_dn));
assert(res.msgs[0].primaryGroupID == 513);
// assert(res.msgs[0].sAMAccountType == 805306368);
// assert(res.msgs[0].userAccountControl == 546);
println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
var res2 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
if (res2.error != 0 || res2.msgs.length != 1) {
println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
assert(res2.error == 0);
assert(res2.msgs.length == 1);
}
assert(res.msgs[0].dn == res2.msgs[0].dn);
if (gc_ldb != undefined) {
println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
var res2gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
if (res2gc.error != 0 || res2gc.msgs.length != 1) {
println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
assert(res2gc.error == 0);
assert(res2gc.msgs.length == 1);
}
assert(res.msgs[0].dn == res2gc.msgs[0].dn);
}
println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
var res3 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
if (res3.error != 0 || res3.msgs.length != 1) {
println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
assert(res3.error == 0);
assert(res3.msgs.length == 1);
}
assert(res.msgs[0].dn == res3.msgs[0].dn);
if (gc_ldb != undefined) {
println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
var res3gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
if (res3gc.error != 0 || res3gc.msgs.length != 1) {
println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
assert(res3gc.error == 0);
assert(res3gc.msgs.length == 1);
}
assert(res.msgs[0].dn == res3gc.msgs[0].dn);
}
println("Testing ldb.search for (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
var res4 = ldb.search("(&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
if (res4.error != 0 || res4.msgs.length != 1) {
println("Could not find (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
assert(res4.error == 0);
assert(res4.msgs.length == 1);
}
assert(res.msgs[0].dn == res4.msgs[0].dn);
println("Testing ldb.search for (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
var res5 = ldb.search("(&(cn=ldaptestcomput*)(objectCategory=compuTER))");
if (res5.error != 0 || res5.msgs.length != 1) {
println("Could not find (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
assert(res5.error == 0);
assert(res5.msgs.length == 1);
}
assert(res.msgs[0].dn == res5.msgs[0].dn);
println("Testing ldb.search for (&(cn=*daptestcomputer)(objectCategory=compuTER))");
var res6 = ldb.search("(&(cn=*daptestcomputer)(objectCategory=compuTER))");
if (res6.error != 0 || res6.msgs.length != 1) {
println("Could not find (&(cn=*daptestcomputer)(objectCategory=compuTER))");
assert(res6.error == 0);
assert(res6.msgs.length == 1);
}
assert(res.msgs[0].dn == res6.msgs[0].dn);
ok = ldb.del(res.msgs[0].dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
println("Testing ldb.search for (&(cn=ldaptest2computer)(objectClass=user))");
var res = ldb.search("(&(cn=ldaptest2computer)(objectClass=user))");
if (res.error != 0 || res.msgs.length != 1) {
println("Could not find (&(cn=ldaptest2computer)(objectClass=user))");
assert(res.error == 0);
assert(res.msgs.length == 1);
}
assert(res.msgs[0].dn == ("CN=ldaptest2computer,CN=Computers," + base_dn));
assert(res.msgs[0].cn == "ldaptest2computer");
assert(res.msgs[0].name == "ldaptest2computer");
assert(res.msgs[0].objectClass[0] == "top");
assert(res.msgs[0].objectClass[1] == "person");
assert(res.msgs[0].objectClass[2] == "organizationalPerson");
assert(res.msgs[0].objectClass[3] == "user");
assert(res.msgs[0].objectClass[4] == "computer");
assert(res.msgs[0].objectGUID != undefined);
assert(res.msgs[0].whenCreated != undefined);
assert(res.msgs[0].objectCategory == "cn=Computer,cn=Schema,cn=Configuration," + base_dn);
assert(res.msgs[0].sAMAccountType == 805306369);
// assert(res.msgs[0].userAccountControl == 4098);
var attrs = new Array("cn", "name", "objectClass", "objectGUID", "whenCreated", "nTSecurityDescriptor");
println("Testing ldb.search for (&(cn=ldaptestUSer2)(objectClass=user))");
var res = ldb.search("(&(cn=ldaptestUSer2)(objectClass=user))", base_dn, ldb.SCOPE_SUBTREE, attrs);
if (res.error != 0 || res.msgs.length != 1) {
println("Could not find (&(cn=ldaptestUSer2)(objectClass=user))");
assert(res.error == 0);
assert(res.msgs.length == 1);
}
assert(res.msgs[0].dn == ("CN=ldaptestuser2,CN=Users," + base_dn));
assert(res.msgs[0].cn == "ldaptestuser2");
assert(res.msgs[0].name == "ldaptestuser2");
assert(res.msgs[0].objectClass[0] == "top");
assert(res.msgs[0].objectClass[1] == "person");
assert(res.msgs[0].objectClass[2] == "organizationalPerson");
assert(res.msgs[0].objectClass[3] == "user");
assert(res.msgs[0].objectGUID != undefined);
assert(res.msgs[0].whenCreated != undefined);
assert(res.msgs[0].nTSecurityDescriptor != undefined);
ok = ldb.del(res.msgs[0].dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
println("Testing ldb.search for (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
if (res.error != 0 || res.msgs.length != 1) {
println("Could not find (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
assert(res.error == 0);
assert(res.msgs.length == 1);
}
assert(res.msgs[0].dn == ("CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn));
assert(res.msgs[0].cn == "ldaptestutf8user èùéìòà");
assert(res.msgs[0].name == "ldaptestutf8user èùéìòà");
assert(res.msgs[0].objectClass[0] == "top");
assert(res.msgs[0].objectClass[1] == "person");
assert(res.msgs[0].objectClass[2] == "organizationalPerson");
assert(res.msgs[0].objectClass[3] == "user");
assert(res.msgs[0].objectGUID != undefined);
assert(res.msgs[0].whenCreated != undefined);
ok = ldb.del(res.msgs[0].dn);
if (ok.error != 0) {
println(ok.errstr);
assert(ok.error == 0);
}
println("Testing ldb.search for (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
if (res.error != 0 || res.msgs.length != 1) {
println("Could not find (expect space collapse, win2k3 fails) (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
} else {
assert(res.msgs[0].dn == ("cn=ldaptestutf8user2 èùéìòà,cn=users," + base_dn));
assert(res.msgs[0].cn == "ldaptestutf8user2 èùéìòà");
}
println("Testing that we can't get at the configuration DN from the main search base");
var attrs = new Array("cn");
var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
assert(res.error == 0);
if (res.msgs.length != 0) {
println("Got configuration DN " + res.msgs[0].dn + " which should not be able to be seen from main search base");
}
assert(res.msgs.length == 0);
println("Testing that we can get at the configuration DN from the main search base on the LDAP port with the 'phantom root' search_options control");
var attrs = new Array("cn");
var controls = new Array("search_options:1:2");
var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
assert(res.error == 0);
assert(res.msgs.length > 0);
if (gc_ldb != undefined) {
println("Testing that we can get at the configuration DN from the main search base on the GC port with the search_options control == 0");
var attrs = new Array("cn");
var controls = new Array("search_options:1:0");
var res = gc_ldb.search("objectClass=crossRef", base_dn, gc_ldb.SCOPE_SUBTREE, attrs, controls);
assert(res.error == 0);
assert(res.msgs.length > 0);
println("Testing that we do find configuration elements in the global catlog");
var attrs = new Array("cn");
var res = gc_ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
assert(res.error == 0);
assert (res.msgs.length > 0);
println("Testing that we do find configuration elements and user elements at the same time");
var attrs = new Array("cn");
var res = gc_ldb.search("(|(objectClass=crossRef)(objectClass=person))", base_dn, ldb.SCOPE_SUBTREE, attrs);
assert(res.error == 0);
assert (res.msgs.length > 0);
println("Testing that we do find configuration elements in the global catlog, with the configuration basedn");
var attrs = new Array("cn");
var res = gc_ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
assert(res.error == 0);
assert (res.msgs.length > 0);
}
println("Testing that we can get at the configuration DN on the main LDAP port");
var attrs = new Array("cn");
var res = ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
assert(res.error == 0);
assert (res.msgs.length > 0);
println("Testing objectCategory canonacolisation");
var attrs = new Array("cn");
var res = ldb.search("objectCategory=ntDsDSA", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
assert(res.error == 0);
if (res.msgs.length == 0) {
println("Didn't find any records with objectCategory=ntDsDSA");
}
assert(res.msgs.length != 0);
var attrs = new Array("cn");
var res = ldb.search("objectCategory=CN=ntDs-DSA," + schema_dn, configuration_dn, ldb.SCOPE_SUBTREE, attrs);
assert(res.error == 0);
if (res.msgs.length == 0) {
println("Didn't find any records with objectCategory=CN=ntDs-DSA," + schema_dn);
}
assert(res.msgs.length != 0);
println("Testing objectClass attribute order on "+ base_dn);
var attrs = new Array("objectClass");
var res = ldb.search("objectClass=domain", base_dn, ldb.SCOPE_BASE, attrs);
assert(res.error == 0);
assert(res.msgs.length == 1);
assert(res.msgs[0].objectClass[0] == "top");
assert(res.msgs[0].objectClass[1] == "domain");
assert(res.msgs[0].objectClass[2] == "domainDNS");
// check enumeration
var attrs = new Array("cn");
println("Testing ldb.search for objectCategory=person");
var res = ldb.search("objectCategory=person", base_dn, ldb.SCOPE_SUBTREE, attrs);
assert(res.error == 0);
assert(res.msgs.length > 0);
var attrs = new Array("cn");
var controls = new Array("domain_scope:1");
println("Testing ldb.search for objectCategory=person with domain scope control");
var res = ldb.search("objectCategory=person", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
assert(res.error == 0);
assert(res.msgs.length > 0);
var attrs = new Array("cn");
println("Testing ldb.search for objectCategory=user");
var res = ldb.search("objectCategory=user", base_dn, ldb.SCOPE_SUBTREE, attrs);
assert(res.error == 0);
assert(res.msgs.length > 0);
var attrs = new Array("cn");
var controls = new Array("domain_scope:1");
println("Testing ldb.search for objectCategory=user with domain scope control");
var res = ldb.search("objectCategory=user", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
assert(res.error == 0);
assert(res.msgs.length > 0);
var attrs = new Array("cn");
println("Testing ldb.search for objectCategory=group");
var res = ldb.search("objectCategory=group", base_dn, ldb.SCOPE_SUBTREE, attrs);
assert(res.error == 0);
assert(res.msgs.length > 0);
var attrs = new Array("cn");
var controls = new Array("domain_scope:1");
println("Testing ldb.search for objectCategory=group with domain scope control");
var res = ldb.search("objectCategory=group", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
assert(res.error == 0);
assert(res.msgs.length > 0);
}
function basedn_tests(ldb, gc_ldb)
{
println("Testing for all rootDSE attributes");
var attrs = new Array();
var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
assert(res.error == 0);
assert(res.msgs.length == 1);
println("Testing for highestCommittedUSN");
var attrs = new Array("highestCommittedUSN");
var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
assert(res.error == 0);
assert(res.msgs.length == 1);
assert(res.msgs[0].highestCommittedUSN != undefined);
assert(res.msgs[0].highestCommittedUSN != 0);
println("Testing for netlogon via LDAP");
var attrs = new Array("netlogon");
var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
assert(res.error == 0);
assert(res.msgs.length == 0);
println("Testing for netlogon and highestCommittedUSN via LDAP");
var attrs = new Array("netlogon", "highestCommittedUSN");
var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
assert(res.error == 0);
assert(res.msgs.length == 0);
}
function find_basedn(ldb)
{
var attrs = new Array("defaultNamingContext");
var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
assert(res.error == 0);
assert(res.msgs.length == 1);
return res.msgs[0].defaultNamingContext;
}
function find_configurationdn(ldb)
{
var attrs = new Array("configurationNamingContext");
var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
assert(res.error == 0);
assert(res.msgs.length == 1);
return res.msgs[0].configurationNamingContext;
}
function find_schemadn(ldb)
{
var attrs = new Array("schemaNamingContext");
var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
assert(res.error == 0);
assert(res.msgs.length == 1);
return res.msgs[0].schemaNamingContext;
}
/* use command line creds if available */
ldb.credentials = options.get_credentials();
gc_ldb.credentials = options.get_credentials();
var ok = ldb.connect("ldap://" + host);
var base_dn = find_basedn(ldb);
var configuration_dn = find_configurationdn(ldb);
var schema_dn = find_schemadn(ldb);
printf("baseDN: %s\n", base_dn);
var ok = gc_ldb.connect("ldap://" + host + ":3268");
if (!ok) {
gc_ldb = undefined;
}
basic_tests(ldb, gc_ldb, base_dn, configuration_dn, schema_dn)
basedn_tests(ldb, gc_ldb)
return 0;