c3003355b526fba0e80ec939e32486e2eb5d4e0f
[jra/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         var ok = ldb.add("
35 dn: cn=ldaptestuser,cn=uSers," + base_dn + "
36 objectclass: user
37 objectclass: person
38 cN: LDAPtestUSER
39 ");
40         if (ok.error != 0) {
41                 ok = ldb.del("cn=ldaptestuser,cn=users," + base_dn);
42                 if (ok.error != 0) {
43                         println(ok.errstr);
44                         assert(ok.error == 0);
45                 }
46                 ok = ldb.add("
47 dn: cn=ldaptestuser,cn=uSers," + base_dn + "
48 objectclass: user
49 objectclass: person
50 cN: LDAPtestUSER
51 ");
52                 if (ok.error != 0) {
53                         println(ok.errstr);
54                         assert(ok.error == 0);
55                 }
56         }
57
58         var ok = ldb.add("
59 dn: cn=ldaptestcomputer,cn=computers," + base_dn + "
60 objectclass: computer
61 cN: LDAPtestCOMPUTER
62 ");
63         if (ok.error != 0) {
64                 ok = ldb.del("cn=ldaptestcomputer,cn=computers," + base_dn);
65                 if (ok.error != 0) {
66                         println(ok.errstr);
67                         assert(ok.error == 0);
68                 }
69                 ok = ldb.add("
70 dn: cn=ldaptestcomputer,cn=computers," + base_dn + "
71 objectClass: computer
72 cn: LDAPtestCOMPUTER
73 ");
74                 if (ok.error != 0) {
75                         println(ok.errstr);
76                         assert(ok.error == 0);
77                 }
78         }
79
80         var ok = ldb.add("
81 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
82 objectClass: computer
83 cn: LDAPtest2COMPUTER
84 userAccountControl: 4096
85 ");
86         if (ok.error != 0) {
87                 ok = ldb.del("cn=ldaptest2computer,cn=computers," + base_dn);
88                 if (ok.error != 0) {
89                         println(ok.errstr);
90                         assert(ok.error == 0);
91                 }
92                 ok = ldb.add("
93 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
94 objectClass: computer
95 cn: LDAPtest2COMPUTER
96 userAccountControl: 4096
97 ");
98                 if (ok.error != 0) {
99                         println(ok.errstr);
100                         assert(ok.error == 0);
101                 }
102         }
103
104             ok = ldb.modify("
105 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
106 changetype: modify
107 replace: servicePrincipalName
108 servicePrincipalName: host/ldaptest2computer
109 servicePrincipalName: host/ldaptest2computer
110 servicePrincipalName: cifs/ldaptest2computer
111 ");
112
113 //LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS
114                 if (ok.error != 20) {
115                         println("Expected error LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS, got :" + ok.errstr);
116                         assert(ok.error == 20);
117                 }
118
119         ok = ldb.add("
120 dn: cn=ldaptestuser2,cn=useRs," + base_dn + "
121 objectClass: person
122 objectClass: user
123 cn: LDAPtestUSER2
124 ");
125         if (ok.error != 0) {
126                 ok = ldb.del("cn=ldaptestuser2,cn=users," + base_dn);
127                 if (ok.error != 0) {
128                         println(ok.errstr);
129                         assert(ok.error == 0);
130                 }
131                 ok = ldb.add("
132 dn: cn=ldaptestuser2,cn=useRs," + base_dn + "
133 objectClass: person
134 objectClass: user
135 cn: LDAPtestUSER2
136 ");
137                 if (ok.error != 0) {
138                         println(ok.errstr);
139                         assert(ok.error == 0);
140                 }
141         }
142
143         ok = ldb.del("cn=ldaptestuser3,cn=users," + base_dn);
144
145         println("Testing Renames");
146
147         ok = ldb.rename("cn=ldaptestuser2,cn=users," + base_dn, "cn=ldaptestuser3,cn=users," + base_dn);
148         if (ok.error != 0) {
149                 println("Could not rename cn=ldaptestuser2,cn=users," + base_dn + " into cn=ldaptestuser3,cn=users," + base_dn + ": " + ok.errstr);
150                 assert(ok.error == 0);
151         }
152
153         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser3,cn=users," + base_dn);
154         if (ok.error != 0) {
155                 println("Could not rename cn=ldaptestuser3,cn=users," + base_dn + " onto itself: " + ok.errstr);
156                 assert(ok.error == 0);
157         }
158
159         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestUSER3,cn=users," + base_dn);
160         if (ok.error != 0) {
161                 println("Could not rename cn=ldaptestuser3,cn=users," + base_dn + " into cn=ldaptestUSER3,cn=users," + base_dn + ": " + ok.errstr);
162                 assert(ok.error == 0);
163         }
164
165         println("Testing ldb.search for (&(cn=ldaptestuser3)(objectClass=user))");
166         var res = ldb.search("(&(cn=ldaptestuser3)(objectClass=user))");
167         if (res.error != 0 || res.msgs.length != 1) {
168                 println("Could not find (&(cn=ldaptestuser3)(objectClass=user))");
169                 assert(res.error == 0);
170                 assert(res.msgs.length == 1);
171         }
172
173         assert(res.msgs[0].dn == ("CN=ldaptestUSER3,CN=Users," + base_dn));
174         assert(res.msgs[0].cn == "ldaptestUSER3");
175         assert(res.msgs[0].name == "ldaptestUSER3");
176
177         // ensure we cannot add it again
178         ok = ldb.add("
179 dn: cn=ldaptestuser3,cn=userS," + base_dn + "
180 objectClass: person
181 objectClass: user
182 cn: LDAPtestUSER3
183 ");
184 //LDB_ERR_ENTRY_ALREADY_EXISTS
185         if (ok.error != 68) {
186                 println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS, got: " + ok.errstr);
187                 assert(ok.error == 68);
188         }
189
190         // rename back
191         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser2,cn=users," + base_dn);
192         if (ok.error != 0) {
193                 println(ok.errstr);
194                 assert(ok.error == 0);
195         }
196
197         // ensure we cannnot rename it twice
198         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser2,cn=users," + base_dn);
199 //LDB_ERR_NO_SUCH_OBJECT
200         assert(ok.error == 32);
201
202         // ensure can now use that name
203         ok = ldb.add("
204 dn: cn=ldaptestuser3,cn=users," + base_dn + "
205 objectClass: person
206 objectClass: user
207 cn: LDAPtestUSER3
208 ");
209         
210         // ensure we now cannnot rename
211         ok = ldb.rename("cn=ldaptestuser2,cn=users," + base_dn, "cn=ldaptestuser3,cn=users," + base_dn);
212 //LDB_ERR_ENTRY_ALREADY_EXISTS
213         if (ok.error != 68) {
214                 println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS, got: " + ok.errstr);
215                 assert(ok.error == 68);
216         }
217         assert(ok.error == 68);
218         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser3,cn=configuration," + base_dn);
219         if (ok.error != 71 && ok.error != 64) {
220                 println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS or LDAP_NAMING_VIOLATION, got: " + ok.errstr);
221                 assert(ok.error == 71 || ok.error == 64);
222         }
223         assert(ok.error == 71 || ok.error == 64);
224
225         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser5,cn=users," + base_dn);
226         if (ok.error != 0) {
227                 println(ok.errstr);
228                 assert(ok.error == 0);
229         }
230
231         ok = ldb.del("cn=ldaptestuser5,cn=users," + base_dn);
232
233         println("Testing subtree Renames");
234
235         ok = ldb.add("
236 dn: cn=ldaptestcontainer," + base_dn + "
237 objectClass: container
238 ");
239         
240         ok = ldb.add("
241 dn: CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + "
242 objectClass: person
243 objectClass: user
244 cn: LDAPtestUSER4
245 ");
246         if (ok.error != 0) {
247                 ok = ldb.del("cn=ldaptestuser4,cn=ldaptestcontainer," + base_dn);
248                 if (ok.error != 0) {
249                         println(ok.errstr);
250                         assert(ok.error == 0);
251                 }
252                 ok = ldb.add("
253 dn: CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + "
254 objectClass: person
255 objectClass: user
256 cn: LDAPtestUSER4
257 ");
258                 if (ok.error != 0) {
259                         println(ok.errstr);
260                         assert(ok.error == 0);
261                 }
262         }
263
264         println("Testing ldb.rename of cn=ldaptestcontainer," + base_dn + " to cn=ldaptestcontainer2," + base_dn);
265         ok = ldb.rename("CN=ldaptestcontainer," + base_dn, "CN=ldaptestcontainer2," + base_dn);
266         if (ok.error != 0) {
267                 println(ok.errstr);
268                 assert(ok.error == 0);
269         }
270
271         println("Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user))");
272         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))");
273         if (res.error != 0 || res.msgs.length != 1) {
274                 println("Could not find (&(cn=ldaptestuser4)(objectClass=user))");
275                 assert(res.error == 0);
276                 assert(res.msgs.length == 1);
277         }
278
279         assert(res.msgs[0].dn == ("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn));
280
281         println("Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in renamed container");
282         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer2," + base_dn, ldb.SCOPE_SUBTREE);
283         if (res.error != 0 || res.msgs.length != 1) {
284                 println("Could not find (&(cn=ldaptestuser4)(objectClass=user)) under cn=ldaptestcontainer2," + base_dn);
285                 assert(res.error == 0);
286                 assert(res.msgs.length == 1);
287         }
288
289         assert(res.msgs[0].dn == ("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn));
290
291         println("Testing delete (should fail, not a leaf node) of renamed cn=ldaptestcontainer2," + base_dn);
292         ok = ldb.del("cn=ldaptestcontainer2," + base_dn);
293         if (ok.error != 66) { /* LDB_ERR_NOT_ALLOWED_ON_NON_LEAF */
294                 println(ok.errstr);
295                 assert(ok.error == 66);
296         }
297         println("Testing delete of subtree renamed "+res.msgs[0].dn);
298         ok = ldb.del(res.msgs[0].dn);
299         if (ok.error != 0) {
300                 println(ok.errstr);
301                 assert(ok.error == 0);
302         }
303         println("Testing delete of renamed cn=ldaptestcontainer2," + base_dn);
304         ok = ldb.del("cn=ldaptestcontainer2," + base_dn);
305         if (ok.error != 0) {
306                 println(ok.errstr);
307                 assert(ok.error == 0);
308         }
309         
310         ok = ldb.add("
311 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
312 objectClass: user
313 ");
314         if (ok.error != 0) {
315                 ok = ldb.del("cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn);
316                 if (ok.error != 0) {
317                         println(ok.errstr);
318                         assert(ok.error == 0);
319                 }
320         ok = ldb.add("
321 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
322 objectClass: user
323 ");
324                 if (ok.error != 0) {
325                         println(ok.errstr);
326                         assert(ok.error == 0);
327                 }
328         }
329
330         ok = ldb.add("
331 dn: cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn + "
332 objectClass: user
333 ");
334         if (ok.error != 0) {
335                 ok = ldb.del("cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn);
336                 if (ok.error != 0) {
337                         println(ok.errstr);
338                         assert(ok.error == 0);
339                 }
340         ok = ldb.add("
341 dn: cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn + "
342 objectClass: user
343 ");
344                 if (ok.error != 0) {
345                         println(ok.errstr);
346                         assert(ok.error == 0);
347                 }
348         }
349
350         println("Testing ldb.search for (&(cn=ldaptestuser)(objectClass=user))");
351         var res = ldb.search("(&(cn=ldaptestuser)(objectClass=user))");
352         if (res.error != 0 || res.msgs.length != 1) {
353                 println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
354                 assert(res.error == 0);
355                 assert(res.msgs.length == 1);
356         }
357
358         assert(res.msgs[0].dn == ("CN=ldaptestuser,CN=Users," + base_dn));
359         assert(res.msgs[0].cn == "ldaptestuser");
360         assert(res.msgs[0].name == "ldaptestuser");
361         assert(res.msgs[0].objectClass[0] == "top");
362         assert(res.msgs[0].objectClass[1] == "person");
363         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
364         assert(res.msgs[0].objectClass[3] == "user");
365         assert(res.msgs[0].objectGUID != undefined);
366         assert(res.msgs[0].whenCreated != undefined);
367         assert(res.msgs[0].objectCategory == ("CN=Person,CN=Schema,CN=Configuration," + base_dn));
368         assert(res.msgs[0].sAMAccountType == 805306368);
369 //      assert(res[0].userAccountControl == 546);
370  
371         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
372         var res2 = ldb.search("(&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
373         if (res2.error != 0 || res2.msgs.length != 1) {
374                 println("Could not find (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
375                 assert(res2.error == 0);
376                 assert(res2.msgs.length == 1);
377         }
378
379         assert(res.msgs[0].dn == res2.msgs[0].dn);
380
381         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon))");
382         var res3 = ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
383         if (res3.error != 0) {
384                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): " + res3.errstr);
385                 assert(res3.error == 0);
386         } else if (res3.msgs.length != 1) {
387                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): matched " + res3.msgs.length);
388                 assert(res3.msgs.length == 1);
389         }
390
391         assert(res.msgs[0].dn == res3.msgs[0].dn);
392
393         if (gc_ldb != undefined) {
394                 println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
395                 var res3gc = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
396                 if (res3gc.error != 0) {
397                         println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog: " + res3gc.errstr);
398                         assert(res3gc.error == 0);
399                 } else if (res3gc.msgs.length != 1) {
400                         println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog: matched " + res3gc.msgs.length);
401                         assert(res3gc.msgs.length == 1);
402                 }
403         
404                 assert(res.msgs[0].dn == res3gc.msgs[0].dn);
405         }
406
407         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in with 'phantom root' control");
408         var attrs = new Array("cn");
409         var controls = new Array("search_options:1:2");
410         var res3control = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
411         if (res3control.error != 0 || res3control.msgs.length != 1) {
412                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
413                 assert(res3control.error == 0);
414                 assert(res3control.msgs.length == 1);
415         }
416         
417         assert(res.msgs[0].dn == res3control.msgs[0].dn);
418
419         ok = ldb.del(res.msgs[0].dn);
420         if (ok.error != 0) {
421                 println(ok.errstr);
422                 assert(ok.error == 0);
423         }
424
425         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectClass=user))");
426         var res = ldb.search("(&(cn=ldaptestcomputer)(objectClass=user))");
427         if (res.error != 0 || res.msgs.length != 1) {
428                 println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
429                 assert(res.error == 0);
430                 assert(res.msgs.length == 1);
431         }
432
433         assert(res.msgs[0].dn == ("CN=ldaptestcomputer,CN=Computers," + base_dn));
434         assert(res.msgs[0].cn == "ldaptestcomputer");
435         assert(res.msgs[0].name == "ldaptestcomputer");
436         assert(res.msgs[0].objectClass[0] == "top");
437         assert(res.msgs[0].objectClass[1] == "person");
438         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
439         assert(res.msgs[0].objectClass[3] == "user");
440         assert(res.msgs[0].objectClass[4] == "computer");
441         assert(res.msgs[0].objectGUID != undefined);
442         assert(res.msgs[0].whenCreated != undefined);
443         assert(res.msgs[0].objectCategory == ("CN=Computer,CN=Schema,CN=Configuration," + base_dn));
444         assert(res.msgs[0].primaryGroupID == 513);
445 //      assert(res.msgs[0].sAMAccountType == 805306368);
446 //      assert(res.msgs[0].userAccountControl == 546);
447
448         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
449         var res2 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
450         if (res2.error != 0 || res2.msgs.length != 1) {
451                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
452                 assert(res2.error == 0);
453                 assert(res2.msgs.length == 1);
454         }
455
456         assert(res.msgs[0].dn == res2.msgs[0].dn);
457
458         if (gc_ldb != undefined) {
459                 println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
460                 var res2gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
461                 if (res2gc.error != 0 || res2gc.msgs.length != 1) {
462                         println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
463                         assert(res2gc.error == 0);
464                         assert(res2gc.msgs.length == 1);
465                 }
466
467                 assert(res.msgs[0].dn == res2gc.msgs[0].dn);
468         }
469
470         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
471         var res3 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
472         if (res3.error != 0 || res3.msgs.length != 1) {
473                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
474                 assert(res3.error == 0);
475                 assert(res3.msgs.length == 1);
476         }
477
478         assert(res.msgs[0].dn == res3.msgs[0].dn);
479
480         if (gc_ldb != undefined) {
481                 println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
482                 var res3gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
483                 if (res3gc.error != 0 || res3gc.msgs.length != 1) {
484                         println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
485                         assert(res3gc.error == 0);
486                         assert(res3gc.msgs.length == 1);
487                 }
488
489                 assert(res.msgs[0].dn == res3gc.msgs[0].dn);
490         }
491
492         println("Testing ldb.search for (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
493         var res4 = ldb.search("(&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
494         if (res4.error != 0 || res4.msgs.length != 1) {
495                 println("Could not find (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
496                 assert(res4.error == 0);
497                 assert(res4.msgs.length == 1);
498         }
499
500         assert(res.msgs[0].dn == res4.msgs[0].dn);
501
502         println("Testing ldb.search for (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
503         var res5 = ldb.search("(&(cn=ldaptestcomput*)(objectCategory=compuTER))");
504         if (res5.error != 0 || res5.msgs.length != 1) {
505                 println("Could not find (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
506                 assert(res5.error == 0);
507                 assert(res5.msgs.length == 1);
508         }
509
510         assert(res.msgs[0].dn == res5.msgs[0].dn);
511
512         println("Testing ldb.search for (&(cn=*daptestcomputer)(objectCategory=compuTER))");
513         var res6 = ldb.search("(&(cn=*daptestcomputer)(objectCategory=compuTER))");
514         if (res6.error != 0 || res6.msgs.length != 1) {
515                 println("Could not find (&(cn=*daptestcomputer)(objectCategory=compuTER))");
516                 assert(res6.error == 0);
517                 assert(res6.msgs.length == 1);
518         }
519
520         assert(res.msgs[0].dn == res6.msgs[0].dn);
521
522         ok = ldb.del(res.msgs[0].dn);
523         if (ok.error != 0) {
524                 println(ok.errstr);
525                 assert(ok.error == 0);
526         }
527
528         println("Testing ldb.search for (&(cn=ldaptest2computer)(objectClass=user))");
529         var res = ldb.search("(&(cn=ldaptest2computer)(objectClass=user))");
530         if (res.error != 0 || res.msgs.length != 1) {
531                 println("Could not find (&(cn=ldaptest2computer)(objectClass=user))");
532                 assert(res.error == 0);
533                 assert(res.msgs.length == 1);
534         }
535
536         assert(res.msgs[0].dn == ("CN=ldaptest2computer,CN=Computers," + base_dn));
537         assert(res.msgs[0].cn == "ldaptest2computer");
538         assert(res.msgs[0].name == "ldaptest2computer");
539         assert(res.msgs[0].objectClass[0] == "top");
540         assert(res.msgs[0].objectClass[1] == "person");
541         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
542         assert(res.msgs[0].objectClass[3] == "user");
543         assert(res.msgs[0].objectClass[4] == "computer");
544         assert(res.msgs[0].objectGUID != undefined);
545         assert(res.msgs[0].whenCreated != undefined);
546         assert(res.msgs[0].objectCategory == "cn=Computer,cn=Schema,cn=Configuration," + base_dn);
547         assert(res.msgs[0].sAMAccountType == 805306369);
548 //      assert(res.msgs[0].userAccountControl == 4098);
549
550
551         var attrs = new Array("cn", "name", "objectClass", "objectGUID", "whenCreated", "nTSecurityDescriptor");
552         println("Testing ldb.search for (&(cn=ldaptestUSer2)(objectClass=user))");
553         var res = ldb.search("(&(cn=ldaptestUSer2)(objectClass=user))", base_dn, ldb.SCOPE_SUBTREE, attrs);
554         if (res.error != 0 || res.msgs.length != 1) {
555                 println("Could not find (&(cn=ldaptestUSer2)(objectClass=user))");
556                 assert(res.error == 0);
557                 assert(res.msgs.length == 1);
558         }
559
560         assert(res.msgs[0].dn == ("CN=ldaptestuser2,CN=Users," + base_dn));
561         assert(res.msgs[0].cn == "ldaptestuser2");
562         assert(res.msgs[0].name == "ldaptestuser2");
563         assert(res.msgs[0].objectClass[0] == "top");
564         assert(res.msgs[0].objectClass[1] == "person");
565         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
566         assert(res.msgs[0].objectClass[3] == "user");
567         assert(res.msgs[0].objectGUID != undefined);
568         assert(res.msgs[0].whenCreated != undefined);
569         assert(res.msgs[0].nTSecurityDescriptor != undefined);
570
571
572         ok = ldb.del(res.msgs[0].dn);
573         if (ok.error != 0) {
574                 println(ok.errstr);
575                 assert(ok.error == 0);
576         }
577
578         println("Testing ldb.search for (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
579         var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
580
581         if (res.error != 0 || res.msgs.length != 1) {
582                 println("Could not find (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
583                 assert(res.error == 0);
584                 assert(res.msgs.length == 1);
585         }
586
587         assert(res.msgs[0].dn == ("CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn));
588         assert(res.msgs[0].cn == "ldaptestutf8user èùéìòà");
589         assert(res.msgs[0].name == "ldaptestutf8user èùéìòà");
590         assert(res.msgs[0].objectClass[0] == "top");
591         assert(res.msgs[0].objectClass[1] == "person");
592         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
593         assert(res.msgs[0].objectClass[3] == "user");
594         assert(res.msgs[0].objectGUID != undefined);
595         assert(res.msgs[0].whenCreated != undefined);
596
597         ok = ldb.del(res.msgs[0].dn);
598         if (ok.error != 0) {
599                 println(ok.errstr);
600                 assert(ok.error == 0);
601         }
602
603         println("Testing ldb.search for (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
604         var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
605
606         if (res.error != 0 || res.msgs.length != 1) {
607                 println("Could not find (expect space collapse, win2k3 fails) (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
608         } else {
609                 assert(res.msgs[0].dn == ("cn=ldaptestutf8user2 èùéìòà,cn=users," + base_dn));
610                 assert(res.msgs[0].cn == "ldaptestutf8user2 èùéìòà");
611         }
612
613         println("Testing that we can't get at the configuration DN from the main search base");
614         var attrs = new Array("cn");
615         var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
616         assert(res.error == 0);
617         if (res.msgs.length != 0) {
618                 println("Got configuration DN " + res.msgs[0].dn + " which should not be able to be seen from main search base");
619         }
620         assert(res.msgs.length == 0);
621
622         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");
623         var attrs = new Array("cn");
624         var controls = new Array("search_options:1:2");
625         var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
626         assert(res.error == 0);
627         assert(res.msgs.length > 0);
628
629         if (gc_ldb != undefined) {
630                 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");
631                 var attrs = new Array("cn");
632                 var controls = new Array("search_options:1:0");
633                 var res = gc_ldb.search("objectClass=crossRef", base_dn, gc_ldb.SCOPE_SUBTREE, attrs, controls);
634                 assert(res.error == 0);
635                 assert(res.msgs.length > 0);
636
637                 println("Testing that we do find configuration elements in the global catlog");
638                 var attrs = new Array("cn");
639                 var res = gc_ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
640                 assert(res.error == 0);
641                 assert (res.msgs.length > 0);
642         
643                 println("Testing that we do find configuration elements and user elements at the same time");
644                 var attrs = new Array("cn");
645                 var res = gc_ldb.search("(|(objectClass=crossRef)(objectClass=person))", base_dn, ldb.SCOPE_SUBTREE, attrs);
646                 assert(res.error == 0);
647                 assert (res.msgs.length > 0);
648
649                 println("Testing that we do find configuration elements in the global catlog, with the configuration basedn");
650                 var attrs = new Array("cn");
651                 var res = gc_ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
652                 assert(res.error == 0);
653                 assert (res.msgs.length > 0);
654         }
655
656         println("Testing that we can get at the configuration DN on the main LDAP port");
657         var attrs = new Array("cn");
658         var res = ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
659         assert(res.error == 0);
660         assert (res.msgs.length > 0);
661
662         println("Testing objectCategory canonacolisation");
663         var attrs = new Array("cn");
664         var res = ldb.search("objectCategory=ntDsDSA", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
665         assert(res.error == 0);
666         if (res.msgs.length == 0) {
667                 println("Didn't find any records with objectCategory=ntDsDSA");
668         }
669         assert(res.msgs.length != 0);
670         
671         var attrs = new Array("cn");
672         var res = ldb.search("objectCategory=CN=ntDs-DSA," + schema_dn, configuration_dn, ldb.SCOPE_SUBTREE, attrs);
673         assert(res.error == 0);
674         if (res.msgs.length == 0) {
675                 println("Didn't find any records with objectCategory=CN=ntDs-DSA," + schema_dn);
676         }
677         assert(res.msgs.length != 0);
678         
679         println("Testing objectClass attribute order on "+ base_dn);
680         var attrs = new Array("objectClass");
681         var res = ldb.search("objectClass=domain", base_dn, ldb.SCOPE_BASE, attrs);
682         assert(res.error == 0);
683         assert(res.msgs.length == 1);
684
685         assert(res.msgs[0].objectClass[0] == "top");
686         assert(res.msgs[0].objectClass[1] == "domain");
687         assert(res.msgs[0].objectClass[2] == "domainDNS");
688
689 //  check enumeration
690
691         var attrs = new Array("cn");
692         println("Testing ldb.search for objectCategory=person");
693         var res = ldb.search("objectCategory=person", base_dn, ldb.SCOPE_SUBTREE, attrs);
694         assert(res.error == 0);
695         assert(res.msgs.length > 0);
696
697         var attrs = new Array("cn");
698         var controls = new Array("domain_scope:1");
699         println("Testing ldb.search for objectCategory=person with domain scope control");
700         var res = ldb.search("objectCategory=person", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
701         assert(res.error == 0);
702         assert(res.msgs.length > 0);
703  
704         var attrs = new Array("cn");
705         println("Testing ldb.search for objectCategory=user");
706         var res = ldb.search("objectCategory=user", base_dn, ldb.SCOPE_SUBTREE, attrs);
707         assert(res.error == 0);
708         assert(res.msgs.length > 0);
709
710         var attrs = new Array("cn");
711         var controls = new Array("domain_scope:1");
712         println("Testing ldb.search for objectCategory=user with domain scope control");
713         var res = ldb.search("objectCategory=user", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
714         assert(res.error == 0);
715         assert(res.msgs.length > 0);
716         
717         var attrs = new Array("cn");
718         println("Testing ldb.search for objectCategory=group");
719         var res = ldb.search("objectCategory=group", base_dn, ldb.SCOPE_SUBTREE, attrs);
720         assert(res.error == 0);
721         assert(res.msgs.length > 0);
722
723         var attrs = new Array("cn");
724         var controls = new Array("domain_scope:1");
725         println("Testing ldb.search for objectCategory=group with domain scope control");
726         var res = ldb.search("objectCategory=group", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
727         assert(res.error == 0);
728         assert(res.msgs.length > 0);
729         
730 }
731
732 function basedn_tests(ldb, gc_ldb)
733 {
734         println("Testing for all rootDSE attributes");
735         var attrs = new Array();
736         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
737         assert(res.error == 0);
738         assert(res.msgs.length == 1);
739
740         println("Testing for highestCommittedUSN");
741         var attrs = new Array("highestCommittedUSN");
742         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
743         assert(res.error == 0);
744         assert(res.msgs.length == 1);
745         assert(res.msgs[0].highestCommittedUSN != undefined);
746         assert(res.msgs[0].highestCommittedUSN != 0);
747
748         println("Testing for netlogon via LDAP");
749         var attrs = new Array("netlogon");
750         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
751         assert(res.error == 0);
752         assert(res.msgs.length == 0);
753
754         println("Testing for netlogon and highestCommittedUSN via LDAP");
755         var attrs = new Array("netlogon", "highestCommittedUSN");
756         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
757         assert(res.error == 0);
758         assert(res.msgs.length == 0);
759 }
760
761 function find_basedn(ldb)
762 {
763     var attrs = new Array("defaultNamingContext");
764     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
765     assert(res.error == 0);
766     assert(res.msgs.length == 1);
767     return res.msgs[0].defaultNamingContext;
768 }
769
770 function find_configurationdn(ldb)
771 {
772     var attrs = new Array("configurationNamingContext");
773     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
774     assert(res.error == 0);
775     assert(res.msgs.length == 1);
776     return res.msgs[0].configurationNamingContext;
777 }
778
779 function find_schemadn(ldb)
780 {
781     var attrs = new Array("schemaNamingContext");
782     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
783     assert(res.error == 0);
784     assert(res.msgs.length == 1);
785     return res.msgs[0].schemaNamingContext;
786 }
787
788 /* use command line creds if available */
789 ldb.credentials = options.get_credentials();
790 gc_ldb.credentials = options.get_credentials();
791
792 var ok = ldb.connect("ldap://" + host);
793 var base_dn = find_basedn(ldb);
794 var configuration_dn = find_configurationdn(ldb);
795 var schema_dn = find_schemadn(ldb);
796
797 printf("baseDN: %s\n", base_dn);
798
799 var ok = gc_ldb.connect("ldap://" + host + ":3268");
800 if (!ok) {
801         gc_ldb = undefined;
802 }
803
804 basic_tests(ldb, gc_ldb, base_dn, configuration_dn, schema_dn)
805
806 basedn_tests(ldb, gc_ldb)
807
808 return 0;