r17525: This is a merge from the Google Summer of Code 2006 project by Martin Kühl
[ira/wip.git] / testprogs / ejs / ldap.js
1 #!/bin/sh
2 exec smbscript "$0" ${1+"$@"}
3 /*
4         test certin LDAP behaviours
5 */
6
7 var ldb = ldb_init();
8 var gc_ldb = ldb_init();
9
10 var options = GetOptions(ARGV, 
11                 "POPT_AUTOHELP",
12                 "POPT_COMMON_SAMBA",
13                 "POPT_COMMON_CREDENTIALS");
14 if (options == undefined) {
15    println("Failed to parse options");
16    return -1;
17 }
18
19 libinclude("base.js");
20
21 if (options.ARGV.length != 1) {
22    println("Usage: ldap.js <HOST>");
23    return -1;
24 }
25
26 var host = options.ARGV[0];
27
28 function basic_tests(ldb, gc_ldb, base_dn, configuration_dn)
29 {
30         println("Running basic tests");
31
32         ldb.del("cn=ldaptestuser,cn=users," + base_dn);
33
34         var ok = ldb.add("
35 dn: cn=ldaptestuser,cn=users," + base_dn + "
36 objectClass: user
37 objectClass: person
38 cn: LDAPtestUSER
39 ");
40         if (!ok) {
41                 ok = ldb.del("cn=ldaptestuser,cn=users," + base_dn);
42                 if (!ok) {
43                         println(ldb.errstring());
44                         assert(ok);
45                 }
46                 ok = ldb.add("
47 dn: cn=ldaptestuser,cn=users," + base_dn + "
48 objectClass: user
49 objectClass: person
50 cn: LDAPtestUSER
51 ");
52                 if (!ok) {
53                         println(ldb.errstring());
54                         assert(ok);
55                 }
56         }
57
58         var ok = ldb.add("
59 dn: cn=ldaptestcomputer,cn=computers," + base_dn + "
60 objectClass: computer
61 cn: LDAPtestCOMPUTER
62 ");
63         if (!ok) {
64                 ok = ldb.del("cn=ldaptestcomputer,cn=computers," + base_dn);
65                 if (!ok) {
66                         println(ldb.errstring());
67                         assert(ok);
68                 }
69                 ok = ldb.add("
70 dn: cn=ldaptestcomputer,cn=computers," + base_dn + "
71 objectClass: computer
72 cn: LDAPtestCOMPUTER
73 ");
74                 if (!ok) {
75                         println(ldb.errstring());
76                         assert(ok);
77                 }
78         }
79
80         var ok = ldb.add("
81 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
82 objectClass: computer
83 cn: LDAPtest2COMPUTER
84 userAccountControl: 4096
85 ");
86         if (!ok) {
87                 ok = ldb.del("cn=ldaptest2computer,cn=computers," + base_dn);
88                 if (!ok) {
89                         println(ldb.errstring());
90                         assert(ok);
91                 }
92                 ok = ldb.add("
93 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
94 objectClass: computer
95 cn: LDAPtest2COMPUTER
96 userAccountControl: 4096
97 ");
98                 if (!ok) {
99                         println(ldb.errstring());
100                         assert(ok);
101                 }
102         }
103
104         ok = ldb.add("
105 dn: cn=ldaptestuser2,cn=users," + base_dn + "
106 objectClass: person
107 objectClass: user
108 cn: LDAPtestUSER2
109 ");
110         if (!ok) {
111                 ok = ldb.del("cn=ldaptestuser2,cn=users," + base_dn);
112                 if (!ok) {
113                         println(ldb.errstring());
114                         assert(ok);
115                 }
116                 ok = ldb.add("
117 dn: cn=ldaptestuser2,cn=users," + base_dn + "
118 objectClass: person
119 objectClass: user
120 cn: LDAPtestUSER2
121 ");
122                 if (!ok) {
123                         println(ldb.errstring());
124                         assert(ok);
125                 }
126         }
127
128         ok = ldb.add("
129 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
130 objectClass: user
131 ");
132         if (!ok) {
133                 ok = ldb.del("cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn);
134                 if (!ok) {
135                         println(ldb.errstring());
136                         assert(ok);
137                 }
138         ok = ldb.add("
139 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
140 objectClass: user
141 ");
142                 if (!ok) {
143                         println(ldb.errstring());
144                         assert(ok);
145                 }
146         }
147
148         ok = ldb.add("
149 dn: cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn + "
150 objectClass: user
151 ");
152         if (!ok) {
153                 ok = ldb.del("cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn);
154                 if (!ok) {
155                         println(ldb.errstring());
156                         assert(ok);
157                 }
158         ok = ldb.add("
159 dn: cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn + "
160 objectClass: user
161 ");
162                 if (!ok) {
163                         println(ldb.errstring());
164                         assert(ok);
165                 }
166         }
167
168         println("Testing ldb.search for (&(cn=ldaptestuser)(objectClass=user))");
169         var res = ldb.search("(&(cn=ldaptestuser)(objectClass=user))");
170         if (res.length != 1) {
171                 println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
172                 assert(res.length == 1);
173         }
174
175         assert(res[0].dn == "cn=ldaptestuser,cn=users," + base_dn);
176         assert(res[0].cn == "ldaptestuser");
177         assert(res[0].name == "ldaptestuser");
178         assert(res[0].objectClass[0] == "top");
179         assert(res[0].objectClass[1] == "person");
180         assert(res[0].objectClass[2] == "organizationalPerson");
181         assert(res[0].objectClass[3] == "user");
182         assert(res[0].objectGUID != undefined);
183         assert(res[0].whenCreated != undefined);
184         assert(res[0].objectCategory == "cn=Person,cn=Schema,cn=Configuration," + base_dn);
185         assert(res[0].sAMAccountType == 805306368);
186 //      assert(res[0].userAccountControl == 546);
187
188         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
189         var res2 = ldb.search("(&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
190         if (res2.length != 1) {
191                 println("Could not find (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
192                 assert(res2.length == 1);
193         }
194
195         assert(res[0].dn == res2[0].dn);
196
197         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon))");
198         var res3 = ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
199         if (res3.length != 1) {
200                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon))");
201                 assert(res3.length == 1);
202         }
203
204         assert(res[0].dn == res3[0].dn);
205
206         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
207         var res3gc = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
208         if (res3gc.length != 1) {
209                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
210                 assert(res3gc.length == 1);
211         }
212
213         assert(res[0].dn == res3gc[0].dn);
214
215         ok = ldb.del(res[0].dn);
216         if (!ok) {
217                 println(ldb.errstring());
218                 assert(ok);
219         }
220
221         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectClass=user))");
222         var res = ldb.search("(&(cn=ldaptestcomputer)(objectClass=user))");
223         if (res.length != 1) {
224                 println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
225                 assert(res.length == 1);
226         }
227
228         assert(res[0].dn == "cn=ldaptestcomputer,cn=computers," + base_dn);
229         assert(res[0].cn == "ldaptestcomputer");
230         assert(res[0].name == "ldaptestcomputer");
231         assert(res[0].objectClass[0] == "top");
232         assert(res[0].objectClass[1] == "person");
233         assert(res[0].objectClass[2] == "organizationalPerson");
234         assert(res[0].objectClass[3] == "user");
235         assert(res[0].objectClass[4] == "computer");
236         assert(res[0].objectGUID != undefined);
237         assert(res[0].whenCreated != undefined);
238         assert(res[0].objectCategory == "cn=Computer,cn=Schema,cn=Configuration," + base_dn);
239 //      assert(res[0].sAMAccountType == 805306368);
240 //      assert(res[0].userAccountControl == 546);
241
242         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
243         var res2 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
244         if (res2.length != 1) {
245                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
246                 assert(res2.length == 1);
247         }
248
249         assert(res[0].dn == res2[0].dn);
250
251         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
252         var res2gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
253         if (res2gc.length != 1) {
254                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
255                 assert(res2gc.length == 1);
256         }
257
258         assert(res[0].dn == res2[0].dn);
259
260         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
261         var res3 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
262         if (res3.length != 1) {
263                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
264                 assert(res3.length == 1);
265         }
266
267         assert(res[0].dn == res3[0].dn);
268
269         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
270         var res3gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
271         if (res3gc.length != 1) {
272                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
273                 assert(res3gc.length == 1);
274         }
275
276         assert(res[0].dn == res3gc[0].dn);
277
278         println("Testing ldb.search for (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
279         var res4 = ldb.search("(&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
280         if (res4.length != 1) {
281                 println("Could not find (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
282                 assert(res4.length == 1);
283         }
284
285         assert(res[0].dn == res4[0].dn);
286
287         println("Testing ldb.search for (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
288         var res5 = ldb.search("(&(cn=ldaptestcomput*)(objectCategory=compuTER))");
289         if (res5.length != 1) {
290                 println("Could not find (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
291                 assert(res5.length == 1);
292         }
293
294         assert(res[0].dn == res5[0].dn);
295
296         println("Testing ldb.search for (&(cn=*daptestcomputer)(objectCategory=compuTER))");
297         var res6 = ldb.search("(&(cn=*daptestcomputer)(objectCategory=compuTER))");
298         if (res6.length != 1) {
299                 println("Could not find (&(cn=*daptestcomputer)(objectCategory=compuTER))");
300                 assert(res6.length == 1);
301         }
302
303         assert(res[0].dn == res6[0].dn);
304
305         ok = ldb.del(res[0].dn);
306         if (!ok) {
307                 println(ldb.errstring());
308                 assert(ok);
309         }
310
311         println("Testing ldb.search for (&(cn=ldaptest2computer)(objectClass=user))");
312         var res = ldb.search("(&(cn=ldaptest2computer)(objectClass=user))");
313         if (res.length != 1) {
314                 println("Could not find (&(cn=ldaptest2computer)(objectClass=user))");
315                 assert(res.length == 1);
316         }
317
318         assert(res[0].dn == "cn=ldaptest2computer,cn=computers," + base_dn);
319         assert(res[0].cn == "ldaptest2computer");
320         assert(res[0].name == "ldaptest2computer");
321         assert(res[0].objectClass[0] == "top");
322         assert(res[0].objectClass[1] == "person");
323         assert(res[0].objectClass[2] == "organizationalPerson");
324         assert(res[0].objectClass[3] == "user");
325         assert(res[0].objectClass[4] == "computer");
326         assert(res[0].objectGUID != undefined);
327         assert(res[0].whenCreated != undefined);
328         assert(res[0].objectCategory == "cn=Computer,cn=Schema,cn=Configuration," + base_dn);
329         assert(res[0].sAMAccountType == 805306369);
330 //      assert(res[0].userAccountControl == 4098);
331
332
333         println("Testing ldb.search for (&(cn=ldaptestUSer2)(objectClass=user))");
334         var res = ldb.search("(&(cn=ldaptestUSer2)(objectClass=user))");
335         if (res.length != 1) {
336                 println("Could not find (&(cn=ldaptestUSer2)(objectClass=user))");
337                 assert(res.length == 1);
338         }
339
340         assert(res[0].dn == "cn=ldaptestuser2,cn=users," + base_dn);
341         assert(res[0].cn == "ldaptestuser2");
342         assert(res[0].name == "ldaptestuser2");
343         assert(res[0].objectClass[0] == "top");
344         assert(res[0].objectClass[1] == "person");
345         assert(res[0].objectClass[2] == "organizationalPerson");
346         assert(res[0].objectClass[3] == "user");
347         assert(res[0].objectGUID != undefined);
348         assert(res[0].whenCreated != undefined);
349
350         ok = ldb.del(res[0].dn);
351         if (!ok) {
352                 println(ldb.errstring());
353                 assert(ok);
354         }
355
356         println("Testing ldb.search for (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
357         var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
358
359         if (res.length != 1) {
360                 println("Could not find (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
361                 assert(res.length == 1);
362         }
363
364         assert(res[0].dn == "cn=ldaptestutf8user èùéìòà,cn=users," + base_dn);
365         assert(res[0].cn == "ldaptestutf8user èùéìòà");
366         assert(res[0].name == "ldaptestutf8user èùéìòà");
367         assert(res[0].objectClass[0] == "top");
368         assert(res[0].objectClass[1] == "person");
369         assert(res[0].objectClass[2] == "organizationalPerson");
370         assert(res[0].objectClass[3] == "user");
371         assert(res[0].objectGUID != undefined);
372         assert(res[0].whenCreated != undefined);
373
374         ok = ldb.del(res[0].dn);
375         if (!ok) {
376                 println(ldb.errstring());
377                 assert(ok);
378         }
379
380         println("Testing ldb.search for (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
381         var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
382
383         if (res.length != 1) {
384                 println("Could not find (expect space collapse, win2k3 fails) (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
385         } else {
386                 assert(res[0].dn == "cn=ldaptestutf8user2 èùéìòà,cn=users," + base_dn);
387                 assert(res[0].cn == "ldaptestutf8user2 èùéìòà");
388         }
389
390         println("Testing for highestCommittedUSN");
391         var attrs = new Array("highestCommittedUSN");
392         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
393         assert(res.length == 1);
394         assert(res[0].highestCommittedUSN != undefined);
395         assert(res[0].highestCommittedUSN != 0);
396
397         println("Testing that we can't get at the configuration DN from the main search base");
398         var attrs = new Array("cn");
399         var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
400         assert (res.length == 0);
401
402         println("Testing that we do find configuration elements in the global catlog");
403         var attrs = new Array("cn");
404         var res = gc_ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
405         assert (res.length > 0);
406
407         println("Testing that we do find configuration elements and user elements at the same time");
408         var attrs = new Array("cn");
409         var res = gc_ldb.search("(|(objectClass=crossRef)(objectClass=person))", base_dn, ldb.SCOPE_SUBTREE, attrs);
410         assert (res.length > 0);
411
412         println("Testing that we do find configuration elements in the global catlog, with the configuration basedn");
413         var attrs = new Array("cn");
414         var res = gc_ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
415         assert (res.length > 0);
416
417         println("Testing that we can get at the configuration DN on the main LDAP port");
418         var attrs = new Array("cn");
419         var res = ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
420         assert (res.length > 0);
421
422 }
423
424 function find_basedn(ldb)
425 {
426     var attrs = new Array("defaultNamingContext");
427     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
428     assert(res.length == 1);
429     return res[0].defaultNamingContext;
430 }
431
432 function find_configurationdn(ldb)
433 {
434     var attrs = new Array("configurationNamingContext");
435     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
436     assert(res.length == 1);
437     return res[0].configurationNamingContext;
438 }
439
440 /* use command line creds if available */
441 ldb.credentials = options.get_credentials();
442 gc_ldb.credentials = options.get_credentials();
443
444 var ok = ldb.connect("ldap://" + host);
445 var base_dn = find_basedn(ldb);
446 var configuration_dn = find_configurationdn(ldb);
447
448 printf("baseDN: %s\n", base_dn);
449
450 var ok = gc_ldb.connect("ldap://" + host + ":3268");
451
452 basic_tests(ldb, gc_ldb, base_dn, configuration_dn)
453
454 return 0;