r17525: This is a merge from the Google Summer of Code 2006 project by Martin Kühl
[ira/wip.git] / testprogs / ejs / samba3sam
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
5  */
6
7 libinclude("base.js");
8 var mypath = substr(ARGV[0], 0, -strlen("samba3sam"));
9
10 var sys = sys_init();
11 var s3url = "tdb://samba3.ldb";
12 var s4url = "tdb://samba4.ldb";
13 var s3 = ldb_init();
14 var s4 = ldb_init();
15 var msg;
16 var ok;
17
18 var local = new Object();
19 local.BASEDN = "dc=vernstok,dc=nl";
20 var remote = new Object();
21 remote.BASEDN = "CN=Samba3Sam," + local.BASEDN;
22
23 var prt_ldif = sprintf("dn: @PARTITION
24 partition: %s:%s
25 partition: %s:%s", remote.BASEDN, s3url, local.BASEDN, s4url);
26
27 var map_ldif = sprintf("dn: @MAP=samba3sam
28 @FROM: %s
29 @TO: %s", local.BASEDN, remote.BASEDN);
30
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";
33
34 sys.unlink("samba3.ldb");
35 ok = s3.connect(s3url);
36 assert(ok);
37
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);
43 ok = s3.add(ldif);
44 assert(ok);
45
46 sys.unlink("samba4.ldb");
47 ok = s4.connect("tdb://samba4.ldb");
48 assert(ok);
49
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);
55 ok = s4.add(ldif);
56 assert(ok);
57
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);
62 ok = s4.add(ldif);
63 assert(ok);
64
65 println("Registering partitions...");
66 var ldif = substitute_var(prt_ldif, local);
67 assert(ldif != undefined);
68 ok = s4.add(ldif);
69 assert(ok);
70
71 println("Registering mapping...");
72 var ldif = substitute_var(map_ldif, local);
73 assert(ldif != undefined);
74 ok = s4.add(ldif);
75 assert(ok);
76
77 println("Registering modules...");
78 var ldif = substitute_var(mod_ldif, local);
79 assert(ldif != undefined);
80 ok = s4.add(ldif);
81 assert(ok);
82
83 println("Reconnecting to LDB database...");
84 s4 = ldb_init();
85 ok = s4.connect(s4url);
86 assert(ok);
87
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");
92
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");
97
98 println("Looking up by old name of renamed attribute");
99 msg = s4.search("(displayName=Backup Operators)");
100 assert(msg.length == 0);
101
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");
107
108 println("Checking mapping of objectClass");
109 var oc = msg[0].objectClass;
110 assert(oc != undefined);
111 for (var i in oc) {
112         assert(oc[i] == "posixGroup" || oc[i] == "group");
113 }
114
115 println("Adding a record that will be fallbacked");
116 ok = s4.add("
117 dn: cn=Foo,dc=idealx,dc=org
118 foo: bar
119 blah: Blie
120 cn: Foo
121 showInAdvancedViewOnly: TRUE
122 ");
123 assert(ok);
124
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'));
130 */
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");
136
137 println("Adding record that will be mapped");
138 ok = s4.add("
139 dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl
140 objectClass: user
141 unixName: bin
142 unicodePwd: geheim
143 cn: Niemand
144 ");
145 assert(ok);
146
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");
152
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");
159
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");
165
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");
171
172 println("Adding attribute...");
173 ok = s4.modify("
174 dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl
175 changetype: modify
176 add: description
177 description: Blah
178 ");
179 assert(ok);
180
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");
186
187 println("Modifying attribute...");
188 ok = s4.modify("
189 dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl
190 changetype: modify
191 replace: description
192 description: Blie
193 ");
194 assert(ok);
195
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");
200
201 println("Deleting attribute...");
202 ok = s4.modify("
203 dn: cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl
204 changetype: modify
205 delete: description
206 ");
207 assert(ok);
208
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);
213
214 println("Renaming record...");
215 ok = s4.rename("cn=Niemand,sambaDomainName=TESTS,dc=vernstok,dc=nl", "cn=Niemand,dc=vernstok,dc=nl");
216
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");
221
222 println("Deleting record...");
223 ok = s4.del("cn=Niemand,dc=vernstok,dc=nl");
224 assert(ok);
225
226 println("Checking whether record is gone...");
227 msg = s4.search("(cn=Niemand)");
228 assert(msg.length == 0);
229
230 return 0;