📄 samba3sam.js
字号:
#!/usr/bin/env smbscript/* (C) Jelmer Vernooij <jelmer@samba.org> 2005 (C) Martin Kuehl <mkhl@samba.org> 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 <TESTDIR> <DATADIR>"); 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,partitiondn: @PARTITIONpartition: " + s4.BASEDN + ":" + s4.url + "partition: " + s3.BASEDN + ":" + s3.url + "replicateEntries: @SUBCLASSESreplicateEntries: @ATTRIBUTESreplicateEntries: @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=Foofoo: barblah: Bliecn: FooshowInAdvancedViewOnly: 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=nlobjectClass: userunixName: binsambaUnicodePwd: geheimcn: 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=nlchangetype: modifyadd: descriptiondescription: 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=nlchangetype: modifyreplace: descriptiondescription: 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=nlchangetype: modifydelete: 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: sambaDomainobjectclass: topsambaSID: S-1-5-21-4231626423-2410014848-2360679739sambaNextRid: 2000sambaDomainName: 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: usercn: XcodePage: xrevision: xdnsHostName: xnextRid: ylastLogon: xdescription: xobjectSid: S-1-5-21-4231626423-2410014848-2360679739-552primaryGroupID: 1-5-21-4231626423-2410014848-2360679739-512dn: " + s4.dn("cn=Y") + "objectClass: topcn: YcodePage: xrevision: xdnsHostName: ynextRid: ylastLogon: ydescription: xdn: " + s4.dn("cn=Z") + "objectClass: topcn: ZcodePage: xrevision: ydnsHostName: znextRid: ylastLogon: zdescription: 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: posixAccountcn: AsambaNextRid: xsambaBadPasswordCount: xsambaLogonTime: xdescription: xsambaSID: S-1-5-21-4231626423-2410014848-2360679739-552sambaPrimaryGroupSID: S-1-5-21-4231626423-2410014848-2360679739-512dn: " + s3.dn("cn=B") + "objectClass: topcn:BsambaNextRid: xsambaBadPasswordCount: xsambaLogonTime: ydescription: xdn: " + s3.dn("cn=C") + "objectClass: topcn: CsambaNextRid: xsambaBadPasswordCount: ysambaLogonTime: zdescription: 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"));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -