1 #!/usr/bin/env smbscript
2 /* (C) Jelmer Vernooij <jelmer@samba.org> 2005
3 Published under the GNU GPL
4 Sponsored by Google Summer of Code
8 var mypath = substr(ARGV[0], 0, -strlen("samba3sam"));
11 var s3url = "tdb://samba3.ldb";
12 var s4url = "tdb://samba4.ldb";
18 var local = new Object();
19 local.BASEDN = "dc=vernstok,dc=nl";
20 var remote = new Object();
21 remote.BASEDN = "CN=Samba3Sam," + local.BASEDN;
23 var prt_ldif = sprintf("dn: @PARTITION
25 partition: %s:%s", remote.BASEDN, s3url, local.BASEDN, s4url);
27 var map_ldif = sprintf("dn: @MAP=samba3sam
29 @TO: %s", local.BASEDN, remote.BASEDN);
31 var mod_ldif = "dn: @MODULES
32 @LIST: rootdse,paged_results,server_sort,extended_dn,asq,samldb,objectclass,password_hash,operational,objectguid,rdn_name,samba3sam,partition";
34 sys.unlink("samba3.ldb");
35 ok = s3.connect(s3url);
38 println("Initial samba3 LDIF...");
39 var path = "../../testdata/samba3/samba3.ldif"
40 var ldif = sys.file_load(mypath + path);
41 ldif = substitute_var(ldif, remote);
42 assert(ldif != undefined);
46 sys.unlink("samba4.ldb");
47 ok = s4.connect("tdb://samba4.ldb");
50 println("Initial samba4 LDIF...");
51 var path = "../../source/setup/provision_init.ldif";
52 var ldif = sys.file_load(mypath + path);
53 ldif = substitute_var(ldif, local);
54 assert(ldif != undefined);
58 var path = "../../source/setup/provision_templates.ldif";
59 var ldif = sys.file_load(mypath + path);
60 ldif = substitute_var(ldif, local);
61 assert(ldif != undefined);
65 println("Registering partitions...");
66 var ldif = substitute_var(prt_ldif, local);
67 assert(ldif != undefined);
71 println("Registering mapping...");
72 var ldif = substitute_var(map_ldif, local);
73 assert(ldif != undefined);
77 println("Registering modules...");
78 var ldif = substitute_var(mod_ldif, local);
79 assert(ldif != undefined);
83 println("Reconnecting to LDB database...");
85 ok = s4.connect(s4url);
88 println("Looking up by non-mapped attribute");
89 msg = s4.search("(cn=Administrator)");
90 assert(msg.length == 1);
91 assert(msg[0].cn == "Administrator");
93 println("Looking up by mapped attribute");
94 msg = s4.search("(name=Backup Operators)");
95 assert(msg.length == 1);
96 assert(msg[0].name == "Backup Operators");
98 println("Looking up by old name of renamed attribute");
99 msg = s4.search("(displayName=Backup Operators)");
100 assert(msg.length == 0);
102 println("Looking up mapped entry containing SID");
103 msg = s4.search("(cn=Replicator)");
104 assert(msg.length == 1);
105 assert(msg[0].dn == "cn=Replicator,ou=Groups,sambaDomainName=TESTS,dc=vernstok,dc=nl");
106 assert(msg[0].objectSid == "S-1-5-21-4231626423-2410014848-2360679739-552");
108 println("Checking mapping of objectClass");
109 var oc = msg[0].objectClass;
110 assert(oc != undefined);
112 assert(oc[i] == "posixGroup" || oc[i] == "group");
115 println("Adding a record that will be fallbacked");
117 dn: cn=Foo,dc=idealx,dc=org
121 showInAdvancedViewOnly: TRUE
125 println("Checking for existence of record (local)");
126 /* TODO: This record must be searched in the local database, which is currently only supported for base searches
127 msg = s4.search("(cn=Foo)", new Array('foo','blah','cn','showInAdvancedViewOnly'));
128 TODO: Actually, this version should work as well but doesn't...
129 msg = s4.search("(cn=Foo)", "dc=idealx,dc=org", s4.LDB_SCOPE_SUBTREE new Array('foo','blah','cn','showInAdvancedViewOnly'));
131 msg = s4.search("", "cn=Foo,dc=idealx,dc=org", s4.LDB_SCOPE_BASE new Array('foo','blah','cn','showInAdvancedViewOnly'));
132 assert(msg.length == 1);
133 assert(msg[0].showInAdvancedViewOnly == "TRUE");
134 assert(msg[0].foo == "bar");
135 assert(msg[0].blah == "Blie");
137 println("Adding record that will be mapped");
139 dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl
147 println("Checking for existence of record (remote)");
148 msg = s4.search("(unixName=bin)", new Array('unixName','cn','dn', 'unicodePwd'));
149 assert(msg.length == 1);
150 assert(msg[0].cn == "Niemand");
151 assert(msg[0].unicodePwd == "geheim");
153 println("Checking for existence of record (local && remote)");
154 msg = s4.search("(&(unixName=bin)(unicodePwd=geheim))", new Array('unixName','cn','dn', 'unicodePwd'));
155 assert(msg.length == 1); // TODO: should check with more records
156 assert(msg[0].cn == "Niemand");
157 assert(msg[0].unixName == "bin");
158 assert(msg[0].unicodePwd == "geheim");
160 println("Checking for existence of record (local || remote)");
161 msg = s4.search("(|(unixName=bin)(unicodePwd=geheim))", new Array('unixName','cn','dn', 'unicodePwd'));
162 assert(msg.length == 1); // TODO: should check with more records
163 assert(msg[0].cn == "Niemand");
164 assert(msg[0].unixName == "bin" || msg[0].unicodePwd == "geheim");
166 println("Checking for data in destination database");
167 msg = s3.search("(cn=Niemand)");
168 assert(msg.length >= 1);
169 assert(msg[0].sambaSID == "S-1-5-21-4231626423-2410014848-2360679739-2001");
170 assert(msg[0].displayName == "Niemand");
172 println("Adding attribute...");
174 dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl
181 println("Checking whether changes are still there...");
182 msg = s4.search("(cn=Niemand)");
183 assert(msg.length >= 1);
184 assert(msg[0].cn == "Niemand");
185 assert(msg[0].description == "Blah");
187 println("Modifying attribute...");
189 dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl
196 println("Checking whether changes are still there...");
197 msg = s4.search("(cn=Niemand)");
198 assert(msg.length >= 1);
199 assert(msg[0].description == "Blie");
201 println("Deleting attribute...");
203 dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl
209 println("Checking whether changes are no longer there...");
210 msg = s4.search("(cn=Niemand)");
211 assert(msg.length >= 1);
212 assert(msg[0].description == undefined);
214 println("Renaming record...");
215 ok = s4.rename("cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl", "cn=Niemand,dc=vernstok,dc=nl");
217 println("Checking whether DN has changed...");
218 msg = s4.search("(cn=Niemand)");
219 assert(msg.length == 1);
220 assert(msg[0].dn == "cn=Niemand,dc=vernstok,dc=nl");
222 println("Deleting record...");
223 ok = s4.del("cn=Niemand,dc=vernstok,dc=nl");
226 println("Checking whether record is gone...");
227 msg = s4.search("(cn=Niemand)");
228 assert(msg.length == 0);