r26420: Don't print a blow-by-blow description of every search we do, just the
[metze/samba/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, schema_dn)
29 {
30         println("Running basic tests");
31
32         ldb.del("cn=ldaptestuser,cn=users," + base_dn);
33
34         ldb.del("cn=ldaptestgroup,cn=users," + base_dn);
35
36         println("Testing group add with invalid member");
37         var ok = ldb.add("
38 dn: cn=ldaptestgroup,cn=uSers," + base_dn + "
39 objectclass: group
40 member: cn=ldaptestuser,cn=useRs," + base_dn + "
41 ");
42
43         if (ok.error != 32) { /* LDAP_NO_SUCH_OBJECT */
44                 println(ok.errstr);
45                 assert(ok.error == 32);
46         }
47
48         println("Testing user add");
49         var ok = ldb.add("
50 dn: cn=ldaptestuser,cn=uSers," + base_dn + "
51 objectclass: user
52 objectclass: person
53 cN: LDAPtestUSER
54 givenname: ldap
55 sn: testy
56 ");
57         if (ok.error != 0) {
58                 ok = ldb.del("cn=ldaptestuser,cn=users," + base_dn);
59                 if (ok.error != 0) {
60                         println(ok.errstr);
61                         assert(ok.error == 0);
62                 }
63                 ok = ldb.add("
64 dn: cn=ldaptestuser,cn=uSers," + base_dn + "
65 objectclass: user
66 objectclass: person
67 cN: LDAPtestUSER
68 givenname: ldap
69 sn: testy
70 ");
71                 if (ok.error != 0) {
72                         println(ok.errstr);
73                         assert(ok.error == 0);
74                 }
75         }
76
77         var ok = ldb.add("
78 dn: cn=ldaptestgroup,cn=uSers," + base_dn + "
79 objectclass: group
80 member: cn=ldaptestuser,cn=useRs," + base_dn + "
81 ");
82         if (ok.error != 0) {
83                 println(ok.errstr);
84                 assert(ok.error == 0);
85         }
86
87         var ok = ldb.add("
88 dn: cn=ldaptestcomputer,cn=computers," + base_dn + "
89 objectclass: computer
90 cN: LDAPtestCOMPUTER
91 ");
92         if (ok.error != 0) {
93                 ok = ldb.del("cn=ldaptestcomputer,cn=computers," + base_dn);
94                 if (ok.error != 0) {
95                         println(ok.errstr);
96                         assert(ok.error == 0);
97                 }
98                 ok = ldb.add("
99 dn: cn=ldaptestcomputer,cn=computers," + base_dn + "
100 objectClass: computer
101 cn: LDAPtestCOMPUTER
102 ");
103                 if (ok.error != 0) {
104                         println(ok.errstr);
105                         assert(ok.error == 0);
106                 }
107         }
108
109         if (ok.error != 0) {
110                 println(ok.errstr);
111                 assert(ok.error == 0);
112         }
113
114         var ok = ldb.add("
115 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
116 objectClass: computer
117 cn: LDAPtest2COMPUTER
118 userAccountControl: 4096
119 displayname: ldap testy
120 ");
121         if (ok.error != 0) {
122                 ok = ldb.del("cn=ldaptest2computer,cn=computers," + base_dn);
123                 if (ok.error != 0) {
124                         println(ok.errstr);
125                         assert(ok.error == 0);
126                 }
127                 ok = ldb.add("
128 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
129 objectClass: computer
130 cn: LDAPtest2COMPUTER
131 userAccountControl: 4096
132 displayname: ldap testy
133 ");
134                 if (ok.error != 0) {
135                         println(ok.errstr);
136                         assert(ok.error == 0);
137                 }
138         }
139
140             ok = ldb.modify("
141 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
142 changetype: modify
143 replace: servicePrincipalName
144 servicePrincipalName: host/ldaptest2computer
145 servicePrincipalName: host/ldaptest2computer
146 servicePrincipalName: cifs/ldaptest2computer
147 ");
148
149 //LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS
150                 if (ok.error != 20) {
151                         println("Expected error LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS, got :" + ok.errstr);
152                         assert(ok.error == 20);
153                 }
154
155         ok = ldb.add("
156 dn: cn=ldaptestuser2,cn=useRs," + base_dn + "
157 objectClass: person
158 objectClass: user
159 cn: LDAPtestUSER2
160 givenname: testy
161 sn: ldap user2
162 ");
163         if (ok.error != 0) {
164                 ok = ldb.del("cn=ldaptestuser2,cn=users," + base_dn);
165                 if (ok.error != 0) {
166                         println(ok.errstr);
167                         assert(ok.error == 0);
168                 }
169                 ok = ldb.add("
170 dn: cn=ldaptestuser2,cn=useRs," + base_dn + "
171 objectClass: person
172 objectClass: user
173 cn: LDAPtestUSER2
174 givenname: testy
175 sn: ldap user2
176 ");
177                 if (ok.error != 0) {
178                         println(ok.errstr);
179                         assert(ok.error == 0);
180                 }
181         }
182
183
184         println("Testing Ambigious Name Resolution");
185 // Testing ldb.search for (&(anr=ldap testy)(objectClass=user))
186         var res = ldb.search("(&(anr=ldap testy)(objectClass=user))");
187         if (res.error != 0 || res.msgs.length != 3) {
188                 println("Could not find (&(anr=ldap testy)(objectClass=user))");
189                 assert(res.error == 0);
190                 assert(res.msgs.length == 3);
191         }
192
193 // Testing ldb.search for (&(anr=testy ldap)(objectClass=user))
194         var res = ldb.search("(&(anr=testy ldap)(objectClass=user))");
195         if (res.error != 0 || res.msgs.length != 2) {
196                 println("Found only " + res.msgs.length + " for (&(anr=testy ldap)(objectClass=user))");
197                 assert(res.error == 0);
198                 assert(res.msgs.length == 2);
199         }
200
201 // Testing ldb.search for (&(anr=ldap)(objectClass=user))
202         var res = ldb.search("(&(anr=ldap)(objectClass=user))");
203         if (res.error != 0 || res.msgs.length != 4) {
204                 println("Found only " + res.msgs.length + " for (&(anr=ldap)(objectClass=user))");
205                 assert(res.error == 0);
206                 assert(res.msgs.length == 4);
207         } 
208
209 // Testing ldb.search for (&(anr==ldap)(objectClass=user))
210         var res = ldb.search("(&(anr==ldap)(objectClass=user))");
211         if (res.error != 0 || res.msgs.length != 1) {
212                 println("Found only " + res.msgs.length + " for (&(anr=ldap)(objectClass=user))");
213                 println("Could not find (&(anr==ldap)(objectClass=user))");
214                 assert(res.error == 0);
215                 assert(res.msgs.length == 1);
216         }
217
218         assert(res.msgs[0].dn == ("CN=ldaptestuser,CN=Users," + base_dn));
219         assert(res.msgs[0].cn == "ldaptestuser");
220         assert(res.msgs[0].name == "ldaptestuser");
221
222 // Testing ldb.search for (&(anr=testy)(objectClass=user))
223         var res = ldb.search("(&(anr=testy)(objectClass=user))");
224         if (res.error != 0 || res.msgs.length != 2) {
225                 println("Found only " + res.msgs.length + " for (&(anr=testy)(objectClass=user))");
226                 assert(res.error == 0);
227                 assert(res.msgs.length == 2);
228         }
229
230 // Testing ldb.search for (&(anr=ldap testy)(objectClass=user))
231         var res = ldb.search("(&(anr=testy ldap)(objectClass=user))");
232         if (res.error != 0 || res.msgs.length != 2) {
233                 println("Found only " + res.msgs.length + " for (&(anr=ldap testy)(objectClass=user))");
234                 assert(res.error == 0);
235                 assert(res.msgs.length == 2);
236         }
237
238 // Testing ldb.search for (&(anr==ldap testy)(objectClass=user))
239         var res = ldb.search("(&(anr==testy ldap)(objectClass=user))");
240         if (res.error != 0 || res.msgs.length != 1) {
241                 println("Found only " + res.msgs.length + " for (&(anr==ldap testy)(objectClass=user))");
242                 assert(res.error == 0);
243                 assert(res.msgs.length == 1);
244         }
245
246         assert(res.msgs[0].dn == ("CN=ldaptestuser,CN=Users," + base_dn));
247         assert(res.msgs[0].cn == "ldaptestuser");
248         assert(res.msgs[0].name == "ldaptestuser");
249
250 // Testing ldb.search for (&(anr==testy ldap)(objectClass=user))
251         var res = ldb.search("(&(anr==testy ldap)(objectClass=user))");
252         if (res.error != 0 || res.msgs.length != 1) {
253                 println("Could not find (&(anr==testy ldap)(objectClass=user))");
254                 assert(res.error == 0);
255                 assert(res.msgs.length == 1);
256         }
257
258         assert(res.msgs[0].dn == ("CN=ldaptestuser,CN=Users," + base_dn));
259         assert(res.msgs[0].cn == "ldaptestuser");
260         assert(res.msgs[0].name == "ldaptestuser");
261
262         // Testing ldb.search for (&(anr=testy ldap user)(objectClass=user))
263         var res = ldb.search("(&(anr=testy ldap user)(objectClass=user))");
264         if (res.error != 0 || res.msgs.length != 1) {
265                 println("Could not find (&(anr=testy ldap user)(objectClass=user))");
266                 assert(res.error == 0);
267                 assert(res.msgs.length == 1);
268         }
269
270         assert(res.msgs[0].dn == ("CN=ldaptestuser2,CN=Users," + base_dn));
271         assert(res.msgs[0].cn == "ldaptestuser2");
272         assert(res.msgs[0].name == "ldaptestuser2");
273
274         // Testing ldb.search for (&(anr==testy ldap user2)(objectClass=user))
275         var res = ldb.search("(&(anr==testy ldap user2)(objectClass=user))");
276         if (res.error != 0 || res.msgs.length != 1) {
277                 println("Could not find (&(anr==testy ldap user2)(objectClass=user))");
278                 assert(res.error == 0);
279                 assert(res.msgs.length == 1);
280         }
281
282         assert(res.msgs[0].dn == ("CN=ldaptestuser2,CN=Users," + base_dn));
283         assert(res.msgs[0].cn == "ldaptestuser2");
284         assert(res.msgs[0].name == "ldaptestuser2");
285
286         // Testing ldb.search for (&(anr==ldap user2)(objectClass=user))
287         var res = ldb.search("(&(anr==ldap user2)(objectClass=user))");
288         if (res.error != 0 || res.msgs.length != 1) {
289                 println("Could not find (&(anr==ldap user2)(objectClass=user))");
290                 assert(res.error == 0);
291                 assert(res.msgs.length == 1);
292         }
293
294         assert(res.msgs[0].dn == ("CN=ldaptestuser2,CN=Users," + base_dn));
295         assert(res.msgs[0].cn == "ldaptestuser2");
296         assert(res.msgs[0].name == "ldaptestuser2");
297
298         // Testing ldb.search for (&(anr==not ldap user2)(objectClass=user))
299         var res = ldb.search("(&(anr==not ldap user2)(objectClass=user))");
300         if (res.error != 0 || res.msgs.length != 0) {
301                 println("Must not find (&(anr==not ldap user2)(objectClass=user))");
302                 assert(res.error == 0);
303                 assert(res.msgs.length == 0);
304         }
305
306         // Testing ldb.search for (&(anr=not ldap user2)(objectClass=user))
307         var res = ldb.search("(&(anr=not ldap user2)(objectClass=user))");
308         if (res.error != 0 || res.msgs.length != 0) {
309                 println("Must not find (&(anr=not ldap user2)(objectClass=user))");
310                 assert(res.error == 0);
311                 assert(res.msgs.length == 0);
312         }
313
314         println("Testing Group Modifies");
315         ok = ldb.modify("
316 dn: cn=ldaptestgroup,cn=users," + base_dn + "
317 changetype: modify
318 add: member
319 member: cn=ldaptestuser2,cn=users," + base_dn + "
320 member: cn=ldaptestcomputer,cn=computers," + base_dn + "
321 ");
322
323         if (ok.error != 0) {
324                 println(ok.errstr);
325                 assert(ok.error == 0);
326         }
327
328         ok = ldb.del("cn=ldaptestuser3,cn=users," + base_dn);
329
330         println("Testing adding non-existent user to a group");
331         ok = ldb.modify("
332 dn: cn=ldaptestgroup,cn=users," + base_dn + "
333 changetype: modify
334 add: member
335 member: cn=ldaptestuser3,cn=users," + base_dn + "
336 ");
337         if (ok.error != 32) { /* LDAP_NO_SUCH_OBJECT */
338                 println(ok.errstr);
339                 assert(ok.error == 32);
340         }
341
342         println("Testing Renames");
343
344         ok = ldb.rename("cn=ldaptestuser2,cn=users," + base_dn, "cn=ldaptestuser3,cn=users," + base_dn);
345         if (ok.error != 0) {
346                 println("Could not rename cn=ldaptestuser2,cn=users," + base_dn + " into cn=ldaptestuser3,cn=users," + base_dn + ": " + ok.errstr);
347                 assert(ok.error == 0);
348         }
349
350         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser3,cn=users," + base_dn);
351         if (ok.error != 0) {
352                 println("Could not rename cn=ldaptestuser3,cn=users," + base_dn + " onto itself: " + ok.errstr);
353                 assert(ok.error == 0);
354         }
355
356         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestUSER3,cn=users," + base_dn);
357         if (ok.error != 0) {
358                 println("Could not rename cn=ldaptestuser3,cn=users," + base_dn + " into cn=ldaptestUSER3,cn=users," + base_dn + ": " + ok.errstr);
359                 assert(ok.error == 0);
360         }
361
362         println("Testing ldb.search for (&(cn=ldaptestuser3)(objectClass=user))");
363         var res = ldb.search("(&(cn=ldaptestuser3)(objectClass=user))");
364         if (res.error != 0 || res.msgs.length != 1) {
365                 println("Could not find (&(cn=ldaptestuser3)(objectClass=user))");
366                 assert(res.error == 0);
367                 assert(res.msgs.length == 1);
368         }
369
370         assert(res.msgs[0].dn == ("CN=ldaptestUSER3,CN=Users," + base_dn));
371         assert(res.msgs[0].cn == "ldaptestUSER3");
372         assert(res.msgs[0].name == "ldaptestUSER3");
373
374 // This is a Samba special, and does not exist in real AD
375 //      println("Testing ldb.search for (dn=CN=ldaptestUSER3,CN=Users," + base_dn + ")");
376 //      var res = ldb.search("(dn=CN=ldaptestUSER3,CN=Users," + base_dn + ")");
377 //      if (res.error != 0 || res.msgs.length != 1) {
378 //              println("Could not find (dn=CN=ldaptestUSER3,CN=Users," + base_dn + ")");
379 //              assert(res.error == 0);
380 //              assert(res.msgs.length == 1);
381 //      }
382 //      assert(res.msgs[0].dn == ("CN=ldaptestUSER3,CN=Users," + base_dn));
383 //      assert(res.msgs[0].cn == "ldaptestUSER3");
384 //      assert(res.msgs[0].name == "ldaptestUSER3");
385
386         println("Testing ldb.search for (distinguishedName=CN=ldaptestUSER3,CN=Users," + base_dn + ")");
387         var res = ldb.search("(distinguishedName=CN=ldaptestUSER3,CN=Users," + base_dn + ")");
388         if (res.error != 0 || res.msgs.length != 1) {
389                 println("Could not find (dn=CN=ldaptestUSER3,CN=Users," + base_dn + ")");
390                 assert(res.error == 0);
391                 assert(res.msgs.length == 1);
392         }
393         assert(res.msgs[0].dn == ("CN=ldaptestUSER3,CN=Users," + base_dn));
394         assert(res.msgs[0].cn == "ldaptestUSER3");
395         assert(res.msgs[0].name == "ldaptestUSER3");
396
397         // ensure we cannot add it again
398         ok = ldb.add("
399 dn: cn=ldaptestuser3,cn=userS," + base_dn + "
400 objectClass: person
401 objectClass: user
402 cn: LDAPtestUSER3
403 ");
404 //LDB_ERR_ENTRY_ALREADY_EXISTS
405         if (ok.error != 68) {
406                 println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS, got: " + ok.errstr);
407                 assert(ok.error == 68);
408         }
409
410         // rename back
411         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser2,cn=users," + base_dn);
412         if (ok.error != 0) {
413                 println(ok.errstr);
414                 assert(ok.error == 0);
415         }
416
417         // ensure we cannnot rename it twice
418         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser2,cn=users," + base_dn);
419 //LDB_ERR_NO_SUCH_OBJECT
420         assert(ok.error == 32);
421
422         // ensure can now use that name
423         ok = ldb.add("
424 dn: cn=ldaptestuser3,cn=users," + base_dn + "
425 objectClass: person
426 objectClass: user
427 cn: LDAPtestUSER3
428 ");
429         
430         // ensure we now cannnot rename
431         ok = ldb.rename("cn=ldaptestuser2,cn=users," + base_dn, "cn=ldaptestuser3,cn=users," + base_dn);
432 //LDB_ERR_ENTRY_ALREADY_EXISTS
433         if (ok.error != 68) {
434                 println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS, got: " + ok.errstr);
435                 assert(ok.error == 68);
436         }
437         assert(ok.error == 68);
438         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser3,cn=configuration," + base_dn);
439         if (ok.error != 71 && ok.error != 64) {
440                 println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS or LDAP_NAMING_VIOLATION, got: " + ok.errstr);
441                 assert(ok.error == 71 || ok.error == 64);
442         }
443         assert(ok.error == 71 || ok.error == 64);
444
445         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser5,cn=users," + base_dn);
446         if (ok.error != 0) {
447                 println(ok.errstr);
448                 assert(ok.error == 0);
449         }
450
451         ok = ldb.del("cn=ldaptestuser5,cn=users," + base_dn);
452
453         ok = ldb.del("cn=ldaptestgroup2,cn=users," + base_dn);
454
455         ok = ldb.rename("cn=ldaptestgroup,cn=users," + base_dn, "cn=ldaptestgroup2,cn=users," + base_dn);
456         if (ok.error != 0) {
457                 println(ok.errstr);
458                 assert(ok.error == 0);
459         }
460
461         println("Testing subtree Renames");
462
463         ok = ldb.add("
464 dn: cn=ldaptestcontainer," + base_dn + "
465 objectClass: container
466 ");
467         
468         ok = ldb.add("
469 dn: CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + "
470 objectClass: person
471 objectClass: user
472 cn: LDAPtestUSER4
473 ");
474         if (ok.error != 0) {
475                 ok = ldb.del("cn=ldaptestuser4,cn=ldaptestcontainer," + base_dn);
476                 if (ok.error != 0) {
477                         println(ok.errstr);
478                         assert(ok.error == 0);
479                 }
480                 ok = ldb.add("
481 dn: CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + "
482 objectClass: person
483 objectClass: user
484 cn: LDAPtestUSER4
485 ");
486                 if (ok.error != 0) {
487                         println(ok.errstr);
488                         assert(ok.error == 0);
489                 }
490         }
491
492         ok = ldb.modify("
493 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
494 changetype: modify
495 add: member
496 member: cn=ldaptestuser4,cn=ldaptestcontainer," + base_dn + "
497 ");
498         if (ok.error != 0) {
499                 println("Failure adding ldaptestuser4 to a group");
500                 println(ok.errstr);
501                 assert(ok.error == 0);
502         }
503         
504         println("Testing ldb.rename of cn=ldaptestcontainer," + base_dn + " to cn=ldaptestcontainer2," + base_dn);
505         ok = ldb.rename("CN=ldaptestcontainer," + base_dn, "CN=ldaptestcontainer2," + base_dn);
506         if (ok.error != 0) {
507                 println(ok.errstr);
508                 assert(ok.error == 0);
509         }
510
511         println("Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user))");
512         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))");
513         if (res.error != 0 || res.msgs.length != 1) {
514                 println("Could not find (&(cn=ldaptestuser4)(objectClass=user))");
515                 assert(res.error == 0);
516                 assert(res.msgs.length == 1);
517         }
518
519         println("Testing subtree ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in (just renamed from) cn=ldaptestcontainer," + base_dn);
520         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer," + base_dn, ldb.SCOPE_SUBTREE);
521         if (res.error != 32) {
522                 println(res.errstr);
523                 assert(res.error == 32);
524         }
525
526         println("Testing one-level ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in (just renamed from) cn=ldaptestcontainer," + base_dn);
527         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer," + base_dn, ldb.SCOPE_ONELEVEL);
528         if (res.error != 32) {
529                 println(res.errstr);
530                 assert(res.error == 32);
531         }
532
533         println("Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in renamed container");
534         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer2," + base_dn, ldb.SCOPE_SUBTREE);
535         if (res.error != 0 || res.msgs.length != 1) {
536                 println("Could not find (&(cn=ldaptestuser4)(objectClass=user)) under cn=ldaptestcontainer2," + base_dn);
537                 assert(res.error == 0);
538                 assert(res.msgs.length == 1);
539         }
540
541         assert(res.msgs[0].dn == ("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn));
542         assert(strupper(res.msgs[0].memberOf[0]) == strupper(("CN=ldaptestgroup2,CN=Users," + base_dn)));
543
544         println("Testing ldb.search for (&(member=CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn + ")(objectclass=group)) to check subtree renames and linked attributes");
545         var res = ldb.search("(&(member=CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn + ")(objectclass=group))", base_dn, ldb.SCOPE_SUBTREE);
546         if (res.error != 0 || res.msgs.length != 1) {
547                 println("Could not find (&(member=CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn + ")(objectclass=group)), perhaps linked attributes are not conistant with subtree renames?");
548                 assert(res.error == 0);
549                 assert(res.msgs.length == 1);
550         }
551
552         println("Testing ldb.rename (into itself) of cn=ldaptestcontainer2," + base_dn + " to cn=ldaptestcontainer,cn=ldaptestcontainer2," + base_dn);
553         ok = ldb.rename("cn=ldaptestcontainer2," + base_dn, "cn=ldaptestcontainer,cn=ldaptestcontainer2," + base_dn);
554         if (ok.error != 53) { /* LDAP_UNWILLING_TO_PERFORM */
555                 println(ok.errstr);
556                 assert(ok.error == 53);
557         }
558
559         println("Testing ldb.rename (into non-existent container) of cn=ldaptestcontainer2," + base_dn + " to cn=ldaptestcontainer,cn=ldaptestcontainer3," + base_dn);
560         ok = ldb.rename("cn=ldaptestcontainer2," + base_dn, "cn=ldaptestcontainer,cn=ldaptestcontainer3," + base_dn);
561         if (ok.error != 53 && ok.error != 80) { /* LDAP_UNWILLING_TO_PERFORM or LDAP_OTHER*/
562                 println(ok.errstr);
563                 assert(ok.error == 53 || ok.error == 80);
564         }
565
566         println("Testing delete (should fail, not a leaf node) of renamed cn=ldaptestcontainer2," + base_dn);
567         ok = ldb.del("cn=ldaptestcontainer2," + base_dn);
568         if (ok.error != 66) { /* LDB_ERR_NOT_ALLOWED_ON_NON_LEAF */
569                 println(ok.errstr);
570                 assert(ok.error == 66);
571         }
572
573         println("Testing base ldb.search for CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn);
574         var res = ldb.search("(objectclass=*)", ("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn), ldb.SCOPE_BASE);
575         if (res.error == 0 && res.count == 1) {
576                 assert(res.error == 0 && res.count == 1);
577         }
578         var res = ldb.search("(cn=ldaptestuser40)", ("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn), ldb.SCOPE_BASE);
579         if (res.error == 0 && res.count == 0) {
580                 assert(res.error == 0 && res.count == 0);
581         }
582
583         println("Testing one-level ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in cn=ldaptestcontainer2," + base_dn);
584         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer2," + base_dn, ldb.SCOPE_ONELEVEL);
585         if (res.error == 0 && res.count == 0) {
586                 assert(res.error == 0 && res.count == 0);
587         }
588
589         println("Testing one-level ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in cn=ldaptestcontainer2," + base_dn);
590         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer2," + base_dn, ldb.SCOPE_SUBTREE);
591         if (res.error == 0 && res.count == 0) {
592                 assert(res.error == 0 && res.count == 0);
593         }
594
595         println("Testing delete of subtree renamed "+("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn));
596         ok = ldb.del(("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn));
597         if (ok.error != 0) {
598                 println(ok.errstr);
599                 assert(ok.error == 0);
600         }
601         println("Testing delete of renamed cn=ldaptestcontainer2," + base_dn);
602         ok = ldb.del("cn=ldaptestcontainer2," + base_dn);
603         if (ok.error != 0) {
604                 println(ok.errstr);
605                 assert(ok.error == 0);
606         }
607         
608         ok = ldb.add("
609 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
610 objectClass: user
611 ");
612         if (ok.error != 0) {
613                 ok = ldb.del("cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn);
614                 if (ok.error != 0) {
615                         println(ok.errstr);
616                         assert(ok.error == 0);
617                 }
618         ok = ldb.add("
619 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
620 objectClass: user
621 ");
622                 if (ok.error != 0) {
623                         println(ok.errstr);
624                         assert(ok.error == 0);
625                 }
626         }
627
628         ok = ldb.add("
629 dn: cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn + "
630 objectClass: user
631 ");
632         if (ok.error != 0) {
633                 ok = ldb.del("cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn);
634                 if (ok.error != 0) {
635                         println(ok.errstr);
636                         assert(ok.error == 0);
637                 }
638         ok = ldb.add("
639 dn: cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn + "
640 objectClass: user
641 ");
642                 if (ok.error != 0) {
643                         println(ok.errstr);
644                         assert(ok.error == 0);
645                 }
646         }
647
648         println("Testing ldb.search for (&(cn=ldaptestuser)(objectClass=user))");
649         var res = ldb.search("(&(cn=ldaptestuser)(objectClass=user))");
650         if (res.error != 0 || res.msgs.length != 1) {
651                 println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
652                 assert(res.error == 0);
653                 assert(res.msgs.length == 1);
654         }
655
656         assert(res.msgs[0].dn == ("CN=ldaptestuser,CN=Users," + base_dn));
657         assert(res.msgs[0].cn == "ldaptestuser");
658         assert(res.msgs[0].name == "ldaptestuser");
659         assert(res.msgs[0].objectClass[0] == "top");
660         assert(res.msgs[0].objectClass[1] == "person");
661         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
662         assert(res.msgs[0].objectClass[3] == "user");
663         assert(res.msgs[0].objectGUID != undefined);
664         assert(res.msgs[0].whenCreated != undefined);
665         assert(res.msgs[0].objectCategory == ("CN=Person,CN=Schema,CN=Configuration," + base_dn));
666         assert(res.msgs[0].sAMAccountType == 805306368);
667 //      assert(res[0].userAccountControl == 546);
668         assert(res.msgs[0].memberOf[0] == ("CN=ldaptestgroup2,CN=Users," + base_dn));
669         assert(res.msgs[0].memberOf.length == 1);
670  
671         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
672         var res2 = ldb.search("(&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
673         if (res2.error != 0 || res2.msgs.length != 1) {
674                 println("Could not find (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
675                 assert(res2.error == 0);
676                 assert(res2.msgs.length == 1);
677         }
678
679         assert(res.msgs[0].dn == res2.msgs[0].dn);
680
681         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon))");
682         var res3 = ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
683         if (res3.error != 0) {
684                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): " + res3.errstr);
685                 assert(res3.error == 0);
686         } else if (res3.msgs.length != 1) {
687                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): matched " + res3.msgs.length);
688                 assert(res3.msgs.length == 1);
689         }
690
691         assert(res.msgs[0].dn == res3.msgs[0].dn);
692
693         if (gc_ldb != undefined) {
694                 println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
695                 var res3gc = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
696                 if (res3gc.error != 0) {
697                         println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog: " + res3gc.errstr);
698                         assert(res3gc.error == 0);
699                 } else if (res3gc.msgs.length != 1) {
700                         println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog: matched " + res3gc.msgs.length);
701                         assert(res3gc.msgs.length == 1);
702                 }
703         
704                 assert(res.msgs[0].dn == res3gc.msgs[0].dn);
705         }
706
707         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in with 'phantom root' control");
708         var attrs = new Array("cn");
709         var controls = new Array("search_options:1:2");
710         var res3control = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
711         if (res3control.error != 0 || res3control.msgs.length != 1) {
712                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
713                 assert(res3control.error == 0);
714                 assert(res3control.msgs.length == 1);
715         }
716         
717         assert(res.msgs[0].dn == res3control.msgs[0].dn);
718
719         ok = ldb.del(res.msgs[0].dn);
720         if (ok.error != 0) {
721                 println(ok.errstr);
722                 assert(ok.error == 0);
723         }
724
725         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectClass=user))");
726         var res = ldb.search("(&(cn=ldaptestcomputer)(objectClass=user))");
727         if (res.error != 0 || res.msgs.length != 1) {
728                 println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
729                 assert(res.error == 0);
730                 assert(res.msgs.length == 1);
731         }
732
733         assert(res.msgs[0].dn == ("CN=ldaptestcomputer,CN=Computers," + base_dn));
734         assert(res.msgs[0].cn == "ldaptestcomputer");
735         assert(res.msgs[0].name == "ldaptestcomputer");
736         assert(res.msgs[0].objectClass[0] == "top");
737         assert(res.msgs[0].objectClass[1] == "person");
738         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
739         assert(res.msgs[0].objectClass[3] == "user");
740         assert(res.msgs[0].objectClass[4] == "computer");
741         assert(res.msgs[0].objectGUID != undefined);
742         assert(res.msgs[0].whenCreated != undefined);
743         assert(res.msgs[0].objectCategory == ("CN=Computer,CN=Schema,CN=Configuration," + base_dn));
744         assert(res.msgs[0].primaryGroupID == 513);
745 //      assert(res.msgs[0].sAMAccountType == 805306368);
746 //      assert(res.msgs[0].userAccountControl == 546);
747         assert(res.msgs[0].memberOf[0] == ("CN=ldaptestgroup2,CN=Users," + base_dn));
748         assert(res.msgs[0].memberOf.length == 1);
749
750         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
751         var res2 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
752         if (res2.error != 0 || res2.msgs.length != 1) {
753                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
754                 assert(res2.error == 0);
755                 assert(res2.msgs.length == 1);
756         }
757
758         assert(res.msgs[0].dn == res2.msgs[0].dn);
759
760         if (gc_ldb != undefined) {
761                 println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
762                 var res2gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
763                 if (res2gc.error != 0 || res2gc.msgs.length != 1) {
764                         println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
765                         assert(res2gc.error == 0);
766                         assert(res2gc.msgs.length == 1);
767                 }
768
769                 assert(res.msgs[0].dn == res2gc.msgs[0].dn);
770         }
771
772         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
773         var res3 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
774         if (res3.error != 0 || res3.msgs.length != 1) {
775                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
776                 assert(res3.error == 0);
777                 assert(res3.msgs.length == 1);
778         }
779
780         assert(res.msgs[0].dn == res3.msgs[0].dn);
781
782         if (gc_ldb != undefined) {
783                 println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
784                 var res3gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
785                 if (res3gc.error != 0 || res3gc.msgs.length != 1) {
786                         println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
787                         assert(res3gc.error == 0);
788                         assert(res3gc.msgs.length == 1);
789                 }
790
791                 assert(res.msgs[0].dn == res3gc.msgs[0].dn);
792         }
793
794         println("Testing ldb.search for (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
795         var res4 = ldb.search("(&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
796         if (res4.error != 0 || res4.msgs.length != 1) {
797                 println("Could not find (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
798                 assert(res4.error == 0);
799                 assert(res4.msgs.length == 1);
800         }
801
802         assert(res.msgs[0].dn == res4.msgs[0].dn);
803
804         println("Testing ldb.search for (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
805         var res5 = ldb.search("(&(cn=ldaptestcomput*)(objectCategory=compuTER))");
806         if (res5.error != 0 || res5.msgs.length != 1) {
807                 println("Could not find (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
808                 assert(res5.error == 0);
809                 assert(res5.msgs.length == 1);
810         }
811
812         assert(res.msgs[0].dn == res5.msgs[0].dn);
813
814         println("Testing ldb.search for (&(cn=*daptestcomputer)(objectCategory=compuTER))");
815         var res6 = ldb.search("(&(cn=*daptestcomputer)(objectCategory=compuTER))");
816         if (res6.error != 0 || res6.msgs.length != 1) {
817                 println("Could not find (&(cn=*daptestcomputer)(objectCategory=compuTER))");
818                 assert(res6.error == 0);
819                 assert(res6.msgs.length == 1);
820         }
821
822         assert(res.msgs[0].dn == res6.msgs[0].dn);
823
824         ok = ldb.del(res.msgs[0].dn);
825         if (ok.error != 0) {
826                 println(ok.errstr);
827                 assert(ok.error == 0);
828         }
829
830         println("Testing ldb.search for (&(cn=ldaptest2computer)(objectClass=user))");
831         var res = ldb.search("(&(cn=ldaptest2computer)(objectClass=user))");
832         if (res.error != 0 || res.msgs.length != 1) {
833                 println("Could not find (&(cn=ldaptest2computer)(objectClass=user))");
834                 assert(res.error == 0);
835                 assert(res.msgs.length == 1);
836         }
837
838         assert(res.msgs[0].dn == ("CN=ldaptest2computer,CN=Computers," + base_dn));
839         assert(res.msgs[0].cn == "ldaptest2computer");
840         assert(res.msgs[0].name == "ldaptest2computer");
841         assert(res.msgs[0].objectClass[0] == "top");
842         assert(res.msgs[0].objectClass[1] == "person");
843         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
844         assert(res.msgs[0].objectClass[3] == "user");
845         assert(res.msgs[0].objectClass[4] == "computer");
846         assert(res.msgs[0].objectGUID != undefined);
847         assert(res.msgs[0].whenCreated != undefined);
848         assert(res.msgs[0].objectCategory == "cn=Computer,cn=Schema,cn=Configuration," + base_dn);
849         assert(res.msgs[0].sAMAccountType == 805306369);
850 //      assert(res.msgs[0].userAccountControl == 4098);
851
852
853         ok = ldb.del(res.msgs[0].dn);
854         if (ok.error != 0) {
855                 println(ok.errstr);
856                 assert(ok.error == 0);
857         }
858
859         var attrs = new Array("cn", "name", "objectClass", "objectGUID", "whenCreated", "nTSecurityDescriptor", "memberOf");
860         println("Testing ldb.search for (&(cn=ldaptestUSer2)(objectClass=user))");
861         var res = ldb.search("(&(cn=ldaptestUSer2)(objectClass=user))", base_dn, ldb.SCOPE_SUBTREE, attrs);
862         if (res.error != 0 || res.msgs.length != 1) {
863                 println("Could not find (&(cn=ldaptestUSer2)(objectClass=user))");
864                 assert(res.error == 0);
865                 assert(res.msgs.length == 1);
866         }
867
868         assert(res.msgs[0].dn == ("CN=ldaptestuser2,CN=Users," + base_dn));
869         assert(res.msgs[0].cn == "ldaptestuser2");
870         assert(res.msgs[0].name == "ldaptestuser2");
871         assert(res.msgs[0].objectClass[0] == "top");
872         assert(res.msgs[0].objectClass[1] == "person");
873         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
874         assert(res.msgs[0].objectClass[3] == "user");
875         assert(res.msgs[0].objectGUID != undefined);
876         assert(res.msgs[0].whenCreated != undefined);
877         assert(res.msgs[0].nTSecurityDescriptor != undefined);
878         assert(res.msgs[0].memberOf[0] == ("CN=ldaptestgroup2,CN=Users," + base_dn));
879
880         var attrs = new Array("cn", "name", "objectClass", "objectGUID", "whenCreated", "nTSecurityDescriptor", "member");
881         println("Testing ldb.search for (&(cn=ldaptestgroup2)(objectClass=group))");
882         var res = ldb.search("(&(cn=ldaptestgroup2)(objectClass=group))", base_dn, ldb.SCOPE_SUBTREE, attrs);
883         if (res.error != 0 || res.msgs.length != 1) {
884                 println("Could not find (&(cn=ldaptestgroup2)(objectClass=group))");
885                 assert(res.error == 0);
886                 assert(res.msgs.length == 1);
887         }
888
889         assert(res.msgs[0].dn == ("CN=ldaptestgroup2,CN=Users," + base_dn));
890         assert(res.msgs[0].cn == "ldaptestgroup2");
891         assert(res.msgs[0].name == "ldaptestgroup2");
892         assert(res.msgs[0].objectClass[0] == "top");
893         assert(res.msgs[0].objectClass[1] == "group");
894         assert(res.msgs[0].objectGUID != undefined);
895         assert(res.msgs[0].whenCreated != undefined);
896         assert(res.msgs[0].nTSecurityDescriptor != undefined);
897         assert(res.msgs[0].member[0] == ("CN=ldaptestuser2,CN=Users," + base_dn));
898         assert(res.msgs[0].member.length == 1);
899
900         ok = ldb.modify("
901 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
902 changetype: modify
903 replace: member
904 member: CN=ldaptestuser2,CN=Users," + base_dn + "
905 member: CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn + "
906 ");
907         if (ok.error != 0) {
908                 println("Failure testing replace of linked attributes");
909                 println(ok.errstr);
910                 assert(ok.error == 0);
911         }
912         
913         println("Testing Linked attribute behaviours");
914         ok = ldb.modify("
915 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
916 changetype: modify
917 delete: member
918 ");
919         if (ok.error != 0) {
920                 println("Failure testing delete of linked attributes");
921                 println(ok.errstr);
922                 assert(ok.error == 0);
923         }
924         
925         ok = ldb.modify("
926 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
927 changetype: modify
928 add: member
929 member: CN=ldaptestuser2,CN=Users," + base_dn + "
930 member: CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn + "
931 ");
932         if (ok.error != 0) {
933                 println("Failure testing add of linked attributes");
934                 println(ok.errstr);
935                 assert(ok.error == 0);
936         }
937         
938         ok = ldb.modify("
939 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
940 changetype: modify
941 replace: member
942 ");
943         if (ok.error != 0) {
944                 println("Failure testing replace of linked attributes");
945                 println(ok.errstr);
946                 assert(ok.error == 0);
947         }
948         
949         ok = ldb.modify("
950 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
951 changetype: modify
952 add: member
953 member: CN=ldaptestuser2,CN=Users," + base_dn + "
954 member: CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn + "
955 ");
956         if (ok.error != 0) {
957                 println("Failure testing add of linked attributes");
958                 println(ok.errstr);
959                 assert(ok.error == 0);
960         }
961         
962         ok = ldb.modify("
963 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
964 changetype: modify
965 delete: member
966 member: CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn + "
967 ");
968         if (ok.error != 0) {
969                 println("Failure testing replace of linked attributes");
970                 println(ok.errstr);
971                 assert(ok.error == 0);
972         }
973         
974         var res = ldb.search("(&(cn=ldaptestgroup2)(objectClass=group))", base_dn, ldb.SCOPE_SUBTREE, attrs);
975         if (res.error != 0 || res.msgs.length != 1) {
976                 println("Could not find (&(cn=ldaptestgroup2)(objectClass=group))");
977                 assert(res.error == 0);
978                 assert(res.msgs.length == 1);
979         }
980
981         assert(res.msgs[0].dn == ("CN=ldaptestgroup2,CN=Users," + base_dn));
982         assert(res.msgs[0].member[0] == ("CN=ldaptestuser2,CN=Users," + base_dn));
983         assert(res.msgs[0].member.length == 1);
984
985         ok = ldb.del(("CN=ldaptestuser2,CN=Users," + base_dn));
986         if (ok.error != 0) {
987                 println(ok.errstr);
988                 assert(ok.error == 0);
989         }
990
991         var attrs = new Array("cn", "name", "objectClass", "objectGUID", "whenCreated", "nTSecurityDescriptor", "member");
992         println("Testing ldb.search for (&(cn=ldaptestgroup2)(objectClass=group)) to check linked delete");
993         var res = ldb.search("(&(cn=ldaptestgroup2)(objectClass=group))", base_dn, ldb.SCOPE_SUBTREE, attrs);
994         if (res.error != 0 || res.msgs.length != 1) {
995                 println("Could not find (&(cn=ldaptestgroup2)(objectClass=group)) to check linked delete");
996                 assert(res.error == 0);
997                 assert(res.msgs.length == 1);
998         }
999
1000         assert(res.msgs[0].dn == ("CN=ldaptestgroup2,CN=Users," + base_dn));
1001         assert(res.msgs[0].member == undefined);
1002
1003         println("Testing ldb.search for (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
1004         var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
1005
1006         if (res.error != 0 || res.msgs.length != 1) {
1007                 println("Could not find (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
1008                 assert(res.error == 0);
1009                 assert(res.msgs.length == 1);
1010         }
1011
1012         assert(res.msgs[0].dn == ("CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn));
1013         assert(res.msgs[0].cn == "ldaptestutf8user èùéìòà");
1014         assert(res.msgs[0].name == "ldaptestutf8user èùéìòà");
1015         assert(res.msgs[0].objectClass[0] == "top");
1016         assert(res.msgs[0].objectClass[1] == "person");
1017         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
1018         assert(res.msgs[0].objectClass[3] == "user");
1019         assert(res.msgs[0].objectGUID != undefined);
1020         assert(res.msgs[0].whenCreated != undefined);
1021
1022         ok = ldb.del(res.msgs[0].dn);
1023         if (ok.error != 0) {
1024                 println(ok.errstr);
1025                 assert(ok.error == 0);
1026         }
1027
1028         println("Testing ldb.search for (&(cn=ldaptestutf8user2*)(objectClass=user))");
1029         var res = ldb.search("(&(cn=ldaptestutf8user2*)(objectClass=user))");
1030         if (res.error != 0 || res.msgs.length != 1) {
1031                 println("Could not find (&(cn=ldaptestutf8user2*)(objectClass=user))");
1032                 assert(res.error == 0);
1033                 assert(res.msgs.length == 1);
1034         }
1035
1036         ok = ldb.del(res.msgs[0].dn);
1037         if (ok.error != 0) {
1038                 println(ok.errstr);
1039                 assert(ok.error == 0);
1040         }
1041
1042         ok = ldb.del(("CN=ldaptestgroup2,CN=Users," + base_dn))
1043         if (ok.error != 0) {
1044                 println(ok.errstr);
1045                 assert(ok.error == 0);
1046         }
1047
1048         println("Testing ldb.search for (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
1049         var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
1050
1051         if (res.error != 0 || res.msgs.length != 1) {
1052                 println("Could not find (expect space collapse, win2k3 fails) (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
1053         } else {
1054                 assert(res.msgs[0].dn == ("cn=ldaptestutf8user2 èùéìòà,cn=users," + base_dn));
1055                 assert(res.msgs[0].cn == "ldaptestutf8user2 èùéìòà");
1056         }
1057
1058         println("Testing that we can't get at the configuration DN from the main search base");
1059         var attrs = new Array("cn");
1060         var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
1061         assert(res.error == 0);
1062         if (res.msgs.length != 0) {
1063                 println("Got configuration DN " + res.msgs[0].dn + " which should not be able to be seen from main search base");
1064         }
1065         assert(res.msgs.length == 0);
1066
1067         println("Testing that we can get at the configuration DN from the main search base on the LDAP port with the 'phantom root' search_options control");
1068         var attrs = new Array("cn");
1069         var controls = new Array("search_options:1:2");
1070         var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
1071         assert(res.error == 0);
1072         assert(res.msgs.length > 0);
1073
1074         if (gc_ldb != undefined) {
1075                 println("Testing that we can get at the configuration DN from the main search base on the GC port with the search_options control == 0");
1076                 var attrs = new Array("cn");
1077                 var controls = new Array("search_options:1:0");
1078                 var res = gc_ldb.search("objectClass=crossRef", base_dn, gc_ldb.SCOPE_SUBTREE, attrs, controls);
1079                 assert(res.error == 0);
1080                 assert(res.msgs.length > 0);
1081
1082                 println("Testing that we do find configuration elements in the global catlog");
1083                 var attrs = new Array("cn");
1084                 var res = gc_ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
1085                 assert(res.error == 0);
1086                 assert (res.msgs.length > 0);
1087         
1088                 println("Testing that we do find configuration elements and user elements at the same time");
1089                 var attrs = new Array("cn");
1090                 var res = gc_ldb.search("(|(objectClass=crossRef)(objectClass=person))", base_dn, ldb.SCOPE_SUBTREE, attrs);
1091                 assert(res.error == 0);
1092                 assert (res.msgs.length > 0);
1093
1094                 println("Testing that we do find configuration elements in the global catlog, with the configuration basedn");
1095                 var attrs = new Array("cn");
1096                 var res = gc_ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
1097                 assert(res.error == 0);
1098                 assert (res.msgs.length > 0);
1099         }
1100
1101         println("Testing that we can get at the configuration DN on the main LDAP port");
1102         var attrs = new Array("cn");
1103         var res = ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
1104         assert(res.error == 0);
1105         assert (res.msgs.length > 0);
1106
1107         println("Testing objectCategory canonacolisation");
1108         var attrs = new Array("cn");
1109         var res = ldb.search("objectCategory=ntDsDSA", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
1110         assert(res.error == 0);
1111         if (res.msgs.length == 0) {
1112                 println("Didn't find any records with objectCategory=ntDsDSA");
1113         }
1114         assert(res.msgs.length != 0);
1115         
1116         var attrs = new Array("cn");
1117         var res = ldb.search("objectCategory=CN=ntDs-DSA," + schema_dn, configuration_dn, ldb.SCOPE_SUBTREE, attrs);
1118         assert(res.error == 0);
1119         if (res.msgs.length == 0) {
1120                 println("Didn't find any records with objectCategory=CN=ntDs-DSA," + schema_dn);
1121         }
1122         assert(res.msgs.length != 0);
1123         
1124         println("Testing objectClass attribute order on "+ base_dn);
1125         var attrs = new Array("objectClass");
1126         var res = ldb.search("objectClass=domain", base_dn, ldb.SCOPE_BASE, attrs);
1127         assert(res.error == 0);
1128         assert(res.msgs.length == 1);
1129
1130         assert(res.msgs[0].objectClass[0] == "top");
1131         assert(res.msgs[0].objectClass[1] == "domain");
1132         assert(res.msgs[0].objectClass[2] == "domainDNS");
1133
1134 //  check enumeration
1135
1136         var attrs = new Array("cn");
1137         println("Testing ldb.search for objectCategory=person");
1138         var res = ldb.search("objectCategory=person", base_dn, ldb.SCOPE_SUBTREE, attrs);
1139         assert(res.error == 0);
1140         assert(res.msgs.length > 0);
1141
1142         var attrs = new Array("cn");
1143         var controls = new Array("domain_scope:1");
1144         println("Testing ldb.search for objectCategory=person with domain scope control");
1145         var res = ldb.search("objectCategory=person", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
1146         assert(res.error == 0);
1147         assert(res.msgs.length > 0);
1148  
1149         var attrs = new Array("cn");
1150         println("Testing ldb.search for objectCategory=user");
1151         var res = ldb.search("objectCategory=user", base_dn, ldb.SCOPE_SUBTREE, attrs);
1152         assert(res.error == 0);
1153         assert(res.msgs.length > 0);
1154
1155         var attrs = new Array("cn");
1156         var controls = new Array("domain_scope:1");
1157         println("Testing ldb.search for objectCategory=user with domain scope control");
1158         var res = ldb.search("objectCategory=user", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
1159         assert(res.error == 0);
1160         assert(res.msgs.length > 0);
1161         
1162         var attrs = new Array("cn");
1163         println("Testing ldb.search for objectCategory=group");
1164         var res = ldb.search("objectCategory=group", base_dn, ldb.SCOPE_SUBTREE, attrs);
1165         assert(res.error == 0);
1166         assert(res.msgs.length > 0);
1167
1168         var attrs = new Array("cn");
1169         var controls = new Array("domain_scope:1");
1170         println("Testing ldb.search for objectCategory=group with domain scope control");
1171         var res = ldb.search("objectCategory=group", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
1172         assert(res.error == 0);
1173         assert(res.msgs.length > 0);
1174         
1175 }
1176
1177 function basedn_tests(ldb, gc_ldb)
1178 {
1179         println("Testing for all rootDSE attributes");
1180         var attrs = new Array();
1181         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1182         assert(res.error == 0);
1183         assert(res.msgs.length == 1);
1184
1185         println("Testing for highestCommittedUSN");
1186         var attrs = new Array("highestCommittedUSN");
1187         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1188         assert(res.error == 0);
1189         assert(res.msgs.length == 1);
1190         assert(res.msgs[0].highestCommittedUSN != undefined);
1191         assert(res.msgs[0].highestCommittedUSN != 0);
1192
1193         println("Testing for netlogon via LDAP");
1194         var attrs = new Array("netlogon");
1195         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1196         assert(res.error == 0);
1197         assert(res.msgs.length == 0);
1198
1199         println("Testing for netlogon and highestCommittedUSN via LDAP");
1200         var attrs = new Array("netlogon", "highestCommittedUSN");
1201         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1202         assert(res.error == 0);
1203         assert(res.msgs.length == 0);
1204 }
1205
1206 function find_basedn(ldb)
1207 {
1208     var attrs = new Array("defaultNamingContext");
1209     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1210     assert(res.error == 0);
1211     assert(res.msgs.length == 1);
1212     return res.msgs[0].defaultNamingContext;
1213 }
1214
1215 function find_configurationdn(ldb)
1216 {
1217     var attrs = new Array("configurationNamingContext");
1218     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1219     assert(res.error == 0);
1220     assert(res.msgs.length == 1);
1221     return res.msgs[0].configurationNamingContext;
1222 }
1223
1224 function find_schemadn(ldb)
1225 {
1226     var attrs = new Array("schemaNamingContext");
1227     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1228     assert(res.error == 0);
1229     assert(res.msgs.length == 1);
1230     return res.msgs[0].schemaNamingContext;
1231 }
1232
1233 /* use command line creds if available */
1234 ldb.credentials = options.get_credentials();
1235 gc_ldb.credentials = options.get_credentials();
1236
1237 var ok = ldb.connect("ldap://" + host);
1238 var base_dn = find_basedn(ldb);
1239
1240 var configuration_dn = find_configurationdn(ldb);
1241 var schema_dn = find_schemadn(ldb);
1242
1243 println("baseDN: %s\n", base_dn);
1244
1245 var ok = gc_ldb.connect("ldap://" + host + ":3268");
1246 if (!ok) {
1247         gc_ldb = undefined;
1248 }
1249
1250 basic_tests(ldb, gc_ldb, base_dn, configuration_dn, schema_dn)
1251
1252 basedn_tests(ldb, gc_ldb)
1253
1254 return 0;