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