From 1ace9b6ec0949aea9ca5897724b1acca8eee57d9 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 14 Aug 2006 23:41:10 +0000 Subject: r17543: Patch from Martin Kühl to extend the samba3sam test cases for ldb_map, and to include this into our default 'make test'. (This used to be commit f69a842314b3d5c57c3fa1f5b1bae3ee6d42da2b) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- testprogs/ejs/samba3sam.js | 259 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 259 insertions(+) create mode 100644 testprogs/ejs/samba3sam.js (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js new file mode 100644 index 0000000000..15bcd42632 --- /dev/null +++ b/testprogs/ejs/samba3sam.js @@ -0,0 +1,259 @@ +#!/usr/bin/env smbscript +/* + (C) Jelmer Vernooij 2005 + (C) Martin Kuehl 2006 + Published under the GNU GPL + Sponsored by Google Summer of Code + */ + +var sys; +var ldb = ldb_init(); +var smb3 = ldb_init(); +var smb4 = ldb_init(); +var options = GetOptions(ARGV, "POPT_AUTOHELP", "POPT_COMMON_SAMBA"); +if (options == undefined) { + println("Failed to parse options"); + return -1; +} + +libinclude("base.js"); + +if (options.ARGV.length != 2) { + println("Usage: samba3sam.js "); + return -1; +} + +prefix = options.ARGV[0]; +datadir = options.ARGV[1]; + +function setup_modules(sys, ldb, from, to) { + var ldif = sys.file_load(datadir + "provision_samba3sam.ldif"); + ldif = substitute_var(ldif, from); + assert(ldif != undefined); + var ok = ldb.add(ldif); + assert(ok); + + var ok = ldb.add(" +dn: @MAP=samba3sam +@FROM: " + from.BASEDN + " +@TO: " + to.BASEDN + " + +dn: @MODULES +@LIST: rootdse,paged_results,server_sort,extended_dn,asq,samldb,objectclass,password_hash,operational,objectguid,rdn_name,samba3sam,partition + +dn: @PARTITION +partition: " + from.BASEDN + ":" + from.URL + " +partition: " + to.BASEDN + ":" + to.URL + " +replicateEntries: @SUBCLASSES +replicateEntries: @ATTRIBUTES +replicateEntries: @INDEXLIST +"); + assert(ok); +} + +function setup_data(sys, ldb, remote) { + var ldif = sys.file_load(datadir + "samba3.ldif"); + ldif = substitute_var(ldif, remote); + assert(ldif != undefined); + var ok = ldb.add(ldif); + assert(ok); +} + +function search_tests(ldb) { + println("Looking up by non-mapped attribute"); + var msg = ldb.search("(cn=Administrator)"); + assert(msg.length == 1); + assert(msg[0].cn == "Administrator"); + + println("Looking up by mapped attribute"); + var msg = ldb.search("(name=Backup Operators)"); + assert(msg.length == 1); + assert(msg[0].name == "Backup Operators"); + + println("Looking up by old name of renamed attribute"); + var msg = ldb.search("(displayName=Backup Operators)"); + assert(msg.length == 0); + + println("Looking up mapped entry containing SID"); + var msg = ldb.search("(cn=Replicator)"); + assert(msg.length == 1); + println(msg[0].dn); + assert(msg[0].dn == "cn=Replicator,ou=Groups,sambaDomainName=TESTS,dc=vernstok,dc=nl"); + assert(msg[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); + + println("Checking mapping of objectClass"); + var oc = msg[0].objectClass; + assert(oc != undefined); + for (var i in oc) { + assert(oc[i] == "posixGroup" || oc[i] == "group"); + } + + println("Looking up by objectClass"); + var msg = ldb.search("(|(objectClass=user)(cn=Administrator))"); + assert(msg != undefined); + assert(msg.length == 2); + for (var i = 0; i < msg.length; i++) { + assert((msg[i].dn == "unixName=Administrator,ou=Users,sambaDomainName=TESTS,dc=vernstok,dc=nl") || + (msg[i].dn == "unixName=nobody,ou=Users,sambaDomainName=TESTS,dc=vernstok,dc=nl")); + } +} + +function modify_tests(ldb, remote) { + println("Adding a record that will be fallbacked"); + ok = ldb.add(" +dn: cn=Foo,dc=idealx,dc=org +foo: bar +blah: Blie +cn: Foo +showInAdvancedViewOnly: TRUE +"); + assert(ok); + + println("Checking for existence of record (local)"); + /* TODO: This record must be searched in the local database, which is currently only supported for base searches + * msg = ldb.search("(cn=Foo)", new Array('foo','blah','cn','showInAdvancedViewOnly')); + * TODO: Actually, this version should work as well but doesn't... + * msg = ldb.search("(cn=Foo)", "dc=idealx,dc=org", ldb.LDB_SCOPE_SUBTREE new Array('foo','blah','cn','showInAdvancedViewOnly')); + */ + msg = ldb.search("", "cn=Foo,dc=idealx,dc=org", ldb.LDB_SCOPE_BASE new Array('foo','blah','cn','showInAdvancedViewOnly')); + assert(msg.length == 1); + assert(msg[0].showInAdvancedViewOnly == "TRUE"); + assert(msg[0].foo == "bar"); + assert(msg[0].blah == "Blie"); + + println("Adding record that will be mapped"); + ok = ldb.add(" +dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl +objectClass: user +unixName: bin +unicodePwd: geheim +cn: Niemand +"); + assert(ok); + + println("Checking for existence of record (remote)"); + msg = ldb.search("(unixName=bin)", new Array('unixName','cn','dn', 'unicodePwd')); + assert(msg.length == 1); + assert(msg[0].cn == "Niemand"); + assert(msg[0].unicodePwd == "geheim"); + + println("Checking for existence of record (local && remote)"); + msg = ldb.search("(&(unixName=bin)(unicodePwd=geheim))", new Array('unixName','cn','dn', 'unicodePwd')); + assert(msg.length == 1); // TODO: should check with more records + assert(msg[0].cn == "Niemand"); + assert(msg[0].unixName == "bin"); + assert(msg[0].unicodePwd == "geheim"); + + println("Checking for existence of record (local || remote)"); + msg = ldb.search("(|(unixName=bin)(unicodePwd=geheim))", new Array('unixName','cn','dn', 'unicodePwd')); + assert(msg.length == 1); // TODO: should check with more records + assert(msg[0].cn == "Niemand"); + assert(msg[0].unixName == "bin" || msg[0].unicodePwd == "geheim"); + + println("Checking for data in destination database"); + msg = remote.search("(cn=Niemand)"); + assert(msg.length >= 1); + assert(msg[0].sambaSID == "S-1-5-21-4231626423-2410014848-2360679739-2001"); + assert(msg[0].displayName == "Niemand"); + + println("Adding attribute..."); + ok = ldb.modify(" +dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl +changetype: modify +add: description +description: Blah +"); + assert(ok); + + println("Checking whether changes are still there..."); + msg = ldb.search("(cn=Niemand)"); + assert(msg.length >= 1); + assert(msg[0].cn == "Niemand"); + assert(msg[0].description == "Blah"); + + println("Modifying attribute..."); + ok = ldb.modify(" +dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl +changetype: modify +replace: description +description: Blie +"); + assert(ok); + + println("Checking whether changes are still there..."); + msg = ldb.search("(cn=Niemand)"); + assert(msg.length >= 1); + assert(msg[0].description == "Blie"); + + println("Deleting attribute..."); + ok = ldb.modify(" +dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl +changetype: modify +delete: description +"); + assert(ok); + + println("Checking whether changes are no longer there..."); + msg = ldb.search("(cn=Niemand)"); + assert(msg.length >= 1); + assert(msg[0].description == undefined); + + println("Renaming record..."); + ok = ldb.rename("cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl", "cn=Niemand,dc=vernstok,dc=nl"); + + println("Checking whether DN has changed..."); + msg = ldb.search("(cn=Niemand)"); + assert(msg.length == 1); + assert(msg[0].dn == "cn=Niemand,dc=vernstok,dc=nl"); + + println("Deleting record..."); + ok = ldb.del("cn=Niemand,dc=vernstok,dc=nl"); + assert(ok); + + println("Checking whether record is gone..."); + msg = ldb.search("(cn=Niemand)"); + assert(msg.length == 0); +} + +sys = sys_init(); +var ldbfile = prefix + "test.ldb"; +var ldburl = "tdb://" + ldbfile; + +var samba4 = new Object("samba4 partition info"); +var samba4.FILE = prefix + "samba4.ldb"; +var samba4.URL = "tdb://" + samba4.FILE; +var samba4.BASEDN = "dc=vernstok,dc=nl"; + +var samba3 = new Object("samba3 partition info"); +var samba3.FILE = prefix + "samba3.ldb"; +var samba3.URL = "tdb://" + samba3.FILE; +var samba3.BASEDN = "cn=Samba3Sam," + samba4.BASEDN; + +sys.unlink(ldbfile); +sys.unlink(samba3.FILE); +sys.unlink(samba4.FILE); + +var ok = ldb.connect(ldburl); +assert(ok); +var ok = smb3.connect(samba3.URL); +assert(ok); +var ok = smb4.connect(samba4.URL); +assert(ok); + +setup_data(sys, smb3, samba3); + +setup_modules(sys, ldb, samba4, samba3); + +ldb = ldb_init(); +var ok = ldb.connect(ldburl); +assert(ok); + +search_tests(ldb, smb3); + +modify_tests(ldb, smb3); + +sys.unlink(ldbfile); +sys.unlink(samba3.FILE); +sys.unlink(samba4.FILE); + +return 0; -- cgit From 0572822b0ec0cb33e84eeb1565a502650a0a9e16 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 15 Aug 2006 00:31:39 +0000 Subject: r17544: Add execute bit to js script. Andrew Bartlett (This used to be commit c1349cfd8d7e150489b94ccb005bfdffe88e4697) --- testprogs/ejs/samba3sam.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 testprogs/ejs/samba3sam.js (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js old mode 100644 new mode 100755 -- cgit From 45719b6c80472972d43e9efd64d879448649d225 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Thu, 17 Aug 2006 20:21:14 +0000 Subject: r17597: fix prefix path handling (This used to be commit 25cde0f7300f37fec6c4a897ba0a80a3e5c26e15) --- testprogs/ejs/samba3sam.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js index 15bcd42632..b25ca88d1d 100755 --- a/testprogs/ejs/samba3sam.js +++ b/testprogs/ejs/samba3sam.js @@ -27,7 +27,7 @@ prefix = options.ARGV[0]; datadir = options.ARGV[1]; function setup_modules(sys, ldb, from, to) { - var ldif = sys.file_load(datadir + "provision_samba3sam.ldif"); + var ldif = sys.file_load(datadir + "/" + "provision_samba3sam.ldif"); ldif = substitute_var(ldif, from); assert(ldif != undefined); var ok = ldb.add(ldif); @@ -52,7 +52,7 @@ replicateEntries: @INDEXLIST } function setup_data(sys, ldb, remote) { - var ldif = sys.file_load(datadir + "samba3.ldif"); + var ldif = sys.file_load(datadir + "/" + "samba3.ldif"); ldif = substitute_var(ldif, remote); assert(ldif != undefined); var ok = ldb.add(ldif); @@ -216,16 +216,16 @@ delete: description } sys = sys_init(); -var ldbfile = prefix + "test.ldb"; +var ldbfile = prefix + "/" + "test.ldb"; var ldburl = "tdb://" + ldbfile; var samba4 = new Object("samba4 partition info"); -var samba4.FILE = prefix + "samba4.ldb"; +var samba4.FILE = prefix + "/" + "samba4.ldb"; var samba4.URL = "tdb://" + samba4.FILE; var samba4.BASEDN = "dc=vernstok,dc=nl"; var samba3 = new Object("samba3 partition info"); -var samba3.FILE = prefix + "samba3.ldb"; +var samba3.FILE = prefix + "/" + "samba3.ldb"; var samba3.URL = "tdb://" + samba3.FILE; var samba3.BASEDN = "cn=Samba3Sam," + samba4.BASEDN; -- cgit From c69672dd9880abea579a26c95733e45cd88d0be6 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 17 Aug 2006 22:18:20 +0000 Subject: r17598: Patch from Martin Kühl to update the samba3sam test suite, which contains tests for the samba3sam and ldb_map modules, with a lot of tests for search requests. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The tests add a small set of known records to the database, half of them with only remote data, half of them split across the local and remote backends, and test searching these records by DN, by attribute and with a range of parse trees. This suite should be extensive enough to ensure that behaviour of search requests doesn't break. (This used to be commit 120f7891faf241057457db7234ce381bfe3fd847) --- testprogs/ejs/samba3sam.js | 615 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 570 insertions(+), 45 deletions(-) (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js index b25ca88d1d..bac381fa01 100755 --- a/testprogs/ejs/samba3sam.js +++ b/testprogs/ejs/samba3sam.js @@ -8,58 +8,60 @@ var sys; var ldb = ldb_init(); -var smb3 = ldb_init(); -var smb4 = ldb_init(); var options = GetOptions(ARGV, "POPT_AUTOHELP", "POPT_COMMON_SAMBA"); if (options == undefined) { - println("Failed to parse options"); - return -1; + println("Failed to parse options"); + return -1; } libinclude("base.js"); if (options.ARGV.length != 2) { - println("Usage: samba3sam.js "); - return -1; + println("Usage: samba3sam.js "); + return -1; } -prefix = options.ARGV[0]; -datadir = options.ARGV[1]; +var prefix = options.ARGV[0]; +var datadir = options.ARGV[1]; -function setup_modules(sys, ldb, from, to) { - var ldif = sys.file_load(datadir + "/" + "provision_samba3sam.ldif"); - ldif = substitute_var(ldif, from); +function setup_data(obj, ldif) +{ + assert(ldif != undefined); + ldif = substitute_var(ldif, obj); + assert(ldif != undefined); + var ok = obj.db.add(ldif); + assert(ok); +} + +function setup_modules(ldb, s3, s4, ldif) +{ + assert(ldif != undefined); + ldif = substitute_var(ldif, s4); assert(ldif != undefined); var ok = ldb.add(ldif); assert(ok); - var ok = ldb.add(" + var ldif = " dn: @MAP=samba3sam -@FROM: " + from.BASEDN + " -@TO: " + to.BASEDN + " +@FROM: " + s4.BASEDN + " +@TO: " + s3.BASEDN + " dn: @MODULES @LIST: rootdse,paged_results,server_sort,extended_dn,asq,samldb,objectclass,password_hash,operational,objectguid,rdn_name,samba3sam,partition dn: @PARTITION -partition: " + from.BASEDN + ":" + from.URL + " -partition: " + to.BASEDN + ":" + to.URL + " +partition: " + s4.BASEDN + ":" + s4.url + " +partition: " + s3.BASEDN + ":" + s3.url + " replicateEntries: @SUBCLASSES replicateEntries: @ATTRIBUTES replicateEntries: @INDEXLIST -"); - assert(ok); -} - -function setup_data(sys, ldb, remote) { - var ldif = sys.file_load(datadir + "/" + "samba3.ldif"); - ldif = substitute_var(ldif, remote); - assert(ldif != undefined); +"; var ok = ldb.add(ldif); assert(ok); } -function search_tests(ldb) { +function test_s3sam_search(ldb) +{ println("Looking up by non-mapped attribute"); var msg = ldb.search("(cn=Administrator)"); assert(msg.length == 1); @@ -98,7 +100,8 @@ function search_tests(ldb) { } } -function modify_tests(ldb, remote) { +function test_s3sam_modify(ldb, s3) +{ println("Adding a record that will be fallbacked"); ok = ldb.add(" dn: cn=Foo,dc=idealx,dc=org @@ -139,19 +142,19 @@ cn: Niemand println("Checking for existence of record (local && remote)"); msg = ldb.search("(&(unixName=bin)(unicodePwd=geheim))", new Array('unixName','cn','dn', 'unicodePwd')); - assert(msg.length == 1); // TODO: should check with more records + assert(msg.length == 1); // TODO: should check with more records assert(msg[0].cn == "Niemand"); assert(msg[0].unixName == "bin"); assert(msg[0].unicodePwd == "geheim"); println("Checking for existence of record (local || remote)"); msg = ldb.search("(|(unixName=bin)(unicodePwd=geheim))", new Array('unixName','cn','dn', 'unicodePwd')); - assert(msg.length == 1); // TODO: should check with more records + assert(msg.length == 1); // TODO: should check with more records assert(msg[0].cn == "Niemand"); assert(msg[0].unixName == "bin" || msg[0].unicodePwd == "geheim"); println("Checking for data in destination database"); - msg = remote.search("(cn=Niemand)"); + msg = s3.db.search("(cn=Niemand)"); assert(msg.length >= 1); assert(msg[0].sambaSID == "S-1-5-21-4231626423-2410014848-2360679739-2001"); assert(msg[0].displayName == "Niemand"); @@ -215,45 +218,567 @@ delete: description assert(msg.length == 0); } +function test_map_search(ldb, s3, s4) +{ + println("Running search tests on mapped data"); + var res; + var dn; + var attrs; + + /* Add a set of split records */ + var ldif = " +dn: cn=X,sambaDomainName=TESTS,${BASEDN} +objectClass: user +cn: X +codePage: x +revision: x +objectCategory: x +nextRid: y +lastLogon: x +description: x +objectSid: S-1-5-21-4231626423-2410014848-2360679739-552 +primaryGroupID: 1-5-21-4231626423-2410014848-2360679739-512 + +dn: cn=Y,sambaDomainName=TESTS,${BASEDN} +objectClass: top +cn: Y +codePage: x +revision: x +objectCategory: y +nextRid: y +lastLogon: y +description: x + +dn: cn=Z,sambaDomainName=TESTS,${BASEDN} +objectClass: top +cn: Z +codePage: x +revision: y +objectCategory: z +nextRid: y +lastLogon: z +description: y +"; + ldif = substitute_var(ldif, s4); + assert(ldif != undefined); + var ok = ldb.add(ldif); + assert(ok); + + /* Add a set of remote records */ + var ldif = " +dn: cn=A,sambaDomainName=TESTS,${BASEDN} +objectClass: posixAccount +cn: A +sambaNextRid: x +sambaBadPasswordCount: x +sambaLogonTime: x +description: x +sambaSID: S-1-5-21-4231626423-2410014848-2360679739-552 +sambaPrimaryGroupSID: S-1-5-21-4231626423-2410014848-2360679739-512 + +dn: cn=B,sambaDomainName=TESTS,${BASEDN} +objectClass: top +cn:B +sambaNextRid: x +sambaBadPasswordCount: x +sambaLogonTime: y +description: x + +dn: cn=C,sambaDomainName=TESTS,${BASEDN} +objectClass: top +cn: C +sambaNextRid: x +sambaBadPasswordCount: y +sambaLogonTime: z +description: y +"; + ldif = substitute_var(ldif, s3); + assert(ldif != undefined); + var ok = s3.db.add(ldif); + assert(ok); + + println("Testing search by DN"); + + /* Search remote record by local DN */ + dn = "cn=A,sambaDomainName=TESTS," + s4.BASEDN; + attrs = new Array("objectCategory", "lastLogon"); + res = ldb.search("", dn, ldb.SCOPE_BASE, attrs); + assert(res != undefined); + assert(res.length == 1); + assert(res[0].dn == dn); + assert(res[0].objectCategory == undefined); + assert(res[0].lastLogon == "x"); + + /* Search remote record by remote DN */ + dn = "cn=A,sambaDomainName=TESTS," + s3.BASEDN; + attrs = new Array("objectCategory", "lastLogon", "sambaLogonTime"); + res = s3.db.search("", dn, ldb.SCOPE_BASE, attrs); + assert(res != undefined); + assert(res.length == 1); + assert(res[0].dn == dn); + assert(res[0].objectCategory == undefined); + assert(res[0].lastLogon == undefined); + assert(res[0].sambaLogonTime == "x"); + + /* Search split record by local DN */ + dn = "cn=X,sambaDomainName=TESTS," + s4.BASEDN; + attrs = new Array("objectCategory", "lastLogon"); + res = ldb.search("", dn, ldb.SCOPE_BASE, attrs); + assert(res != undefined); + assert(res.length == 1); + assert(res[0].dn == dn); + assert(res[0].objectCategory == "x"); + assert(res[0].lastLogon == "x"); + + /* Search split record by remote DN */ + dn = "cn=X,sambaDomainName=TESTS," + s3.BASEDN; + attrs = new Array("objectCategory", "lastLogon", "sambaLogonTime"); + res = s3.db.search("", dn, ldb.SCOPE_BASE, attrs); + assert(res != undefined); + assert(res.length == 1); + assert(res[0].dn == dn); + assert(res[0].objectCategory == undefined); + assert(res[0].lastLogon == undefined); + assert(res[0].sambaLogonTime == "x"); + + println("Testing search by attribute"); + + /* Search by ignored attribute */ + attrs = new Array("objectCategory", "lastLogon"); + res = ldb.search("(revision=x)", NULL, ldb. SCOPE_DEFAULT, attrs); + assert(res != undefined); + assert(res.length == 2); + assert(res[0].dn == ("cn=Y,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[0].objectCategory == "y"); + assert(res[0].lastLogon == "y"); + assert(res[1].dn == ("cn=X,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[1].objectCategory == "x"); + assert(res[1].lastLogon == "x"); + + /* Search by kept attribute */ + attrs = new Array("objectCategory", "lastLogon"); + res = ldb.search("(description=y)", NULL, ldb. SCOPE_DEFAULT, attrs); + assert(res != undefined); + assert(res.length == 2); + assert(res[0].dn == ("cn=Z,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[0].objectCategory == "z"); + assert(res[0].lastLogon == "z"); + assert(res[1].dn == ("cn=C,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[1].objectCategory == undefined); + assert(res[1].lastLogon == "z"); + + /* Search by renamed attribute */ + attrs = new Array("objectCategory", "lastLogon"); + res = ldb.search("(badPwdCount=x)", NULL, ldb. SCOPE_DEFAULT, attrs); + assert(res != undefined); + assert(res.length == 2); + assert(res[0].dn == ("cn=B,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[0].objectCategory == undefined); + assert(res[0].lastLogon == "y"); + assert(res[1].dn == ("cn=A,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[1].objectCategory == undefined); + assert(res[1].lastLogon == "x"); + + /* Search by converted attribute */ + attrs = new Array("objectCategory", "lastLogon", "objectSid"); + /* TODO: + Using the SID directly in the parse tree leads to conversion + errors, letting the search fail with no results. + res = ldb.search("(objectSid=S-1-5-21-4231626423-2410014848-2360679739-552)", NULL, ldb. SCOPE_DEFAULT, attrs); + */ + res = ldb.search("(objectSid=*)", NULL, ldb. SCOPE_DEFAULT, attrs); + assert(res != undefined); + assert(res.length == 2); + assert(res[0].dn == ("cn=X,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[0].objectCategory == "x"); + assert(res[0].lastLogon == "x"); + assert(res[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); + assert(res[1].dn == ("cn=A,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[1].objectCategory == undefined); + assert(res[1].lastLogon == "x"); + assert(res[1].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); + + /* Search by generated attribute */ + /* In most cases, this even works when the mapping is missing + * a `convert_operator' by enumerating the remote db. */ + attrs = new Array("objectCategory", "lastLogon", "primaryGroupID"); + res = ldb.search("(primaryGroupID=1-5-21-4231626423-2410014848-2360679739-512)", NULL, ldb. SCOPE_DEFAULT, attrs); + assert(res != undefined); + assert(res.length == 1); + assert(res[0].dn == ("cn=A,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[0].objectCategory == undefined); + assert(res[0].lastLogon == "x"); + assert(res[0].primaryGroupID == "1-5-21-4231626423-2410014848-2360679739-512"); + + /* TODO: There should actually be two results, A and X. The + * primaryGroupID of X seems to get corrupted somewhere, and the + * objectSid isn't available during the generation of remote (!) data, + * which can be observed with the following search. Also note that Xs + * objectSid seems to be fine in the previous search for objectSid... */ + /* + res = ldb.search("(primaryGroupID=*)", NULL, ldb. SCOPE_DEFAULT, attrs); + println(res.length + " results found"); + for (i=0;i Date: Mon, 21 Aug 2006 10:45:58 +0000 Subject: r17661: A patch from Martin Kuehl: This commit extends the samba3sam test suite, which contains tests for the samba3sam and ldb_map modules, with a lot of tests for inbound, i.e. add, modify, rename and delete requests. The tests each add a single record, modify it, rename it, and then delete it, at each step checking that the operations were successful and that the right data went into the right partitions. They are run for an unmapped record, a mapped record with data only in the remote partition, a mapped record with remote data that is later modified to include local data, and a mapped record with data in both the local and remote partitions. It also adds a function to the backend objects that makes construction of DNs for their respective partitions more comfortable. Cheers, Martin (This used to be commit 1ddd06f24d71c606241863cf4fe047833c64a6d2) --- testprogs/ejs/samba3sam.js | 535 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 464 insertions(+), 71 deletions(-) (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js index bac381fa01..217ac6912a 100755 --- a/testprogs/ejs/samba3sam.js +++ b/testprogs/ejs/samba3sam.js @@ -227,7 +227,7 @@ function test_map_search(ldb, s3, s4) /* Add a set of split records */ var ldif = " -dn: cn=X,sambaDomainName=TESTS,${BASEDN} +dn: " + s4.dn("cn=X") + " objectClass: user cn: X codePage: x @@ -239,7 +239,7 @@ description: x objectSid: S-1-5-21-4231626423-2410014848-2360679739-552 primaryGroupID: 1-5-21-4231626423-2410014848-2360679739-512 -dn: cn=Y,sambaDomainName=TESTS,${BASEDN} +dn: " + s4.dn("cn=Y") + " objectClass: top cn: Y codePage: x @@ -249,7 +249,7 @@ nextRid: y lastLogon: y description: x -dn: cn=Z,sambaDomainName=TESTS,${BASEDN} +dn: " + s4.dn("cn=Z") + " objectClass: top cn: Z codePage: x @@ -266,7 +266,7 @@ description: y /* Add a set of remote records */ var ldif = " -dn: cn=A,sambaDomainName=TESTS,${BASEDN} +dn: " + s3.dn("cn=A") + " objectClass: posixAccount cn: A sambaNextRid: x @@ -276,7 +276,7 @@ description: x sambaSID: S-1-5-21-4231626423-2410014848-2360679739-552 sambaPrimaryGroupSID: S-1-5-21-4231626423-2410014848-2360679739-512 -dn: cn=B,sambaDomainName=TESTS,${BASEDN} +dn: " + s3.dn("cn=B") + " objectClass: top cn:B sambaNextRid: x @@ -284,7 +284,7 @@ sambaBadPasswordCount: x sambaLogonTime: y description: x -dn: cn=C,sambaDomainName=TESTS,${BASEDN} +dn: " + s3.dn("cn=C") + " objectClass: top cn: C sambaNextRid: x @@ -300,7 +300,7 @@ description: y println("Testing search by DN"); /* Search remote record by local DN */ - dn = "cn=A,sambaDomainName=TESTS," + s4.BASEDN; + dn = s4.dn("cn=A"); attrs = new Array("objectCategory", "lastLogon"); res = ldb.search("", dn, ldb.SCOPE_BASE, attrs); assert(res != undefined); @@ -310,7 +310,7 @@ description: y assert(res[0].lastLogon == "x"); /* Search remote record by remote DN */ - dn = "cn=A,sambaDomainName=TESTS," + s3.BASEDN; + dn = s3.dn("cn=A"); attrs = new Array("objectCategory", "lastLogon", "sambaLogonTime"); res = s3.db.search("", dn, ldb.SCOPE_BASE, attrs); assert(res != undefined); @@ -321,7 +321,7 @@ description: y assert(res[0].sambaLogonTime == "x"); /* Search split record by local DN */ - dn = "cn=X,sambaDomainName=TESTS," + s4.BASEDN; + dn = s4.dn("cn=X"); attrs = new Array("objectCategory", "lastLogon"); res = ldb.search("", dn, ldb.SCOPE_BASE, attrs); assert(res != undefined); @@ -331,7 +331,7 @@ description: y assert(res[0].lastLogon == "x"); /* Search split record by remote DN */ - dn = "cn=X,sambaDomainName=TESTS," + s3.BASEDN; + dn = s3.dn("cn=X"); attrs = new Array("objectCategory", "lastLogon", "sambaLogonTime"); res = s3.db.search("", dn, ldb.SCOPE_BASE, attrs); assert(res != undefined); @@ -348,10 +348,10 @@ description: y res = ldb.search("(revision=x)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res != undefined); assert(res.length == 2); - assert(res[0].dn == ("cn=Y,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[0].dn == s4.dn("cn=Y")); assert(res[0].objectCategory == "y"); assert(res[0].lastLogon == "y"); - assert(res[1].dn == ("cn=X,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[1].dn == s4.dn("cn=X")); assert(res[1].objectCategory == "x"); assert(res[1].lastLogon == "x"); @@ -360,10 +360,10 @@ description: y res = ldb.search("(description=y)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res != undefined); assert(res.length == 2); - assert(res[0].dn == ("cn=Z,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[0].dn == s4.dn("cn=Z")); assert(res[0].objectCategory == "z"); assert(res[0].lastLogon == "z"); - assert(res[1].dn == ("cn=C,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[1].dn == s4.dn("cn=C")); assert(res[1].objectCategory == undefined); assert(res[1].lastLogon == "z"); @@ -372,10 +372,10 @@ description: y res = ldb.search("(badPwdCount=x)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res != undefined); assert(res.length == 2); - assert(res[0].dn == ("cn=B,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[0].dn == s4.dn("cn=B")); assert(res[0].objectCategory == undefined); assert(res[0].lastLogon == "y"); - assert(res[1].dn == ("cn=A,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[1].dn == s4.dn("cn=A")); assert(res[1].objectCategory == undefined); assert(res[1].lastLogon == "x"); @@ -389,11 +389,11 @@ description: y res = ldb.search("(objectSid=*)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res != undefined); assert(res.length == 2); - assert(res[0].dn == ("cn=X,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[0].dn == s4.dn("cn=X")); assert(res[0].objectCategory == "x"); assert(res[0].lastLogon == "x"); assert(res[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); - assert(res[1].dn == ("cn=A,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[1].dn == s4.dn("cn=A")); assert(res[1].objectCategory == undefined); assert(res[1].lastLogon == "x"); assert(res[1].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); @@ -405,7 +405,7 @@ description: y res = ldb.search("(primaryGroupID=1-5-21-4231626423-2410014848-2360679739-512)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res != undefined); assert(res.length == 1); - assert(res[0].dn == ("cn=A,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[0].dn == s4.dn("cn=A")); assert(res[0].objectCategory == undefined); assert(res[0].lastLogon == "x"); assert(res[0].primaryGroupID == "1-5-21-4231626423-2410014848-2360679739-512"); @@ -437,12 +437,12 @@ description: y res = ldb.search("(objectClass=user)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res != undefined); assert(res.length == 2); - assert(res[0].dn == ("cn=X,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[0].dn == s4.dn("cn=X")); assert(res[0].objectCategory == "x"); assert(res[0].lastLogon == "x"); assert(res[0].objectClass != undefined); assert(res[0].objectClass[3] == "user"); - assert(res[1].dn == ("cn=A,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[1].dn == s4.dn("cn=A")); assert(res[1].objectCategory == undefined); assert(res[1].lastLogon == "x"); assert(res[1].objectClass != undefined); @@ -452,19 +452,19 @@ description: y res = ldb.search("(|(objectClass=user)(badPwdCount=x))", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res != undefined); assert(res.length == 3); - assert(res[0].dn == ("cn=B,sambaDomainName=TESTS," + s4.BASEDN)); + assert(res[0].dn == s4.dn("cn=B")); assert(res[0].objectCategory == undefined); assert(res[0].lastLogon == "y"); assert(res[0].objectClass != undefined); for (i=0;i Date: Wed, 20 Sep 2006 17:19:05 +0000 Subject: r18721: Fix base and samba3sam EJS tests to work without installation. (This used to be commit d062e101664a90f2f7bf0980449f920aa719ee76) --- testprogs/ejs/samba3sam.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js index 217ac6912a..446b39facf 100755 --- a/testprogs/ejs/samba3sam.js +++ b/testprogs/ejs/samba3sam.js @@ -7,7 +7,6 @@ */ var sys; -var ldb = ldb_init(); var options = GetOptions(ARGV, "POPT_AUTOHELP", "POPT_COMMON_SAMBA"); if (options == undefined) { println("Failed to parse options"); @@ -1108,6 +1107,8 @@ function make_dn(rdn) return rdn + ",sambaDomainName=TESTS," + this.BASEDN; } +var ldb = ldb_init(); + sys = sys_init(); var ldbfile = prefix + "/" + "test.ldb"; var ldburl = "tdb://" + ldbfile; -- cgit From adae413042e15e7228bcc25321913b38ae61358a Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 16 Nov 2006 09:16:17 +0000 Subject: r19731: Modify the ldb_map infrustructure to always map from requested attributes to backend (remote) attributes. We can't do a reverse mapping safely where the remote attribute may be a source for multiple local attributes. (We end up with the wrong attributes returned). In doing this, I've modified the samba3sam.js test to be more realistic, and fixed some failures in the handling of primaryGroupID. I've added a new (private) helper function ldb_msg_remove_element() to avoid a double lookup of the element name. I've also re-formatted many of the function headers, to fit into standard editor widths. Andrew Bartlett (This used to be commit 186766e3095e71ba716c69e681592e217a3bc420) --- testprogs/ejs/samba3sam.js | 74 +++++++++++++++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 21 deletions(-) (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js index 446b39facf..076d434360 100755 --- a/testprogs/ejs/samba3sam.js +++ b/testprogs/ejs/samba3sam.js @@ -43,7 +43,7 @@ function setup_modules(ldb, s3, s4, ldif) var ldif = " dn: @MAP=samba3sam @FROM: " + s4.BASEDN + " -@TO: " + s3.BASEDN + " +@TO: sambaDomainName=TESTS," + s3.BASEDN + " dn: @MODULES @LIST: rootdse,paged_results,server_sort,extended_dn,asq,samldb,objectclass,password_hash,operational,objectguid,rdn_name,samba3sam,partition @@ -79,7 +79,7 @@ function test_s3sam_search(ldb) var msg = ldb.search("(cn=Replicator)"); assert(msg.length == 1); println(msg[0].dn); - assert(msg[0].dn == "cn=Replicator,ou=Groups,sambaDomainName=TESTS,dc=vernstok,dc=nl"); + assert(msg[0].dn == "cn=Replicator,ou=Groups,dc=vernstok,dc=nl"); assert(msg[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); println("Checking mapping of objectClass"); @@ -94,30 +94,36 @@ function test_s3sam_search(ldb) assert(msg != undefined); assert(msg.length == 2); for (var i = 0; i < msg.length; i++) { - assert((msg[i].dn == "unixName=Administrator,ou=Users,sambaDomainName=TESTS,dc=vernstok,dc=nl") || - (msg[i].dn == "unixName=nobody,ou=Users,sambaDomainName=TESTS,dc=vernstok,dc=nl")); + assert((msg[i].dn == "unixName=Administrator,ou=Users,dc=vernstok,dc=nl") || + (msg[i].dn == "unixName=nobody,ou=Users,dc=vernstok,dc=nl")); } } function test_s3sam_modify(ldb, s3) { + var msg, ok; println("Adding a record that will be fallbacked"); ok = ldb.add(" -dn: cn=Foo,dc=idealx,dc=org +dn: cn=Foo foo: bar blah: Blie cn: Foo showInAdvancedViewOnly: TRUE "); + if (!ok) { + println(ldb.errstring()); + assert(ok); + } assert(ok); println("Checking for existence of record (local)"); /* TODO: This record must be searched in the local database, which is currently only supported for base searches * msg = ldb.search("(cn=Foo)", new Array('foo','blah','cn','showInAdvancedViewOnly')); * TODO: Actually, this version should work as well but doesn't... - * msg = ldb.search("(cn=Foo)", "dc=idealx,dc=org", ldb.LDB_SCOPE_SUBTREE new Array('foo','blah','cn','showInAdvancedViewOnly')); + * */ - msg = ldb.search("", "cn=Foo,dc=idealx,dc=org", ldb.LDB_SCOPE_BASE new Array('foo','blah','cn','showInAdvancedViewOnly')); + var attrs = new Array('foo','blah','cn','showInAdvancedViewOnly'); + msg = ldb.search("(cn=Foo)", "cn=Foo", ldb.LDB_SCOPE_BASE, attrs); assert(msg.length == 1); assert(msg[0].showInAdvancedViewOnly == "TRUE"); assert(msg[0].foo == "bar"); @@ -125,12 +131,16 @@ showInAdvancedViewOnly: TRUE println("Adding record that will be mapped"); ok = ldb.add(" -dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl +dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl objectClass: user unixName: bin unicodePwd: geheim cn: Niemand "); + if (!ok) { + println(ldb.errstring()); + assert(ok); + } assert(ok); println("Checking for existence of record (remote)"); @@ -148,6 +158,7 @@ cn: Niemand println("Checking for existence of record (local || remote)"); msg = ldb.search("(|(unixName=bin)(unicodePwd=geheim))", new Array('unixName','cn','dn', 'unicodePwd')); + println("got " + msg.length + " replies"); assert(msg.length == 1); // TODO: should check with more records assert(msg[0].cn == "Niemand"); assert(msg[0].unixName == "bin" || msg[0].unicodePwd == "geheim"); @@ -160,11 +171,15 @@ cn: Niemand println("Adding attribute..."); ok = ldb.modify(" -dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl +dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl changetype: modify add: description description: Blah "); + if (!ok) { + println(ldb.errstring()); + assert(ok); + } assert(ok); println("Checking whether changes are still there..."); @@ -175,11 +190,15 @@ description: Blah println("Modifying attribute..."); ok = ldb.modify(" -dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl +dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl changetype: modify replace: description description: Blie "); + if (!ok) { + println(ldb.errstring()); + assert(ok); + } assert(ok); println("Checking whether changes are still there..."); @@ -189,10 +208,14 @@ description: Blie println("Deleting attribute..."); ok = ldb.modify(" -dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl +dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl changetype: modify delete: description "); + if (!ok) { + println(ldb.errstring()); + assert(ok); + } assert(ok); println("Checking whether changes are no longer there..."); @@ -201,19 +224,23 @@ delete: description assert(msg[0].description == undefined); println("Renaming record..."); - ok = ldb.rename("cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl", "cn=Niemand,dc=vernstok,dc=nl"); + ok = ldb.rename("cn=Niemand,cn=Users,dc=vernstok,dc=nl", "cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); + assert(ok); println("Checking whether DN has changed..."); - msg = ldb.search("(cn=Niemand)"); + msg = ldb.search("(cn=Niemand2)"); assert(msg.length == 1); - assert(msg[0].dn == "cn=Niemand,dc=vernstok,dc=nl"); + assert(msg[0].dn == "cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); println("Deleting record..."); - ok = ldb.del("cn=Niemand,dc=vernstok,dc=nl"); - assert(ok); + ok = ldb.del("cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); + if (!ok) { + println(ldb.errstring()); + assert(ok); + } println("Checking whether record is gone..."); - msg = ldb.search("(cn=Niemand)"); + msg = ldb.search("(cn=Niemand2)"); assert(msg.length == 0); } @@ -401,13 +428,13 @@ description: y /* In most cases, this even works when the mapping is missing * a `convert_operator' by enumerating the remote db. */ attrs = new Array("objectCategory", "lastLogon", "primaryGroupID"); - res = ldb.search("(primaryGroupID=1-5-21-4231626423-2410014848-2360679739-512)", NULL, ldb. SCOPE_DEFAULT, attrs); + res = ldb.search("(primaryGroupID=512)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res != undefined); assert(res.length == 1); assert(res[0].dn == s4.dn("cn=A")); assert(res[0].objectCategory == undefined); assert(res[0].lastLogon == "x"); - assert(res[0].primaryGroupID == "1-5-21-4231626423-2410014848-2360679739-512"); + assert(res[0].primaryGroupID == "512"); /* TODO: There should actually be two results, A and X. The * primaryGroupID of X seems to get corrupted somewhere, and the @@ -1107,6 +1134,11 @@ function make_dn(rdn) return rdn + ",sambaDomainName=TESTS," + this.BASEDN; } +function make_s4dn(rdn) +{ + return rdn + "," + this.BASEDN; +} + var ldb = ldb_init(); sys = sys_init(); @@ -1118,12 +1150,12 @@ samba4.file = prefix + "/" + "samba4.ldb"; samba4.url = "tdb://" + samba4.file; samba4.BASEDN = "dc=vernstok,dc=nl"; samba4.db = ldb_init(); -samba4.dn = make_dn; +samba4.dn = make_s4dn; var samba3 = new Object("samba3 partition info"); samba3.file = prefix + "/" + "samba3.ldb"; samba3.url = "tdb://" + samba3.file; -samba3.BASEDN = "cn=Samba3Sam," + samba4.BASEDN; +samba3.BASEDN = "cn=Samba3Sam"; samba3.db = ldb_init(); samba3.dn = make_dn; -- cgit From 42fcb90e7239ee8edb9b8fd3aeca7d7089952d0e Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 2 Jan 2007 03:36:02 +0000 Subject: r20457: Print more information before asserting (This used to be commit 0b7a5b7284f7820e5b2f48f40e85830243189b58) --- testprogs/ejs/samba3sam.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js index 076d434360..4c6f14b7b1 100755 --- a/testprogs/ejs/samba3sam.js +++ b/testprogs/ejs/samba3sam.js @@ -114,7 +114,6 @@ showInAdvancedViewOnly: TRUE println(ldb.errstring()); assert(ok); } - assert(ok); println("Checking for existence of record (local)"); /* TODO: This record must be searched in the local database, which is currently only supported for base searches @@ -288,7 +287,10 @@ description: y ldif = substitute_var(ldif, s4); assert(ldif != undefined); var ok = ldb.add(ldif); - assert(ok); + if (!ok) { + println(ldb.errstring()); + assert(ok); + } /* Add a set of remote records */ var ldif = " -- cgit From 7ca399c0755e186508a4ed9796cbbbe6f50181e9 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Wed, 14 Feb 2007 21:55:29 +0000 Subject: r21351: Change ldb ejs bindings return codes. We were returning just true/false and discarding error number and string. This checking probably breaks swat, will fix it in next round as swat is what made me look into this as I had no way to get back error messages to show to the users. Simo. (This used to be commit 35886b4ae68be475b0fc8b2689ca04d766661261) --- testprogs/ejs/samba3sam.js | 1035 ++++++++++++++++++++++---------------------- 1 file changed, 524 insertions(+), 511 deletions(-) (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js index 4c6f14b7b1..d69a1c1053 100755 --- a/testprogs/ejs/samba3sam.js +++ b/testprogs/ejs/samba3sam.js @@ -29,7 +29,7 @@ function setup_data(obj, ldif) ldif = substitute_var(ldif, obj); assert(ldif != undefined); var ok = obj.db.add(ldif); - assert(ok); + assert(ok.error == 0); } function setup_modules(ldb, s3, s4, ldif) @@ -38,7 +38,7 @@ function setup_modules(ldb, s3, s4, ldif) ldif = substitute_var(ldif, s4); assert(ldif != undefined); var ok = ldb.add(ldif); - assert(ok); + assert(ok.error == 0); var ldif = " dn: @MAP=samba3sam @@ -56,34 +56,37 @@ replicateEntries: @ATTRIBUTES replicateEntries: @INDEXLIST "; var ok = ldb.add(ldif); - assert(ok); + assert(ok.error == 0); } function test_s3sam_search(ldb) { println("Looking up by non-mapped attribute"); var msg = ldb.search("(cn=Administrator)"); - assert(msg.length == 1); - assert(msg[0].cn == "Administrator"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); + assert(msg.msgs[0].cn == "Administrator"); println("Looking up by mapped attribute"); var msg = ldb.search("(name=Backup Operators)"); - assert(msg.length == 1); - assert(msg[0].name == "Backup Operators"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); + assert(msg.msgs[0].name == "Backup Operators"); println("Looking up by old name of renamed attribute"); var msg = ldb.search("(displayName=Backup Operators)"); - assert(msg.length == 0); + assert(msg.msgs.length == 0); println("Looking up mapped entry containing SID"); var msg = ldb.search("(cn=Replicator)"); - assert(msg.length == 1); - println(msg[0].dn); - assert(msg[0].dn == "cn=Replicator,ou=Groups,dc=vernstok,dc=nl"); - assert(msg[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); + println(msg.msgs[0].dn); + assert(msg.msgs[0].dn == "cn=Replicator,ou=Groups,dc=vernstok,dc=nl"); + assert(msg.msgs[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); println("Checking mapping of objectClass"); - var oc = msg[0].objectClass; + var oc = msg.msgs[0].objectClass; assert(oc != undefined); for (var i in oc) { assert(oc[i] == "posixGroup" || oc[i] == "group"); @@ -91,11 +94,11 @@ function test_s3sam_search(ldb) println("Looking up by objectClass"); var msg = ldb.search("(|(objectClass=user)(cn=Administrator))"); - assert(msg != undefined); - assert(msg.length == 2); - for (var i = 0; i < msg.length; i++) { - assert((msg[i].dn == "unixName=Administrator,ou=Users,dc=vernstok,dc=nl") || - (msg[i].dn == "unixName=nobody,ou=Users,dc=vernstok,dc=nl")); + assert(msg.error == 0); + assert(msg.msgs.length == 2); + for (var i = 0; i < msg.msgs.length; i++) { + assert((msg.msgs[i].dn == "unixName=Administrator,ou=Users,dc=vernstok,dc=nl") || + (msg.msgs[i].dn == "unixName=nobody,ou=Users,dc=vernstok,dc=nl")); } } @@ -110,9 +113,9 @@ blah: Blie cn: Foo showInAdvancedViewOnly: TRUE "); - if (!ok) { - println(ldb.errstring()); - assert(ok); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); } println("Checking for existence of record (local)"); @@ -123,10 +126,11 @@ showInAdvancedViewOnly: TRUE */ var attrs = new Array('foo','blah','cn','showInAdvancedViewOnly'); msg = ldb.search("(cn=Foo)", "cn=Foo", ldb.LDB_SCOPE_BASE, attrs); - assert(msg.length == 1); - assert(msg[0].showInAdvancedViewOnly == "TRUE"); - assert(msg[0].foo == "bar"); - assert(msg[0].blah == "Blie"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); + assert(msg.msgs[0].showInAdvancedViewOnly == "TRUE"); + assert(msg.msgs[0].foo == "bar"); + assert(msg.msgs[0].blah == "Blie"); println("Adding record that will be mapped"); ok = ldb.add(" @@ -136,37 +140,41 @@ unixName: bin unicodePwd: geheim cn: Niemand "); - if (!ok) { - println(ldb.errstring()); - assert(ok); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); } - assert(ok); + assert(ok.error == 0); println("Checking for existence of record (remote)"); msg = ldb.search("(unixName=bin)", new Array('unixName','cn','dn', 'unicodePwd')); - assert(msg.length == 1); - assert(msg[0].cn == "Niemand"); - assert(msg[0].unicodePwd == "geheim"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); + assert(msg.msgs[0].cn == "Niemand"); + assert(msg.msgs[0].unicodePwd == "geheim"); println("Checking for existence of record (local && remote)"); msg = ldb.search("(&(unixName=bin)(unicodePwd=geheim))", new Array('unixName','cn','dn', 'unicodePwd')); - assert(msg.length == 1); // TODO: should check with more records - assert(msg[0].cn == "Niemand"); - assert(msg[0].unixName == "bin"); - assert(msg[0].unicodePwd == "geheim"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); // TODO: should check with more records + assert(msg.msgs[0].cn == "Niemand"); + assert(msg.msgs[0].unixName == "bin"); + assert(msg.msgs[0].unicodePwd == "geheim"); println("Checking for existence of record (local || remote)"); msg = ldb.search("(|(unixName=bin)(unicodePwd=geheim))", new Array('unixName','cn','dn', 'unicodePwd')); - println("got " + msg.length + " replies"); - assert(msg.length == 1); // TODO: should check with more records - assert(msg[0].cn == "Niemand"); - assert(msg[0].unixName == "bin" || msg[0].unicodePwd == "geheim"); + println("got " + msg.msgs.length + " replies"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); // TODO: should check with more records + assert(msg.msgs[0].cn == "Niemand"); + assert(msg.msgs[0].unixName == "bin" || msg.msgs[0].unicodePwd == "geheim"); println("Checking for data in destination database"); msg = s3.db.search("(cn=Niemand)"); - assert(msg.length >= 1); - assert(msg[0].sambaSID == "S-1-5-21-4231626423-2410014848-2360679739-2001"); - assert(msg[0].displayName == "Niemand"); + assert(msg.error == 0); + assert(msg.msgs.length >= 1); + assert(msg.msgs[0].sambaSID == "S-1-5-21-4231626423-2410014848-2360679739-2001"); + assert(msg.msgs[0].displayName == "Niemand"); println("Adding attribute..."); ok = ldb.modify(" @@ -175,17 +183,18 @@ changetype: modify add: description description: Blah "); - if (!ok) { - println(ldb.errstring()); - assert(ok); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); } - assert(ok); + assert(ok.error == 0); println("Checking whether changes are still there..."); msg = ldb.search("(cn=Niemand)"); - assert(msg.length >= 1); - assert(msg[0].cn == "Niemand"); - assert(msg[0].description == "Blah"); + assert(msg.error == 0); + assert(msg.msgs.length >= 1); + assert(msg.msgs[0].cn == "Niemand"); + assert(msg.msgs[0].description == "Blah"); println("Modifying attribute..."); ok = ldb.modify(" @@ -194,16 +203,17 @@ changetype: modify replace: description description: Blie "); - if (!ok) { - println(ldb.errstring()); - assert(ok); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); } - assert(ok); + assert(ok.error == 0); println("Checking whether changes are still there..."); msg = ldb.search("(cn=Niemand)"); - assert(msg.length >= 1); - assert(msg[0].description == "Blie"); + assert(msg.error == 0); + assert(msg.msgs.length >= 1); + assert(msg.msgs[0].description == "Blie"); println("Deleting attribute..."); ok = ldb.modify(" @@ -211,36 +221,39 @@ dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl changetype: modify delete: description "); - if (!ok) { - println(ldb.errstring()); - assert(ok); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); } - assert(ok); + assert(ok.error == 0); println("Checking whether changes are no longer there..."); msg = ldb.search("(cn=Niemand)"); - assert(msg.length >= 1); - assert(msg[0].description == undefined); + assert(msg.error == 0); + assert(msg.msgs.length >= 1); + assert(msg.msgs[0].description == undefined); println("Renaming record..."); ok = ldb.rename("cn=Niemand,cn=Users,dc=vernstok,dc=nl", "cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); - assert(ok); + assert(ok.error == 0); println("Checking whether DN has changed..."); msg = ldb.search("(cn=Niemand2)"); - assert(msg.length == 1); - assert(msg[0].dn == "cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); + assert(msg.msgs[0].dn == "cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); println("Deleting record..."); ok = ldb.del("cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); - if (!ok) { - println(ldb.errstring()); - assert(ok); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); } println("Checking whether record is gone..."); msg = ldb.search("(cn=Niemand2)"); - assert(msg.length == 0); + assert(msg.error == 0); + assert(msg.msgs.length == 0); } function test_map_search(ldb, s3, s4) @@ -287,9 +300,9 @@ description: y ldif = substitute_var(ldif, s4); assert(ldif != undefined); var ok = ldb.add(ldif); - if (!ok) { - println(ldb.errstring()); - assert(ok); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); } /* Add a set of remote records */ @@ -323,7 +336,7 @@ description: y ldif = substitute_var(ldif, s3); assert(ldif != undefined); var ok = s3.db.add(ldif); - assert(ok); + assert(ok.error == 0); println("Testing search by DN"); @@ -331,81 +344,81 @@ description: y dn = s4.dn("cn=A"); attrs = new Array("objectCategory", "lastLogon"); res = ldb.search("", dn, ldb.SCOPE_BASE, attrs); - assert(res != undefined); - assert(res.length == 1); - assert(res[0].dn == dn); - assert(res[0].objectCategory == undefined); - assert(res[0].lastLogon == "x"); + assert(res.error == 0); + assert(res.msgs.length == 1); + assert(res.msgs[0].dn == dn); + assert(res.msgs[0].objectCategory == undefined); + assert(res.msgs[0].lastLogon == "x"); /* Search remote record by remote DN */ dn = s3.dn("cn=A"); attrs = new Array("objectCategory", "lastLogon", "sambaLogonTime"); res = s3.db.search("", dn, ldb.SCOPE_BASE, attrs); - assert(res != undefined); - assert(res.length == 1); - assert(res[0].dn == dn); - assert(res[0].objectCategory == undefined); - assert(res[0].lastLogon == undefined); - assert(res[0].sambaLogonTime == "x"); + assert(res.error == 0); + assert(res.msgs.length == 1); + assert(res.msgs[0].dn == dn); + assert(res.msgs[0].objectCategory == undefined); + assert(res.msgs[0].lastLogon == undefined); + assert(res.msgs[0].sambaLogonTime == "x"); /* Search split record by local DN */ dn = s4.dn("cn=X"); attrs = new Array("objectCategory", "lastLogon"); res = ldb.search("", dn, ldb.SCOPE_BASE, attrs); - assert(res != undefined); - assert(res.length == 1); - assert(res[0].dn == dn); - assert(res[0].objectCategory == "x"); - assert(res[0].lastLogon == "x"); + assert(res.error == 0); + assert(res.msgs.length == 1); + assert(res.msgs[0].dn == dn); + assert(res.msgs[0].objectCategory == "x"); + assert(res.msgs[0].lastLogon == "x"); /* Search split record by remote DN */ dn = s3.dn("cn=X"); attrs = new Array("objectCategory", "lastLogon", "sambaLogonTime"); res = s3.db.search("", dn, ldb.SCOPE_BASE, attrs); - assert(res != undefined); - assert(res.length == 1); - assert(res[0].dn == dn); - assert(res[0].objectCategory == undefined); - assert(res[0].lastLogon == undefined); - assert(res[0].sambaLogonTime == "x"); + assert(res.error == 0); + assert(res.msgs.length == 1); + assert(res.msgs[0].dn == dn); + assert(res.msgs[0].objectCategory == undefined); + assert(res.msgs[0].lastLogon == undefined); + assert(res.msgs[0].sambaLogonTime == "x"); println("Testing search by attribute"); /* Search by ignored attribute */ attrs = new Array("objectCategory", "lastLogon"); res = ldb.search("(revision=x)", NULL, ldb. SCOPE_DEFAULT, attrs); - assert(res != undefined); - assert(res.length == 2); - assert(res[0].dn == s4.dn("cn=Y")); - assert(res[0].objectCategory == "y"); - assert(res[0].lastLogon == "y"); - assert(res[1].dn == s4.dn("cn=X")); - assert(res[1].objectCategory == "x"); - assert(res[1].lastLogon == "x"); + assert(res.error == 0); + assert(res.msgs.length == 2); + assert(res.msgs[0].dn == s4.dn("cn=Y")); + assert(res.msgs[0].objectCategory == "y"); + assert(res.msgs[0].lastLogon == "y"); + assert(res.msgs[1].dn == s4.dn("cn=X")); + assert(res.msgs[1].objectCategory == "x"); + assert(res.msgs[1].lastLogon == "x"); /* Search by kept attribute */ attrs = new Array("objectCategory", "lastLogon"); res = ldb.search("(description=y)", NULL, ldb. SCOPE_DEFAULT, attrs); - assert(res != undefined); - assert(res.length == 2); - assert(res[0].dn == s4.dn("cn=Z")); - assert(res[0].objectCategory == "z"); - assert(res[0].lastLogon == "z"); - assert(res[1].dn == s4.dn("cn=C")); - assert(res[1].objectCategory == undefined); - assert(res[1].lastLogon == "z"); + assert(res.error == 0); + assert(res.msgs.length == 2); + assert(res.msgs[0].dn == s4.dn("cn=Z")); + assert(res.msgs[0].objectCategory == "z"); + assert(res.msgs[0].lastLogon == "z"); + assert(res.msgs[1].dn == s4.dn("cn=C")); + assert(res.msgs[1].objectCategory == undefined); + assert(res.msgs[1].lastLogon == "z"); /* Search by renamed attribute */ attrs = new Array("objectCategory", "lastLogon"); res = ldb.search("(badPwdCount=x)", NULL, ldb. SCOPE_DEFAULT, attrs); - assert(res != undefined); - assert(res.length == 2); - assert(res[0].dn == s4.dn("cn=B")); - assert(res[0].objectCategory == undefined); - assert(res[0].lastLogon == "y"); - assert(res[1].dn == s4.dn("cn=A")); - assert(res[1].objectCategory == undefined); - assert(res[1].lastLogon == "x"); + assert(res.error == 0); + assert(res.msgs.length == 2); + assert(res.msgs[0].dn == s4.dn("cn=B")); + assert(res.msgs[0].objectCategory == undefined); + assert(res.msgs[0].lastLogon == "y"); + assert(res.msgs[1].dn == s4.dn("cn=A")); + assert(res.msgs[1].objectCategory == undefined); + assert(res.msgs[1].lastLogon == "x"); /* Search by converted attribute */ attrs = new Array("objectCategory", "lastLogon", "objectSid"); @@ -415,28 +428,28 @@ description: y res = ldb.search("(objectSid=S-1-5-21-4231626423-2410014848-2360679739-552)", NULL, ldb. SCOPE_DEFAULT, attrs); */ res = ldb.search("(objectSid=*)", NULL, ldb. SCOPE_DEFAULT, attrs); - assert(res != undefined); - assert(res.length == 2); - assert(res[0].dn == s4.dn("cn=X")); - assert(res[0].objectCategory == "x"); - assert(res[0].lastLogon == "x"); - assert(res[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); - assert(res[1].dn == s4.dn("cn=A")); - assert(res[1].objectCategory == undefined); - assert(res[1].lastLogon == "x"); - assert(res[1].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); + assert(res.error == 0); + assert(res.msgs.length == 2); + assert(res.msgs[0].dn == s4.dn("cn=X")); + assert(res.msgs[0].objectCategory == "x"); + assert(res.msgs[0].lastLogon == "x"); + assert(res.msgs[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); + assert(res.msgs[1].dn == s4.dn("cn=A")); + assert(res.msgs[1].objectCategory == undefined); + assert(res.msgs[1].lastLogon == "x"); + assert(res.msgs[1].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); /* Search by generated attribute */ /* In most cases, this even works when the mapping is missing * a `convert_operator' by enumerating the remote db. */ attrs = new Array("objectCategory", "lastLogon", "primaryGroupID"); res = ldb.search("(primaryGroupID=512)", NULL, ldb. SCOPE_DEFAULT, attrs); - assert(res != undefined); - assert(res.length == 1); - assert(res[0].dn == s4.dn("cn=A")); - assert(res[0].objectCategory == undefined); - assert(res[0].lastLogon == "x"); - assert(res[0].primaryGroupID == "512"); + assert(res.error == 0); + assert(res.msgs.length == 1); + assert(res.msgs[0].dn == s4.dn("cn=A")); + assert(res.msgs[0].objectCategory == undefined); + assert(res.msgs[0].lastLogon == "x"); + assert(res.msgs[0].primaryGroupID == "512"); /* TODO: There should actually be two results, A and X. The * primaryGroupID of X seems to get corrupted somewhere, and the @@ -445,10 +458,10 @@ description: y * objectSid seems to be fine in the previous search for objectSid... */ /* res = ldb.search("(primaryGroupID=*)", NULL, ldb. SCOPE_DEFAULT, attrs); - println(res.length + " results found"); - for (i=0;i Date: Thu, 15 Feb 2007 12:51:44 +0000 Subject: r21361: let samba3sam.js pass when we'll use unicodePwd for storing the nt hash jelmer: what should this test really test? metze (This used to be commit c8d903b606afb5dd11b8f1048a36943db02370e0) --- testprogs/ejs/samba3sam.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js index d69a1c1053..e0fab647b5 100755 --- a/testprogs/ejs/samba3sam.js +++ b/testprogs/ejs/samba3sam.js @@ -137,7 +137,7 @@ showInAdvancedViewOnly: TRUE dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl objectClass: user unixName: bin -unicodePwd: geheim +sambaUnicodePwd: geheim cn: Niemand "); if (ok.error != 0) { @@ -147,27 +147,27 @@ cn: Niemand assert(ok.error == 0); println("Checking for existence of record (remote)"); - msg = ldb.search("(unixName=bin)", new Array('unixName','cn','dn', 'unicodePwd')); + msg = ldb.search("(unixName=bin)", new Array('unixName','cn','dn', 'sambaUnicodePwd')); assert(msg.error == 0); assert(msg.msgs.length == 1); assert(msg.msgs[0].cn == "Niemand"); - assert(msg.msgs[0].unicodePwd == "geheim"); + assert(msg.msgs[0].sambaUnicodePwd == "geheim"); println("Checking for existence of record (local && remote)"); - msg = ldb.search("(&(unixName=bin)(unicodePwd=geheim))", new Array('unixName','cn','dn', 'unicodePwd')); + msg = ldb.search("(&(unixName=bin)(sambaUnicodePwd=geheim))", new Array('unixName','cn','dn', 'sambaUnicodePwd')); assert(msg.error == 0); assert(msg.msgs.length == 1); // TODO: should check with more records assert(msg.msgs[0].cn == "Niemand"); assert(msg.msgs[0].unixName == "bin"); - assert(msg.msgs[0].unicodePwd == "geheim"); + assert(msg.msgs[0].sambaUnicodePwd == "geheim"); println("Checking for existence of record (local || remote)"); - msg = ldb.search("(|(unixName=bin)(unicodePwd=geheim))", new Array('unixName','cn','dn', 'unicodePwd')); + msg = ldb.search("(|(unixName=bin)(sambaUnicodePwd=geheim))", new Array('unixName','cn','dn', 'sambaUnicodePwd')); println("got " + msg.msgs.length + " replies"); assert(msg.error == 0); assert(msg.msgs.length == 1); // TODO: should check with more records assert(msg.msgs[0].cn == "Niemand"); - assert(msg.msgs[0].unixName == "bin" || msg.msgs[0].unicodePwd == "geheim"); + assert(msg.msgs[0].unixName == "bin" || msg.msgs[0].sambaUnicodePwd == "geheim"); println("Checking for data in destination database"); msg = s3.db.search("(cn=Niemand)"); -- cgit From e9d19477e43b65f91bd152f5249b684dbefa5cc6 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 21 Jun 2007 10:18:20 +0000 Subject: r23560: - Activate metze's schema modules (from metze's schema-loading-13 patch). - samba3sam.js: rework the samba3sam test to not use objectCategory, as it's has special rules (dnsName a simple match) - ldap.js: Test the ordering of the objectClass attributes for the baseDN - schema_init.c: Load the mayContain and mustContain (and system...) attributes when reading the schema from ldb - To make the schema load not suck in terms of performance, write the schema into a static global variable - ldif_handlers.c: Match objectCategory for equality and canonicolisation based on the loaded schema, not simple tring manipuation - ldb_msg.c: don't duplicate attributes when adding attributes to a list - kludge_acl.c: return allowedAttributesEffective based on schema results and privilages Andrew Bartlett (This used to be commit dcff83ebe463bc7391841f55856d7915c204d000) --- testprogs/ejs/samba3sam.js | 198 ++++++++++++++++++++++----------------------- 1 file changed, 99 insertions(+), 99 deletions(-) (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js index e0fab647b5..5fa527a694 100755 --- a/testprogs/ejs/samba3sam.js +++ b/testprogs/ejs/samba3sam.js @@ -270,7 +270,7 @@ objectClass: user cn: X codePage: x revision: x -objectCategory: x +dnsHostName: x nextRid: y lastLogon: x description: x @@ -282,7 +282,7 @@ objectClass: top cn: Y codePage: x revision: x -objectCategory: y +dnsHostName: y nextRid: y lastLogon: y description: x @@ -292,7 +292,7 @@ objectClass: top cn: Z codePage: x revision: y -objectCategory: z +dnsHostName: z nextRid: y lastLogon: z description: y @@ -342,86 +342,86 @@ description: y /* Search remote record by local DN */ dn = s4.dn("cn=A"); - attrs = new Array("objectCategory", "lastLogon"); + attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("", dn, ldb.SCOPE_BASE, attrs); assert(res.error == 0); assert(res.msgs.length == 1); assert(res.msgs[0].dn == dn); - assert(res.msgs[0].objectCategory == undefined); + assert(res.msgs[0].dnsHostName == undefined); assert(res.msgs[0].lastLogon == "x"); /* Search remote record by remote DN */ dn = s3.dn("cn=A"); - attrs = new Array("objectCategory", "lastLogon", "sambaLogonTime"); + attrs = new Array("dnsHostName", "lastLogon", "sambaLogonTime"); res = s3.db.search("", dn, ldb.SCOPE_BASE, attrs); assert(res.error == 0); assert(res.msgs.length == 1); assert(res.msgs[0].dn == dn); - assert(res.msgs[0].objectCategory == undefined); + assert(res.msgs[0].dnsHostName == undefined); assert(res.msgs[0].lastLogon == undefined); assert(res.msgs[0].sambaLogonTime == "x"); /* Search split record by local DN */ dn = s4.dn("cn=X"); - attrs = new Array("objectCategory", "lastLogon"); + attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("", dn, ldb.SCOPE_BASE, attrs); assert(res.error == 0); assert(res.msgs.length == 1); assert(res.msgs[0].dn == dn); - assert(res.msgs[0].objectCategory == "x"); + assert(res.msgs[0].dnsHostName == "x"); assert(res.msgs[0].lastLogon == "x"); /* Search split record by remote DN */ dn = s3.dn("cn=X"); - attrs = new Array("objectCategory", "lastLogon", "sambaLogonTime"); + attrs = new Array("dnsHostName", "lastLogon", "sambaLogonTime"); res = s3.db.search("", dn, ldb.SCOPE_BASE, attrs); assert(res.error == 0); assert(res.msgs.length == 1); assert(res.msgs[0].dn == dn); - assert(res.msgs[0].objectCategory == undefined); + assert(res.msgs[0].dnsHostName == undefined); assert(res.msgs[0].lastLogon == undefined); assert(res.msgs[0].sambaLogonTime == "x"); println("Testing search by attribute"); /* Search by ignored attribute */ - attrs = new Array("objectCategory", "lastLogon"); + attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("(revision=x)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res.error == 0); assert(res.msgs.length == 2); assert(res.msgs[0].dn == s4.dn("cn=Y")); - assert(res.msgs[0].objectCategory == "y"); + assert(res.msgs[0].dnsHostName == "y"); assert(res.msgs[0].lastLogon == "y"); assert(res.msgs[1].dn == s4.dn("cn=X")); - assert(res.msgs[1].objectCategory == "x"); + assert(res.msgs[1].dnsHostName == "x"); assert(res.msgs[1].lastLogon == "x"); /* Search by kept attribute */ - attrs = new Array("objectCategory", "lastLogon"); + attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("(description=y)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res.error == 0); assert(res.msgs.length == 2); assert(res.msgs[0].dn == s4.dn("cn=Z")); - assert(res.msgs[0].objectCategory == "z"); + assert(res.msgs[0].dnsHostName == "z"); assert(res.msgs[0].lastLogon == "z"); assert(res.msgs[1].dn == s4.dn("cn=C")); - assert(res.msgs[1].objectCategory == undefined); + assert(res.msgs[1].dnsHostName == undefined); assert(res.msgs[1].lastLogon == "z"); /* Search by renamed attribute */ - attrs = new Array("objectCategory", "lastLogon"); + attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("(badPwdCount=x)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res.error == 0); assert(res.msgs.length == 2); assert(res.msgs[0].dn == s4.dn("cn=B")); - assert(res.msgs[0].objectCategory == undefined); + assert(res.msgs[0].dnsHostName == undefined); assert(res.msgs[0].lastLogon == "y"); assert(res.msgs[1].dn == s4.dn("cn=A")); - assert(res.msgs[1].objectCategory == undefined); + assert(res.msgs[1].dnsHostName == undefined); assert(res.msgs[1].lastLogon == "x"); /* Search by converted attribute */ - attrs = new Array("objectCategory", "lastLogon", "objectSid"); + attrs = new Array("dnsHostName", "lastLogon", "objectSid"); /* TODO: Using the SID directly in the parse tree leads to conversion errors, letting the search fail with no results. @@ -431,23 +431,23 @@ description: y assert(res.error == 0); assert(res.msgs.length == 2); assert(res.msgs[0].dn == s4.dn("cn=X")); - assert(res.msgs[0].objectCategory == "x"); + assert(res.msgs[0].dnsHostName == "x"); assert(res.msgs[0].lastLogon == "x"); assert(res.msgs[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); assert(res.msgs[1].dn == s4.dn("cn=A")); - assert(res.msgs[1].objectCategory == undefined); + assert(res.msgs[1].dnsHostName == undefined); assert(res.msgs[1].lastLogon == "x"); assert(res.msgs[1].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); /* Search by generated attribute */ /* In most cases, this even works when the mapping is missing * a `convert_operator' by enumerating the remote db. */ - attrs = new Array("objectCategory", "lastLogon", "primaryGroupID"); + attrs = new Array("dnsHostName", "lastLogon", "primaryGroupID"); res = ldb.search("(primaryGroupID=512)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res.error == 0); assert(res.msgs.length == 1); assert(res.msgs[0].dn == s4.dn("cn=A")); - assert(res.msgs[0].objectCategory == undefined); + assert(res.msgs[0].dnsHostName == undefined); assert(res.msgs[0].lastLogon == "x"); assert(res.msgs[0].primaryGroupID == "512"); @@ -468,23 +468,23 @@ description: y */ /* Search by remote name of renamed attribute */ - attrs = new Array("objectCategory", "lastLogon"); + attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("(sambaBadPasswordCount=*)", "", ldb. SCOPE_DEFAULT, attrs); assert(res.error == 0); assert(res.msgs.length == 0); /* Search by objectClass */ - attrs = new Array("objectCategory", "lastLogon", "objectClass"); + attrs = new Array("dnsHostName", "lastLogon", "objectClass"); res = ldb.search("(objectClass=user)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res.error == 0); assert(res.msgs.length == 2); assert(res.msgs[0].dn == s4.dn("cn=X")); - assert(res.msgs[0].objectCategory == "x"); + assert(res.msgs[0].dnsHostName == "x"); assert(res.msgs[0].lastLogon == "x"); assert(res.msgs[0].objectClass != undefined); assert(res.msgs[0].objectClass[3] == "user"); assert(res.msgs[1].dn == s4.dn("cn=A")); - assert(res.msgs[1].objectCategory == undefined); + assert(res.msgs[1].dnsHostName == undefined); assert(res.msgs[1].lastLogon == "x"); assert(res.msgs[1].objectClass != undefined); assert(res.msgs[1].objectClass[0] == "user"); @@ -494,19 +494,19 @@ description: y assert(res.error == 0); assert(res.msgs.length == 3); assert(res.msgs[0].dn == s4.dn("cn=B")); - assert(res.msgs[0].objectCategory == undefined); + assert(res.msgs[0].dnsHostName == undefined); assert(res.msgs[0].lastLogon == "y"); assert(res.msgs[0].objectClass != undefined); for (i=0;i Date: Tue, 7 Aug 2007 05:58:47 +0000 Subject: r24262: Set the objectCategory by default in the objectclass module, rather than using templates. Modify the samba3sam test to be less fussy, and not use the objectclass module (which requires proper schema stuff now). Andrew Bartlett (This used to be commit 53c248c2645e86fbc8720860aed92a479483b528) --- testprogs/ejs/samba3sam.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js index 5fa527a694..44a1f140b1 100755 --- a/testprogs/ejs/samba3sam.js +++ b/testprogs/ejs/samba3sam.js @@ -46,7 +46,7 @@ dn: @MAP=samba3sam @TO: sambaDomainName=TESTS," + s3.BASEDN + " dn: @MODULES -@LIST: rootdse,paged_results,server_sort,extended_dn,asq,samldb,objectclass,password_hash,operational,objectguid,rdn_name,samba3sam,partition +@LIST: rootdse,paged_results,server_sort,extended_dn,asq,samldb,password_hash,operational,objectguid,rdn_name,samba3sam,partition dn: @PARTITION partition: " + s4.BASEDN + ":" + s4.url + " @@ -482,7 +482,7 @@ description: y assert(res.msgs[0].dnsHostName == "x"); assert(res.msgs[0].lastLogon == "x"); assert(res.msgs[0].objectClass != undefined); - assert(res.msgs[0].objectClass[3] == "user"); + assert(res.msgs[0].objectClass[0] == "user"); assert(res.msgs[1].dn == s4.dn("cn=A")); assert(res.msgs[1].dnsHostName == undefined); assert(res.msgs[1].lastLogon == "x"); @@ -504,7 +504,7 @@ description: y assert(res.msgs[1].dnsHostName == "x"); assert(res.msgs[1].lastLogon == "x"); assert(res.msgs[1].objectClass != undefined); - assert(res.msgs[1].objectClass[3] == "user"); + assert(res.msgs[1].objectClass[0] == "user"); assert(res.msgs[2].dn == s4.dn("cn=A")); assert(res.msgs[2].dnsHostName == undefined); assert(res.msgs[2].lastLogon == "x"); -- cgit From 58f9b5702a432a39a8276367532635300034d180 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 14 Nov 2007 03:51:02 +0100 Subject: r25948: Fix up the samba3sam test (which is very fragile) to work with the new restrictions imposed by the samldb module. This module is worth keeping, because when we go back to do more extensive backend mapping, the testing of this module shows it is still possible. Andrew Bartlett (This used to be commit a10d2554dc1f9b57ce2a98ea20969b3b3c8aec53) --- testprogs/ejs/samba3sam.js | 54 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 12 deletions(-) (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js index 44a1f140b1..e5639b8ec8 100755 --- a/testprogs/ejs/samba3sam.js +++ b/testprogs/ejs/samba3sam.js @@ -263,7 +263,20 @@ function test_map_search(ldb, s3, s4) var dn; var attrs; - /* Add a set of split records */ + + var ldif = " +dn: " + "sambaDomainName=TESTS," + s3.BASEDN + " +objectclass: sambaDomain +objectclass: top +sambaSID: S-1-5-21-4231626423-2410014848-2360679739 +sambaNextRid: 2000 +sambaDomainName: TESTS" + ldif = substitute_var(ldif, s3); + assert(ldif != undefined); + var ok = s3.db.add(ldif); + assert(ok.error == 0); + + printf("Add a set of split records"); var ldif = " dn: " + s4.dn("cn=X") + " objectClass: user @@ -297,6 +310,7 @@ nextRid: y lastLogon: z description: y "; + ldif = substitute_var(ldif, s4); assert(ldif != undefined); var ok = ldb.add(ldif); @@ -305,7 +319,8 @@ description: y assert(ok.error == 0); } - /* Add a set of remote records */ + println("Add a set of remote records"); + var ldif = " dn: " + s3.dn("cn=A") + " objectClass: posixAccount @@ -429,7 +444,7 @@ description: y */ res = ldb.search("(objectSid=*)", NULL, ldb. SCOPE_DEFAULT, attrs); assert(res.error == 0); - assert(res.msgs.length == 2); + assert(res.msgs.length == 3); assert(res.msgs[0].dn == s4.dn("cn=X")); assert(res.msgs[0].dnsHostName == "x"); assert(res.msgs[0].lastLogon == "x"); @@ -610,7 +625,7 @@ description: y attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("(!(revision=x))", NULL, ldb.SCOPE_DEFAULT, attrs); assert(res.error == 0); - assert(res.msgs.length == 4); + assert(res.msgs.length == 5); assert(res.msgs[0].dn == s4.dn("cn=B")); assert(res.msgs[0].dnsHostName == undefined); assert(res.msgs[0].lastLogon == "y"); @@ -628,7 +643,7 @@ description: y attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("(!(description=x))", NULL, ldb.SCOPE_DEFAULT, attrs); assert(res.error == 0); - assert(res.msgs.length == 2); + assert(res.msgs.length == 3); assert(res.msgs[0].dn == s4.dn("cn=Z")); assert(res.msgs[0].dnsHostName == "z"); assert(res.msgs[0].lastLogon == "z"); @@ -640,7 +655,7 @@ description: y attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("(!(&(codePage=x)(revision=x)))", NULL, ldb.SCOPE_DEFAULT, attrs); assert(res.error == 0); - assert(res.msgs.length == 4); + assert(res.msgs.length == 5); assert(res.msgs[0].dn == s4.dn("cn=B")); assert(res.msgs[0].dnsHostName == undefined); assert(res.msgs[0].lastLogon == "y"); @@ -658,7 +673,7 @@ description: y attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("(!(&(lastLogon=x)(description=x)))", NULL, ldb.SCOPE_DEFAULT, attrs); assert(res.error == 0); - assert(res.msgs.length == 4); + assert(res.msgs.length == 5); assert(res.msgs[0].dn == s4.dn("cn=Y")); assert(res.msgs[0].dnsHostName == "y"); assert(res.msgs[0].lastLogon == "y"); @@ -676,7 +691,7 @@ description: y attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("(!(&(codePage=x)(description=x)))", NULL, ldb.SCOPE_DEFAULT, attrs); assert(res.error == 0); - assert(res.msgs.length == 4); + assert(res.msgs.length == 5); assert(res.msgs[0].dn == s4.dn("cn=B")); assert(res.msgs[0].dnsHostName == undefined); assert(res.msgs[0].lastLogon == "y"); @@ -711,7 +726,7 @@ description: y attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("(!(|(badPwdCount=x)(lastLogon=x)))", NULL, ldb.SCOPE_DEFAULT, attrs); assert(res.error == 0); - assert(res.msgs.length == 3); + assert(res.msgs.length == 4); assert(res.msgs[0].dn == s4.dn("cn=Y")); assert(res.msgs[0].dnsHostName == "y"); assert(res.msgs[0].lastLogon == "y"); @@ -726,7 +741,7 @@ description: y attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("(!(|(revision=x)(lastLogon=y)))", NULL, ldb.SCOPE_DEFAULT, attrs); assert(res.error == 0); - assert(res.msgs.length == 3); + assert(res.msgs.length == 4); assert(res.msgs[0].dn == s4.dn("cn=A")); assert(res.msgs[0].dnsHostName == undefined); assert(res.msgs[0].lastLogon == "x"); @@ -737,11 +752,11 @@ description: y assert(res.msgs[2].dnsHostName == undefined); assert(res.msgs[2].lastLogon == "z"); - /* Search by complex parse tree */ + println("Search by complex parse tree"); attrs = new Array("dnsHostName", "lastLogon"); res = ldb.search("(|(&(revision=x)(dnsHostName=x))(!(&(description=x)(nextRid=y)))(badPwdCount=y))", NULL, ldb.SCOPE_DEFAULT, attrs); assert(res.error == 0); - assert(res.msgs.length == 5); + assert(res.msgs.length == 6); assert(res.msgs[0].dn == s4.dn("cn=B")); assert(res.msgs[0].dnsHostName == undefined); assert(res.msgs[0].lastLogon == "y"); @@ -1174,18 +1189,28 @@ samba3.BASEDN = "cn=Samba3Sam"; samba3.db = ldb_init(); samba3.dn = make_dn; +var templates = new Object("templates partition info"); +templates.file = prefix + "/" + "templates.ldb"; +templates.url = "tdb://" + templates.file; +templates.BASEDN = "cn=templates"; +templates.db = ldb_init(); + sys.unlink(ldbfile); sys.unlink(samba3.file); +sys.unlink(templates.file); sys.unlink(samba4.file); var ok = ldb.connect(ldburl); assert(ok); var ok = samba3.db.connect(samba3.url); assert(ok); +var ok = templates.db.connect(templates.url); +assert(ok); var ok = samba4.db.connect(samba4.url); assert(ok); setup_data(samba3, sys.file_load(datadir + "/" + "samba3.ldif")); +setup_data(templates, sys.file_load(datadir + "/" + "provision_samba3sam_templates.ldif")); setup_modules(ldb, samba3, samba4, sys.file_load(datadir + "/" + "provision_samba3sam.ldif")); ldb = ldb_init(); @@ -1197,6 +1222,7 @@ test_s3sam_modify(ldb, samba3); sys.unlink(ldbfile); sys.unlink(samba3.file); +sys.unlink(templates.file); sys.unlink(samba4.file); ldb = ldb_init(); @@ -1205,10 +1231,14 @@ assert(ok); samba3.db = ldb_init(); var ok = samba3.db.connect(samba3.url); assert(ok); +templates.db = ldb_init(); +var ok = templates.db.connect(templates.url); +assert(ok); samba4.db = ldb_init(); var ok = samba4.db.connect(samba4.url); assert(ok); +setup_data(templates, sys.file_load(datadir + "/" + "provision_samba3sam_templates.ldif")); setup_modules(ldb, samba3, samba4, sys.file_load(datadir + "provision_samba3sam.ldif")); ldb = ldb_init(); -- cgit From 0a6dc219559cb6385b6d2c5482e7588184e9ccc8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 11 Feb 2008 13:38:07 +0100 Subject: Remove tests for Samba 3 EJS code. (This used to be commit 7aff2ddd8ca1ff68fc704fdb139d81d6daa51115) --- testprogs/ejs/samba3sam.js | 1255 -------------------------------------------- 1 file changed, 1255 deletions(-) delete mode 100755 testprogs/ejs/samba3sam.js (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js deleted file mode 100755 index e5639b8ec8..0000000000 --- a/testprogs/ejs/samba3sam.js +++ /dev/null @@ -1,1255 +0,0 @@ -#!/usr/bin/env smbscript -/* - (C) Jelmer Vernooij 2005 - (C) Martin Kuehl 2006 - Published under the GNU GPL - Sponsored by Google Summer of Code - */ - -var sys; -var options = GetOptions(ARGV, "POPT_AUTOHELP", "POPT_COMMON_SAMBA"); -if (options == undefined) { - println("Failed to parse options"); - return -1; -} - -libinclude("base.js"); - -if (options.ARGV.length != 2) { - println("Usage: samba3sam.js "); - return -1; -} - -var prefix = options.ARGV[0]; -var datadir = options.ARGV[1]; - -function setup_data(obj, ldif) -{ - assert(ldif != undefined); - ldif = substitute_var(ldif, obj); - assert(ldif != undefined); - var ok = obj.db.add(ldif); - assert(ok.error == 0); -} - -function setup_modules(ldb, s3, s4, ldif) -{ - assert(ldif != undefined); - ldif = substitute_var(ldif, s4); - assert(ldif != undefined); - var ok = ldb.add(ldif); - assert(ok.error == 0); - - var ldif = " -dn: @MAP=samba3sam -@FROM: " + s4.BASEDN + " -@TO: sambaDomainName=TESTS," + s3.BASEDN + " - -dn: @MODULES -@LIST: rootdse,paged_results,server_sort,extended_dn,asq,samldb,password_hash,operational,objectguid,rdn_name,samba3sam,partition - -dn: @PARTITION -partition: " + s4.BASEDN + ":" + s4.url + " -partition: " + s3.BASEDN + ":" + s3.url + " -replicateEntries: @SUBCLASSES -replicateEntries: @ATTRIBUTES -replicateEntries: @INDEXLIST -"; - var ok = ldb.add(ldif); - assert(ok.error == 0); -} - -function test_s3sam_search(ldb) -{ - println("Looking up by non-mapped attribute"); - var msg = ldb.search("(cn=Administrator)"); - assert(msg.error == 0); - assert(msg.msgs.length == 1); - assert(msg.msgs[0].cn == "Administrator"); - - println("Looking up by mapped attribute"); - var msg = ldb.search("(name=Backup Operators)"); - assert(msg.error == 0); - assert(msg.msgs.length == 1); - assert(msg.msgs[0].name == "Backup Operators"); - - println("Looking up by old name of renamed attribute"); - var msg = ldb.search("(displayName=Backup Operators)"); - assert(msg.msgs.length == 0); - - println("Looking up mapped entry containing SID"); - var msg = ldb.search("(cn=Replicator)"); - assert(msg.error == 0); - assert(msg.msgs.length == 1); - println(msg.msgs[0].dn); - assert(msg.msgs[0].dn == "cn=Replicator,ou=Groups,dc=vernstok,dc=nl"); - assert(msg.msgs[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); - - println("Checking mapping of objectClass"); - var oc = msg.msgs[0].objectClass; - assert(oc != undefined); - for (var i in oc) { - assert(oc[i] == "posixGroup" || oc[i] == "group"); - } - - println("Looking up by objectClass"); - var msg = ldb.search("(|(objectClass=user)(cn=Administrator))"); - assert(msg.error == 0); - assert(msg.msgs.length == 2); - for (var i = 0; i < msg.msgs.length; i++) { - assert((msg.msgs[i].dn == "unixName=Administrator,ou=Users,dc=vernstok,dc=nl") || - (msg.msgs[i].dn == "unixName=nobody,ou=Users,dc=vernstok,dc=nl")); - } -} - -function test_s3sam_modify(ldb, s3) -{ - var msg, ok; - println("Adding a record that will be fallbacked"); - ok = ldb.add(" -dn: cn=Foo -foo: bar -blah: Blie -cn: Foo -showInAdvancedViewOnly: TRUE -"); - if (ok.error != 0) { - println(ok.errstr); - assert(ok.error == 0); - } - - println("Checking for existence of record (local)"); - /* TODO: This record must be searched in the local database, which is currently only supported for base searches - * msg = ldb.search("(cn=Foo)", new Array('foo','blah','cn','showInAdvancedViewOnly')); - * TODO: Actually, this version should work as well but doesn't... - * - */ - var attrs = new Array('foo','blah','cn','showInAdvancedViewOnly'); - msg = ldb.search("(cn=Foo)", "cn=Foo", ldb.LDB_SCOPE_BASE, attrs); - assert(msg.error == 0); - assert(msg.msgs.length == 1); - assert(msg.msgs[0].showInAdvancedViewOnly == "TRUE"); - assert(msg.msgs[0].foo == "bar"); - assert(msg.msgs[0].blah == "Blie"); - - println("Adding record that will be mapped"); - ok = ldb.add(" -dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl -objectClass: user -unixName: bin -sambaUnicodePwd: geheim -cn: Niemand -"); - if (ok.error != 0) { - println(ok.errstr); - assert(ok.error == 0); - } - assert(ok.error == 0); - - println("Checking for existence of record (remote)"); - msg = ldb.search("(unixName=bin)", new Array('unixName','cn','dn', 'sambaUnicodePwd')); - assert(msg.error == 0); - assert(msg.msgs.length == 1); - assert(msg.msgs[0].cn == "Niemand"); - assert(msg.msgs[0].sambaUnicodePwd == "geheim"); - - println("Checking for existence of record (local && remote)"); - msg = ldb.search("(&(unixName=bin)(sambaUnicodePwd=geheim))", new Array('unixName','cn','dn', 'sambaUnicodePwd')); - assert(msg.error == 0); - assert(msg.msgs.length == 1); // TODO: should check with more records - assert(msg.msgs[0].cn == "Niemand"); - assert(msg.msgs[0].unixName == "bin"); - assert(msg.msgs[0].sambaUnicodePwd == "geheim"); - - println("Checking for existence of record (local || remote)"); - msg = ldb.search("(|(unixName=bin)(sambaUnicodePwd=geheim))", new Array('unixName','cn','dn', 'sambaUnicodePwd')); - println("got " + msg.msgs.length + " replies"); - assert(msg.error == 0); - assert(msg.msgs.length == 1); // TODO: should check with more records - assert(msg.msgs[0].cn == "Niemand"); - assert(msg.msgs[0].unixName == "bin" || msg.msgs[0].sambaUnicodePwd == "geheim"); - - println("Checking for data in destination database"); - msg = s3.db.search("(cn=Niemand)"); - assert(msg.error == 0); - assert(msg.msgs.length >= 1); - assert(msg.msgs[0].sambaSID == "S-1-5-21-4231626423-2410014848-2360679739-2001"); - assert(msg.msgs[0].displayName == "Niemand"); - - println("Adding attribute..."); - ok = ldb.modify(" -dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl -changetype: modify -add: description -description: Blah -"); - if (ok.error != 0) { - println(ok.errstr); - assert(ok.error == 0); - } - assert(ok.error == 0); - - println("Checking whether changes are still there..."); - msg = ldb.search("(cn=Niemand)"); - assert(msg.error == 0); - assert(msg.msgs.length >= 1); - assert(msg.msgs[0].cn == "Niemand"); - assert(msg.msgs[0].description == "Blah"); - - println("Modifying attribute..."); - ok = ldb.modify(" -dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl -changetype: modify -replace: description -description: Blie -"); - if (ok.error != 0) { - println(ok.errstr); - assert(ok.error == 0); - } - assert(ok.error == 0); - - println("Checking whether changes are still there..."); - msg = ldb.search("(cn=Niemand)"); - assert(msg.error == 0); - assert(msg.msgs.length >= 1); - assert(msg.msgs[0].description == "Blie"); - - println("Deleting attribute..."); - ok = ldb.modify(" -dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl -changetype: modify -delete: description -"); - if (ok.error != 0) { - println(ok.errstr); - assert(ok.error == 0); - } - assert(ok.error == 0); - - println("Checking whether changes are no longer there..."); - msg = ldb.search("(cn=Niemand)"); - assert(msg.error == 0); - assert(msg.msgs.length >= 1); - assert(msg.msgs[0].description == undefined); - - println("Renaming record..."); - ok = ldb.rename("cn=Niemand,cn=Users,dc=vernstok,dc=nl", "cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); - assert(ok.error == 0); - - println("Checking whether DN has changed..."); - msg = ldb.search("(cn=Niemand2)"); - assert(msg.error == 0); - assert(msg.msgs.length == 1); - assert(msg.msgs[0].dn == "cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); - - println("Deleting record..."); - ok = ldb.del("cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); - if (ok.error != 0) { - println(ok.errstr); - assert(ok.error == 0); - } - - println("Checking whether record is gone..."); - msg = ldb.search("(cn=Niemand2)"); - assert(msg.error == 0); - assert(msg.msgs.length == 0); -} - -function test_map_search(ldb, s3, s4) -{ - println("Running search tests on mapped data"); - var res; - var dn; - var attrs; - - - var ldif = " -dn: " + "sambaDomainName=TESTS," + s3.BASEDN + " -objectclass: sambaDomain -objectclass: top -sambaSID: S-1-5-21-4231626423-2410014848-2360679739 -sambaNextRid: 2000 -sambaDomainName: TESTS" - ldif = substitute_var(ldif, s3); - assert(ldif != undefined); - var ok = s3.db.add(ldif); - assert(ok.error == 0); - - printf("Add a set of split records"); - var ldif = " -dn: " + s4.dn("cn=X") + " -objectClass: user -cn: X -codePage: x -revision: x -dnsHostName: x -nextRid: y -lastLogon: x -description: x -objectSid: S-1-5-21-4231626423-2410014848-2360679739-552 -primaryGroupID: 1-5-21-4231626423-2410014848-2360679739-512 - -dn: " + s4.dn("cn=Y") + " -objectClass: top -cn: Y -codePage: x -revision: x -dnsHostName: y -nextRid: y -lastLogon: y -description: x - -dn: " + s4.dn("cn=Z") + " -objectClass: top -cn: Z -codePage: x -revision: y -dnsHostName: z -nextRid: y -lastLogon: z -description: y -"; - - ldif = substitute_var(ldif, s4); - assert(ldif != undefined); - var ok = ldb.add(ldif); - if (ok.error != 0) { - println(ok.errstr); - assert(ok.error == 0); - } - - println("Add a set of remote records"); - - var ldif = " -dn: " + s3.dn("cn=A") + " -objectClass: posixAccount -cn: A -sambaNextRid: x -sambaBadPasswordCount: x -sambaLogonTime: x -description: x -sambaSID: S-1-5-21-4231626423-2410014848-2360679739-552 -sambaPrimaryGroupSID: S-1-5-21-4231626423-2410014848-2360679739-512 - -dn: " + s3.dn("cn=B") + " -objectClass: top -cn:B -sambaNextRid: x -sambaBadPasswordCount: x -sambaLogonTime: y -description: x - -dn: " + s3.dn("cn=C") + " -objectClass: top -cn: C -sambaNextRid: x -sambaBadPasswordCount: y -sambaLogonTime: z -description: y -"; - ldif = substitute_var(ldif, s3); - assert(ldif != undefined); - var ok = s3.db.add(ldif); - assert(ok.error == 0); - - println("Testing search by DN"); - - /* Search remote record by local DN */ - dn = s4.dn("cn=A"); - attrs = new Array("dnsHostName", "lastLogon"); - res = ldb.search("", dn, ldb.SCOPE_BASE, attrs); - assert(res.error == 0); - assert(res.msgs.length == 1); - assert(res.msgs[0].dn == dn); - assert(res.msgs[0].dnsHostName == undefined); - assert(res.msgs[0].lastLogon == "x"); - - /* Search remote record by remote DN */ - dn = s3.dn("cn=A"); - attrs = new Array("dnsHostName", "lastLogon", "sambaLogonTime"); - res = s3.db.search("", dn, ldb.SCOPE_BASE, attrs); - assert(res.error == 0); - assert(res.msgs.length == 1); - assert(res.msgs[0].dn == dn); - assert(res.msgs[0].dnsHostName == undefined); - assert(res.msgs[0].lastLogon == undefined); - assert(res.msgs[0].sambaLogonTime == "x"); - - /* Search split record by local DN */ - dn = s4.dn("cn=X"); - attrs = new Array("dnsHostName", "lastLogon"); - res = ldb.search("", dn, ldb.SCOPE_BASE, attrs); - assert(res.error == 0); - assert(res.msgs.length == 1); - assert(res.msgs[0].dn == dn); - assert(res.msgs[0].dnsHostName == "x"); - assert(res.msgs[0].lastLogon == "x"); - - /* Search split record by remote DN */ - dn = s3.dn("cn=X"); - attrs = new Array("dnsHostName", "lastLogon", "sambaLogonTime"); - res = s3.db.search("", dn, ldb.SCOPE_BASE, attrs); - assert(res.error == 0); - assert(res.msgs.length == 1); - assert(res.msgs[0].dn == dn); - assert(res.msgs[0].dnsHostName == undefined); - assert(res.msgs[0].lastLogon == undefined); - assert(res.msgs[0].sambaLogonTime == "x"); - - println("Testing search by attribute"); - - /* Search by ignored attribute */ - attrs = new Array("dnsHostName", "lastLogon"); - res = ldb.search("(revision=x)", NULL, ldb. SCOPE_DEFAULT, attrs); - assert(res.error == 0); - assert(res.msgs.length == 2); - assert(res.msgs[0].dn == s4.dn("cn=Y")); - assert(res.msgs[0].dnsHostName == "y"); - assert(res.msgs[0].lastLogon == "y"); - assert(res.msgs[1].dn == s4.dn("cn=X")); - assert(res.msgs[1].dnsHostName == "x"); - assert(res.msgs[1].lastLogon == "x"); - - /* Search by kept attribute */ - attrs = new Array("dnsHostName", "lastLogon"); - res = ldb.search("(description=y)", NULL, ldb. SCOPE_DEFAULT, attrs); - assert(res.error == 0); - assert(res.msgs.length == 2); - assert(res.msgs[0].dn == s4.dn("cn=Z")); - assert(res.msgs[0].dnsHostName == "z"); - assert(res.msgs[0].lastLogon == "z"); - assert(res.msgs[1].dn == s4.dn("cn=C")); - assert(res.msgs[1].dnsHostName == undefined); - assert(res.msgs[1].lastLogon == "z"); - - /* Search by renamed attribute */ - attrs = new Array("dnsHostName", "lastLogon"); - res = ldb.search("(badPwdCount=x)", NULL, ldb. SCOPE_DEFAULT, attrs); - assert(res.error == 0); - assert(res.msgs.length == 2); - assert(res.msgs[0].dn == s4.dn("cn=B")); - assert(res.msgs[0].dnsHostName == undefined); - assert(res.msgs[0].lastLogon == "y"); - assert(res.msgs[1].dn == s4.dn("cn=A")); - assert(res.msgs[1].dnsHostName == undefined); - assert(res.msgs[1].lastLogon == "x"); - - /* Search by converted attribute */ - attrs = new Array("dnsHostName", "lastLogon", "objectSid"); - /* TODO: - Using the SID directly in the parse tree leads to conversion - errors, letting the search fail with no results. - res = ldb.search("(objectSid=S-1-5-21-4231626423-2410014848-2360679739-552)", NULL, ldb. SCOPE_DEFAULT, attrs); - */ - res = ldb.search("(objectSid=*)", NULL, ldb. SCOPE_DEFAULT, attrs); - assert(res.error == 0); - assert(res.msgs.length == 3); - assert(res.msgs[0].dn == s4.dn("cn=X")); - assert(res.msgs[0].dnsHostName == "x"); - assert(res.msgs[0].lastLogon == "x"); - assert(res.msgs[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); - assert(res.msgs[1].dn == s4.dn("cn=A")); - assert(res.msgs[1].dnsHostName == undefined); - assert(res.msgs[1].lastLogon == "x"); - assert(res.msgs[1].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); - - /* Search by generated attribute */ - /* In most cases, this even works when the mapping is missing - * a `convert_operator' by enumerating the remote db. */ - attrs = new Array("dnsHostName", "lastLogon", "primaryGroupID"); - res = ldb.search("(primaryGroupID=512)", NULL, ldb. SCOPE_DEFAULT, attrs); - assert(res.error == 0); - assert(res.msgs.length == 1); - assert(res.msgs[0].dn == s4.dn("cn=A")); - assert(res.msgs[0].dnsHostName == undefined); - assert(res.msgs[0].lastLogon == "x"); - assert(res.msgs[0].primaryGroupID == "512"); - - /* TODO: There should actually be two results, A and X. The - * primaryGroupID of X seems to get corrupted somewhere, and the - * objectSid isn't available during the generation of remote (!) data, - * which can be observed with the following search. Also note that Xs - * objectSid seems to be fine in the previous search for objectSid... */ - /* - res = ldb.search("(primaryGroupID=*)", NULL, ldb. SCOPE_DEFAULT, attrs); - println(res.msgs.length + " results found"); - for (i=0;i Date: Tue, 12 Feb 2008 01:42:58 +0100 Subject: Reintroduce samba3sam EJS test, at least until the Python test is ready. (This used to be commit 13deb25214b2711836e243a87166b63a4a87270b) --- testprogs/ejs/samba3sam.js | 1255 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1255 insertions(+) create mode 100644 testprogs/ejs/samba3sam.js (limited to 'testprogs/ejs/samba3sam.js') diff --git a/testprogs/ejs/samba3sam.js b/testprogs/ejs/samba3sam.js new file mode 100644 index 0000000000..e5639b8ec8 --- /dev/null +++ b/testprogs/ejs/samba3sam.js @@ -0,0 +1,1255 @@ +#!/usr/bin/env smbscript +/* + (C) Jelmer Vernooij 2005 + (C) Martin Kuehl 2006 + Published under the GNU GPL + Sponsored by Google Summer of Code + */ + +var sys; +var options = GetOptions(ARGV, "POPT_AUTOHELP", "POPT_COMMON_SAMBA"); +if (options == undefined) { + println("Failed to parse options"); + return -1; +} + +libinclude("base.js"); + +if (options.ARGV.length != 2) { + println("Usage: samba3sam.js "); + return -1; +} + +var prefix = options.ARGV[0]; +var datadir = options.ARGV[1]; + +function setup_data(obj, ldif) +{ + assert(ldif != undefined); + ldif = substitute_var(ldif, obj); + assert(ldif != undefined); + var ok = obj.db.add(ldif); + assert(ok.error == 0); +} + +function setup_modules(ldb, s3, s4, ldif) +{ + assert(ldif != undefined); + ldif = substitute_var(ldif, s4); + assert(ldif != undefined); + var ok = ldb.add(ldif); + assert(ok.error == 0); + + var ldif = " +dn: @MAP=samba3sam +@FROM: " + s4.BASEDN + " +@TO: sambaDomainName=TESTS," + s3.BASEDN + " + +dn: @MODULES +@LIST: rootdse,paged_results,server_sort,extended_dn,asq,samldb,password_hash,operational,objectguid,rdn_name,samba3sam,partition + +dn: @PARTITION +partition: " + s4.BASEDN + ":" + s4.url + " +partition: " + s3.BASEDN + ":" + s3.url + " +replicateEntries: @SUBCLASSES +replicateEntries: @ATTRIBUTES +replicateEntries: @INDEXLIST +"; + var ok = ldb.add(ldif); + assert(ok.error == 0); +} + +function test_s3sam_search(ldb) +{ + println("Looking up by non-mapped attribute"); + var msg = ldb.search("(cn=Administrator)"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); + assert(msg.msgs[0].cn == "Administrator"); + + println("Looking up by mapped attribute"); + var msg = ldb.search("(name=Backup Operators)"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); + assert(msg.msgs[0].name == "Backup Operators"); + + println("Looking up by old name of renamed attribute"); + var msg = ldb.search("(displayName=Backup Operators)"); + assert(msg.msgs.length == 0); + + println("Looking up mapped entry containing SID"); + var msg = ldb.search("(cn=Replicator)"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); + println(msg.msgs[0].dn); + assert(msg.msgs[0].dn == "cn=Replicator,ou=Groups,dc=vernstok,dc=nl"); + assert(msg.msgs[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); + + println("Checking mapping of objectClass"); + var oc = msg.msgs[0].objectClass; + assert(oc != undefined); + for (var i in oc) { + assert(oc[i] == "posixGroup" || oc[i] == "group"); + } + + println("Looking up by objectClass"); + var msg = ldb.search("(|(objectClass=user)(cn=Administrator))"); + assert(msg.error == 0); + assert(msg.msgs.length == 2); + for (var i = 0; i < msg.msgs.length; i++) { + assert((msg.msgs[i].dn == "unixName=Administrator,ou=Users,dc=vernstok,dc=nl") || + (msg.msgs[i].dn == "unixName=nobody,ou=Users,dc=vernstok,dc=nl")); + } +} + +function test_s3sam_modify(ldb, s3) +{ + var msg, ok; + println("Adding a record that will be fallbacked"); + ok = ldb.add(" +dn: cn=Foo +foo: bar +blah: Blie +cn: Foo +showInAdvancedViewOnly: TRUE +"); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); + } + + println("Checking for existence of record (local)"); + /* TODO: This record must be searched in the local database, which is currently only supported for base searches + * msg = ldb.search("(cn=Foo)", new Array('foo','blah','cn','showInAdvancedViewOnly')); + * TODO: Actually, this version should work as well but doesn't... + * + */ + var attrs = new Array('foo','blah','cn','showInAdvancedViewOnly'); + msg = ldb.search("(cn=Foo)", "cn=Foo", ldb.LDB_SCOPE_BASE, attrs); + assert(msg.error == 0); + assert(msg.msgs.length == 1); + assert(msg.msgs[0].showInAdvancedViewOnly == "TRUE"); + assert(msg.msgs[0].foo == "bar"); + assert(msg.msgs[0].blah == "Blie"); + + println("Adding record that will be mapped"); + ok = ldb.add(" +dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl +objectClass: user +unixName: bin +sambaUnicodePwd: geheim +cn: Niemand +"); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); + } + assert(ok.error == 0); + + println("Checking for existence of record (remote)"); + msg = ldb.search("(unixName=bin)", new Array('unixName','cn','dn', 'sambaUnicodePwd')); + assert(msg.error == 0); + assert(msg.msgs.length == 1); + assert(msg.msgs[0].cn == "Niemand"); + assert(msg.msgs[0].sambaUnicodePwd == "geheim"); + + println("Checking for existence of record (local && remote)"); + msg = ldb.search("(&(unixName=bin)(sambaUnicodePwd=geheim))", new Array('unixName','cn','dn', 'sambaUnicodePwd')); + assert(msg.error == 0); + assert(msg.msgs.length == 1); // TODO: should check with more records + assert(msg.msgs[0].cn == "Niemand"); + assert(msg.msgs[0].unixName == "bin"); + assert(msg.msgs[0].sambaUnicodePwd == "geheim"); + + println("Checking for existence of record (local || remote)"); + msg = ldb.search("(|(unixName=bin)(sambaUnicodePwd=geheim))", new Array('unixName','cn','dn', 'sambaUnicodePwd')); + println("got " + msg.msgs.length + " replies"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); // TODO: should check with more records + assert(msg.msgs[0].cn == "Niemand"); + assert(msg.msgs[0].unixName == "bin" || msg.msgs[0].sambaUnicodePwd == "geheim"); + + println("Checking for data in destination database"); + msg = s3.db.search("(cn=Niemand)"); + assert(msg.error == 0); + assert(msg.msgs.length >= 1); + assert(msg.msgs[0].sambaSID == "S-1-5-21-4231626423-2410014848-2360679739-2001"); + assert(msg.msgs[0].displayName == "Niemand"); + + println("Adding attribute..."); + ok = ldb.modify(" +dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl +changetype: modify +add: description +description: Blah +"); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); + } + assert(ok.error == 0); + + println("Checking whether changes are still there..."); + msg = ldb.search("(cn=Niemand)"); + assert(msg.error == 0); + assert(msg.msgs.length >= 1); + assert(msg.msgs[0].cn == "Niemand"); + assert(msg.msgs[0].description == "Blah"); + + println("Modifying attribute..."); + ok = ldb.modify(" +dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl +changetype: modify +replace: description +description: Blie +"); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); + } + assert(ok.error == 0); + + println("Checking whether changes are still there..."); + msg = ldb.search("(cn=Niemand)"); + assert(msg.error == 0); + assert(msg.msgs.length >= 1); + assert(msg.msgs[0].description == "Blie"); + + println("Deleting attribute..."); + ok = ldb.modify(" +dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl +changetype: modify +delete: description +"); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); + } + assert(ok.error == 0); + + println("Checking whether changes are no longer there..."); + msg = ldb.search("(cn=Niemand)"); + assert(msg.error == 0); + assert(msg.msgs.length >= 1); + assert(msg.msgs[0].description == undefined); + + println("Renaming record..."); + ok = ldb.rename("cn=Niemand,cn=Users,dc=vernstok,dc=nl", "cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); + assert(ok.error == 0); + + println("Checking whether DN has changed..."); + msg = ldb.search("(cn=Niemand2)"); + assert(msg.error == 0); + assert(msg.msgs.length == 1); + assert(msg.msgs[0].dn == "cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); + + println("Deleting record..."); + ok = ldb.del("cn=Niemand2,cn=Users,dc=vernstok,dc=nl"); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); + } + + println("Checking whether record is gone..."); + msg = ldb.search("(cn=Niemand2)"); + assert(msg.error == 0); + assert(msg.msgs.length == 0); +} + +function test_map_search(ldb, s3, s4) +{ + println("Running search tests on mapped data"); + var res; + var dn; + var attrs; + + + var ldif = " +dn: " + "sambaDomainName=TESTS," + s3.BASEDN + " +objectclass: sambaDomain +objectclass: top +sambaSID: S-1-5-21-4231626423-2410014848-2360679739 +sambaNextRid: 2000 +sambaDomainName: TESTS" + ldif = substitute_var(ldif, s3); + assert(ldif != undefined); + var ok = s3.db.add(ldif); + assert(ok.error == 0); + + printf("Add a set of split records"); + var ldif = " +dn: " + s4.dn("cn=X") + " +objectClass: user +cn: X +codePage: x +revision: x +dnsHostName: x +nextRid: y +lastLogon: x +description: x +objectSid: S-1-5-21-4231626423-2410014848-2360679739-552 +primaryGroupID: 1-5-21-4231626423-2410014848-2360679739-512 + +dn: " + s4.dn("cn=Y") + " +objectClass: top +cn: Y +codePage: x +revision: x +dnsHostName: y +nextRid: y +lastLogon: y +description: x + +dn: " + s4.dn("cn=Z") + " +objectClass: top +cn: Z +codePage: x +revision: y +dnsHostName: z +nextRid: y +lastLogon: z +description: y +"; + + ldif = substitute_var(ldif, s4); + assert(ldif != undefined); + var ok = ldb.add(ldif); + if (ok.error != 0) { + println(ok.errstr); + assert(ok.error == 0); + } + + println("Add a set of remote records"); + + var ldif = " +dn: " + s3.dn("cn=A") + " +objectClass: posixAccount +cn: A +sambaNextRid: x +sambaBadPasswordCount: x +sambaLogonTime: x +description: x +sambaSID: S-1-5-21-4231626423-2410014848-2360679739-552 +sambaPrimaryGroupSID: S-1-5-21-4231626423-2410014848-2360679739-512 + +dn: " + s3.dn("cn=B") + " +objectClass: top +cn:B +sambaNextRid: x +sambaBadPasswordCount: x +sambaLogonTime: y +description: x + +dn: " + s3.dn("cn=C") + " +objectClass: top +cn: C +sambaNextRid: x +sambaBadPasswordCount: y +sambaLogonTime: z +description: y +"; + ldif = substitute_var(ldif, s3); + assert(ldif != undefined); + var ok = s3.db.add(ldif); + assert(ok.error == 0); + + println("Testing search by DN"); + + /* Search remote record by local DN */ + dn = s4.dn("cn=A"); + attrs = new Array("dnsHostName", "lastLogon"); + res = ldb.search("", dn, ldb.SCOPE_BASE, attrs); + assert(res.error == 0); + assert(res.msgs.length == 1); + assert(res.msgs[0].dn == dn); + assert(res.msgs[0].dnsHostName == undefined); + assert(res.msgs[0].lastLogon == "x"); + + /* Search remote record by remote DN */ + dn = s3.dn("cn=A"); + attrs = new Array("dnsHostName", "lastLogon", "sambaLogonTime"); + res = s3.db.search("", dn, ldb.SCOPE_BASE, attrs); + assert(res.error == 0); + assert(res.msgs.length == 1); + assert(res.msgs[0].dn == dn); + assert(res.msgs[0].dnsHostName == undefined); + assert(res.msgs[0].lastLogon == undefined); + assert(res.msgs[0].sambaLogonTime == "x"); + + /* Search split record by local DN */ + dn = s4.dn("cn=X"); + attrs = new Array("dnsHostName", "lastLogon"); + res = ldb.search("", dn, ldb.SCOPE_BASE, attrs); + assert(res.error == 0); + assert(res.msgs.length == 1); + assert(res.msgs[0].dn == dn); + assert(res.msgs[0].dnsHostName == "x"); + assert(res.msgs[0].lastLogon == "x"); + + /* Search split record by remote DN */ + dn = s3.dn("cn=X"); + attrs = new Array("dnsHostName", "lastLogon", "sambaLogonTime"); + res = s3.db.search("", dn, ldb.SCOPE_BASE, attrs); + assert(res.error == 0); + assert(res.msgs.length == 1); + assert(res.msgs[0].dn == dn); + assert(res.msgs[0].dnsHostName == undefined); + assert(res.msgs[0].lastLogon == undefined); + assert(res.msgs[0].sambaLogonTime == "x"); + + println("Testing search by attribute"); + + /* Search by ignored attribute */ + attrs = new Array("dnsHostName", "lastLogon"); + res = ldb.search("(revision=x)", NULL, ldb. SCOPE_DEFAULT, attrs); + assert(res.error == 0); + assert(res.msgs.length == 2); + assert(res.msgs[0].dn == s4.dn("cn=Y")); + assert(res.msgs[0].dnsHostName == "y"); + assert(res.msgs[0].lastLogon == "y"); + assert(res.msgs[1].dn == s4.dn("cn=X")); + assert(res.msgs[1].dnsHostName == "x"); + assert(res.msgs[1].lastLogon == "x"); + + /* Search by kept attribute */ + attrs = new Array("dnsHostName", "lastLogon"); + res = ldb.search("(description=y)", NULL, ldb. SCOPE_DEFAULT, attrs); + assert(res.error == 0); + assert(res.msgs.length == 2); + assert(res.msgs[0].dn == s4.dn("cn=Z")); + assert(res.msgs[0].dnsHostName == "z"); + assert(res.msgs[0].lastLogon == "z"); + assert(res.msgs[1].dn == s4.dn("cn=C")); + assert(res.msgs[1].dnsHostName == undefined); + assert(res.msgs[1].lastLogon == "z"); + + /* Search by renamed attribute */ + attrs = new Array("dnsHostName", "lastLogon"); + res = ldb.search("(badPwdCount=x)", NULL, ldb. SCOPE_DEFAULT, attrs); + assert(res.error == 0); + assert(res.msgs.length == 2); + assert(res.msgs[0].dn == s4.dn("cn=B")); + assert(res.msgs[0].dnsHostName == undefined); + assert(res.msgs[0].lastLogon == "y"); + assert(res.msgs[1].dn == s4.dn("cn=A")); + assert(res.msgs[1].dnsHostName == undefined); + assert(res.msgs[1].lastLogon == "x"); + + /* Search by converted attribute */ + attrs = new Array("dnsHostName", "lastLogon", "objectSid"); + /* TODO: + Using the SID directly in the parse tree leads to conversion + errors, letting the search fail with no results. + res = ldb.search("(objectSid=S-1-5-21-4231626423-2410014848-2360679739-552)", NULL, ldb. SCOPE_DEFAULT, attrs); + */ + res = ldb.search("(objectSid=*)", NULL, ldb. SCOPE_DEFAULT, attrs); + assert(res.error == 0); + assert(res.msgs.length == 3); + assert(res.msgs[0].dn == s4.dn("cn=X")); + assert(res.msgs[0].dnsHostName == "x"); + assert(res.msgs[0].lastLogon == "x"); + assert(res.msgs[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); + assert(res.msgs[1].dn == s4.dn("cn=A")); + assert(res.msgs[1].dnsHostName == undefined); + assert(res.msgs[1].lastLogon == "x"); + assert(res.msgs[1].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552"); + + /* Search by generated attribute */ + /* In most cases, this even works when the mapping is missing + * a `convert_operator' by enumerating the remote db. */ + attrs = new Array("dnsHostName", "lastLogon", "primaryGroupID"); + res = ldb.search("(primaryGroupID=512)", NULL, ldb. SCOPE_DEFAULT, attrs); + assert(res.error == 0); + assert(res.msgs.length == 1); + assert(res.msgs[0].dn == s4.dn("cn=A")); + assert(res.msgs[0].dnsHostName == undefined); + assert(res.msgs[0].lastLogon == "x"); + assert(res.msgs[0].primaryGroupID == "512"); + + /* TODO: There should actually be two results, A and X. The + * primaryGroupID of X seems to get corrupted somewhere, and the + * objectSid isn't available during the generation of remote (!) data, + * which can be observed with the following search. Also note that Xs + * objectSid seems to be fine in the previous search for objectSid... */ + /* + res = ldb.search("(primaryGroupID=*)", NULL, ldb. SCOPE_DEFAULT, attrs); + println(res.msgs.length + " results found"); + for (i=0;i