r25750: Update the objectclass module to improve consistency in Samba4.
[metze/samba/wip.git] / testprogs / ejs / ldap.js
1 #!/bin/sh
2 exec smbscript "$0" ${1+"$@"}
3 /*
4         test certin LDAP behaviours
5 */
6
7 var ldb = ldb_init();
8 var gc_ldb = ldb_init();
9
10 var options = GetOptions(ARGV, 
11                 "POPT_AUTOHELP",
12                 "POPT_COMMON_SAMBA",
13                 "POPT_COMMON_CREDENTIALS");
14 if (options == undefined) {
15    println("Failed to parse options");
16    return -1;
17 }
18
19 libinclude("base.js");
20
21 if (options.ARGV.length != 1) {
22    println("Usage: ldap.js <HOST>");
23    return -1;
24 }
25
26 var host = options.ARGV[0];
27
28 function basic_tests(ldb, gc_ldb, base_dn, configuration_dn, schema_dn)
29 {
30         println("Running basic tests");
31
32         ldb.del("cn=ldaptestuser,cn=users," + base_dn);
33
34         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         // ensure we cannot add it again
154         ok = ldb.add("
155 dn: cn=ldaptestuser3,cn=userS," + base_dn + "
156 objectClass: person
157 objectClass: user
158 cn: LDAPtestUSER3
159 ");
160 //LDB_ERR_ENTRY_ALREADY_EXISTS
161         if (ok.error != 68) {
162                 println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS, got: " + ok.errstr);
163                 assert(ok.error == 68);
164         }
165
166         // rename back
167         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser2,cn=users," + base_dn);
168         if (ok.error != 0) {
169                 println(ok.errstr);
170                 assert(ok.error == 0);
171         }
172
173         // ensure we cannnot rename it twice
174         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser2,cn=users," + base_dn);
175 //LDB_ERR_NO_SUCH_OBJECT
176         assert(ok.error == 32);
177
178         // ensure can now use that name
179         ok = ldb.add("
180 dn: cn=ldaptestuser3,cn=users," + base_dn + "
181 objectClass: person
182 objectClass: user
183 cn: LDAPtestUSER3
184 ");
185         
186         // ensure we now cannnot rename
187         ok = ldb.rename("cn=ldaptestuser2,cn=users," + base_dn, "cn=ldaptestuser3,cn=users," + base_dn);
188 //LDB_ERR_ENTRY_ALREADY_EXISTS
189         if (ok.error != 68) {
190                 println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS, got: " + ok.errstr);
191                 assert(ok.error == 68);
192         }
193         assert(ok.error == 68);
194         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser3,cn=configuration," + base_dn);
195         if (ok.error != 71 && ok.error != 64) {
196                 println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS or LDAP_NAMING_VIOLATION, got: " + ok.errstr);
197                 assert(ok.error == 71 || ok.error == 64);
198         }
199         assert(ok.error == 71 || ok.error == 64);
200
201         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser5,cn=users," + base_dn);
202         if (ok.error != 0) {
203                 println(ok.errstr);
204                 assert(ok.error == 0);
205         }
206
207         ok = ldb.del("cn=ldaptestuser5,cn=users," + base_dn);
208
209         println("Testing subtree Renames");
210
211         ok = ldb.add("
212 dn: cn=ldaptestcontainer," + base_dn + "
213 objectClass: container
214 ");
215         
216         ok = ldb.add("
217 dn: CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + "
218 objectClass: person
219 objectClass: user
220 cn: LDAPtestUSER4
221 ");
222         if (ok.error != 0) {
223                 ok = ldb.del("cn=ldaptestuser4,cn=ldaptestcontainer," + base_dn);
224                 if (ok.error != 0) {
225                         println(ok.errstr);
226                         assert(ok.error == 0);
227                 }
228                 ok = ldb.add("
229 dn: CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + "
230 objectClass: person
231 objectClass: user
232 cn: LDAPtestUSER4
233 ");
234                 if (ok.error != 0) {
235                         println(ok.errstr);
236                         assert(ok.error == 0);
237                 }
238         }
239
240         println("Testing ldb.rename of cn=ldaptestcontainer," + base_dn + " to cn=ldaptestcontainer2," + base_dn);
241         ok = ldb.rename("CN=ldaptestcontainer," + base_dn, "CN=ldaptestcontainer2," + base_dn);
242         if (ok.error != 0) {
243                 println(ok.errstr);
244                 assert(ok.error == 0);
245         }
246
247         println("Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user))");
248         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))");
249         if (res.error != 0 || res.msgs.length != 1) {
250                 println("Could not find (&(cn=ldaptestuser4)(objectClass=user))");
251                 assert(res.error == 0);
252                 assert(res.msgs.length == 1);
253         }
254
255         assert(res.msgs[0].dn == ("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn));
256
257         println("Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in renamed container");
258         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer2," + base_dn, ldb.SCOPE_SUBTREE);
259         if (res.error != 0 || res.msgs.length != 1) {
260                 println("Could not find (&(cn=ldaptestuser4)(objectClass=user)) under cn=ldaptestcontainer2," + base_dn);
261                 assert(res.error == 0);
262                 assert(res.msgs.length == 1);
263         }
264
265         assert(res.msgs[0].dn == ("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn));
266
267         println("Testing delete (should fail, not a leaf node) of renamed cn=ldaptestcontainer2," + base_dn);
268         ok = ldb.del("cn=ldaptestcontainer2," + base_dn);
269         if (ok.error != 66) { /* LDB_ERR_NOT_ALLOWED_ON_NON_LEAF */
270                 println(ok.errstr);
271                 assert(ok.error == 66);
272         }
273         println("Testing delete of subtree renamed "+res.msgs[0].dn);
274         ok = ldb.del(res.msgs[0].dn);
275         if (ok.error != 0) {
276                 println(ok.errstr);
277                 assert(ok.error == 0);
278         }
279         println("Testing delete of renamed cn=ldaptestcontainer2," + base_dn);
280         ok = ldb.del("cn=ldaptestcontainer2," + base_dn);
281         if (ok.error != 0) {
282                 println(ok.errstr);
283                 assert(ok.error == 0);
284         }
285         
286         ok = ldb.add("
287 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
288 objectClass: user
289 ");
290         if (ok.error != 0) {
291                 ok = ldb.del("cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn);
292                 if (ok.error != 0) {
293                         println(ok.errstr);
294                         assert(ok.error == 0);
295                 }
296         ok = ldb.add("
297 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
298 objectClass: user
299 ");
300                 if (ok.error != 0) {
301                         println(ok.errstr);
302                         assert(ok.error == 0);
303                 }
304         }
305
306         ok = ldb.add("
307 dn: cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn + "
308 objectClass: user
309 ");
310         if (ok.error != 0) {
311                 ok = ldb.del("cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn);
312                 if (ok.error != 0) {
313                         println(ok.errstr);
314                         assert(ok.error == 0);
315                 }
316         ok = ldb.add("
317 dn: cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn + "
318 objectClass: user
319 ");
320                 if (ok.error != 0) {
321                         println(ok.errstr);
322                         assert(ok.error == 0);
323                 }
324         }
325
326         println("Testing ldb.search for (&(cn=ldaptestuser)(objectClass=user))");
327         var res = ldb.search("(&(cn=ldaptestuser)(objectClass=user))");
328         if (res.error != 0 || res.msgs.length != 1) {
329                 println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
330                 assert(res.error == 0);
331                 assert(res.msgs.length == 1);
332         }
333
334         assert(res.msgs[0].dn == ("CN=ldaptestuser,CN=Users," + base_dn));
335         assert(res.msgs[0].cn == "ldaptestuser");
336         assert(res.msgs[0].name == "ldaptestuser");
337         assert(res.msgs[0].objectClass[0] == "top");
338         assert(res.msgs[0].objectClass[1] == "person");
339         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
340         assert(res.msgs[0].objectClass[3] == "user");
341         assert(res.msgs[0].objectGUID != undefined);
342         assert(res.msgs[0].whenCreated != undefined);
343         assert(res.msgs[0].objectCategory == ("CN=Person,CN=Schema,CN=Configuration," + base_dn));
344         assert(res.msgs[0].sAMAccountType == 805306368);
345 //      assert(res[0].userAccountControl == 546);
346  
347         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
348         var res2 = ldb.search("(&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
349         if (res2.error != 0 || res2.msgs.length != 1) {
350                 println("Could not find (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
351                 assert(res2.error == 0);
352                 assert(res2.msgs.length == 1);
353         }
354
355         assert(res.msgs[0].dn == res2.msgs[0].dn);
356
357         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon))");
358         var res3 = ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
359         if (res3.error != 0) {
360                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): " + res3.errstr);
361                 assert(res3.error == 0);
362         } else if (res3.msgs.length != 1) {
363                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): matched " + res3.msgs.length);
364                 assert(res3.msgs.length == 1);
365         }
366
367         assert(res.msgs[0].dn == res3.msgs[0].dn);
368
369         if (gc_ldb != undefined) {
370                 println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
371                 var res3gc = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
372                 if (res3gc.error != 0) {
373                         println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog: " + res3gc.errstr);
374                         assert(res3gc.error == 0);
375                 } else if (res3gc.msgs.length != 1) {
376                         println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog: matched " + res3gc.msgs.length);
377                         assert(res3gc.msgs.length == 1);
378                 }
379         
380                 assert(res.msgs[0].dn == res3gc.msgs[0].dn);
381         }
382
383         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in with 'phantom root' control");
384         var attrs = new Array("cn");
385         var controls = new Array("search_options:1:2");
386         var res3control = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
387         if (res3control.error != 0 || res3control.msgs.length != 1) {
388                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
389                 assert(res3control.error == 0);
390                 assert(res3control.msgs.length == 1);
391         }
392         
393         assert(res.msgs[0].dn == res3control.msgs[0].dn);
394
395         ok = ldb.del(res.msgs[0].dn);
396         if (ok.error != 0) {
397                 println(ok.errstr);
398                 assert(ok.error == 0);
399         }
400
401         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectClass=user))");
402         var res = ldb.search("(&(cn=ldaptestcomputer)(objectClass=user))");
403         if (res.error != 0 || res.msgs.length != 1) {
404                 println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
405                 assert(res.error == 0);
406                 assert(res.msgs.length == 1);
407         }
408
409         assert(res.msgs[0].dn == ("CN=ldaptestcomputer,CN=Computers," + base_dn));
410         assert(res.msgs[0].cn == "ldaptestcomputer");
411         assert(res.msgs[0].name == "ldaptestcomputer");
412         assert(res.msgs[0].objectClass[0] == "top");
413         assert(res.msgs[0].objectClass[1] == "person");
414         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
415         assert(res.msgs[0].objectClass[3] == "user");
416         assert(res.msgs[0].objectClass[4] == "computer");
417         assert(res.msgs[0].objectGUID != undefined);
418         assert(res.msgs[0].whenCreated != undefined);
419         assert(res.msgs[0].objectCategory == ("CN=Computer,CN=Schema,CN=Configuration," + base_dn));
420         assert(res.msgs[0].primaryGroupID == 513);
421 //      assert(res.msgs[0].sAMAccountType == 805306368);
422 //      assert(res.msgs[0].userAccountControl == 546);
423
424         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
425         var res2 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
426         if (res2.error != 0 || res2.msgs.length != 1) {
427                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
428                 assert(res2.error == 0);
429                 assert(res2.msgs.length == 1);
430         }
431
432         assert(res.msgs[0].dn == res2.msgs[0].dn);
433
434         if (gc_ldb != undefined) {
435                 println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
436                 var res2gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
437                 if (res2gc.error != 0 || res2gc.msgs.length != 1) {
438                         println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
439                         assert(res2gc.error == 0);
440                         assert(res2gc.msgs.length == 1);
441                 }
442
443                 assert(res.msgs[0].dn == res2gc.msgs[0].dn);
444         }
445
446         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
447         var res3 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
448         if (res3.error != 0 || res3.msgs.length != 1) {
449                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
450                 assert(res3.error == 0);
451                 assert(res3.msgs.length == 1);
452         }
453
454         assert(res.msgs[0].dn == res3.msgs[0].dn);
455
456         if (gc_ldb != undefined) {
457                 println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
458                 var res3gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
459                 if (res3gc.error != 0 || res3gc.msgs.length != 1) {
460                         println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
461                         assert(res3gc.error == 0);
462                         assert(res3gc.msgs.length == 1);
463                 }
464
465                 assert(res.msgs[0].dn == res3gc.msgs[0].dn);
466         }
467
468         println("Testing ldb.search for (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
469         var res4 = ldb.search("(&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
470         if (res4.error != 0 || res4.msgs.length != 1) {
471                 println("Could not find (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
472                 assert(res4.error == 0);
473                 assert(res4.msgs.length == 1);
474         }
475
476         assert(res.msgs[0].dn == res4.msgs[0].dn);
477
478         println("Testing ldb.search for (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
479         var res5 = ldb.search("(&(cn=ldaptestcomput*)(objectCategory=compuTER))");
480         if (res5.error != 0 || res5.msgs.length != 1) {
481                 println("Could not find (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
482                 assert(res5.error == 0);
483                 assert(res5.msgs.length == 1);
484         }
485
486         assert(res.msgs[0].dn == res5.msgs[0].dn);
487
488         println("Testing ldb.search for (&(cn=*daptestcomputer)(objectCategory=compuTER))");
489         var res6 = ldb.search("(&(cn=*daptestcomputer)(objectCategory=compuTER))");
490         if (res6.error != 0 || res6.msgs.length != 1) {
491                 println("Could not find (&(cn=*daptestcomputer)(objectCategory=compuTER))");
492                 assert(res6.error == 0);
493                 assert(res6.msgs.length == 1);
494         }
495
496         assert(res.msgs[0].dn == res6.msgs[0].dn);
497
498         ok = ldb.del(res.msgs[0].dn);
499         if (ok.error != 0) {
500                 println(ok.errstr);
501                 assert(ok.error == 0);
502         }
503
504         println("Testing ldb.search for (&(cn=ldaptest2computer)(objectClass=user))");
505         var res = ldb.search("(&(cn=ldaptest2computer)(objectClass=user))");
506         if (res.error != 0 || res.msgs.length != 1) {
507                 println("Could not find (&(cn=ldaptest2computer)(objectClass=user))");
508                 assert(res.error == 0);
509                 assert(res.msgs.length == 1);
510         }
511
512         assert(res.msgs[0].dn == ("CN=ldaptest2computer,CN=Computers," + base_dn));
513         assert(res.msgs[0].cn == "ldaptest2computer");
514         assert(res.msgs[0].name == "ldaptest2computer");
515         assert(res.msgs[0].objectClass[0] == "top");
516         assert(res.msgs[0].objectClass[1] == "person");
517         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
518         assert(res.msgs[0].objectClass[3] == "user");
519         assert(res.msgs[0].objectClass[4] == "computer");
520         assert(res.msgs[0].objectGUID != undefined);
521         assert(res.msgs[0].whenCreated != undefined);
522         assert(res.msgs[0].objectCategory == "cn=Computer,cn=Schema,cn=Configuration," + base_dn);
523         assert(res.msgs[0].sAMAccountType == 805306369);
524 //      assert(res.msgs[0].userAccountControl == 4098);
525
526
527         var attrs = new Array("cn", "name", "objectClass", "objectGUID", "whenCreated", "nTSecurityDescriptor");
528         println("Testing ldb.search for (&(cn=ldaptestUSer2)(objectClass=user))");
529         var res = ldb.search("(&(cn=ldaptestUSer2)(objectClass=user))", base_dn, ldb.SCOPE_SUBTREE, attrs);
530         if (res.error != 0 || res.msgs.length != 1) {
531                 println("Could not find (&(cn=ldaptestUSer2)(objectClass=user))");
532                 assert(res.error == 0);
533                 assert(res.msgs.length == 1);
534         }
535
536         assert(res.msgs[0].dn == ("CN=ldaptestuser2,CN=Users," + base_dn));
537         assert(res.msgs[0].cn == "ldaptestuser2");
538         assert(res.msgs[0].name == "ldaptestuser2");
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].objectGUID != undefined);
544         assert(res.msgs[0].whenCreated != undefined);
545         assert(res.msgs[0].nTSecurityDescriptor != undefined);
546
547
548         ok = ldb.del(res.msgs[0].dn);
549         if (ok.error != 0) {
550                 println(ok.errstr);
551                 assert(ok.error == 0);
552         }
553
554         println("Testing ldb.search for (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
555         var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
556
557         if (res.error != 0 || res.msgs.length != 1) {
558                 println("Could not find (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
559                 assert(res.error == 0);
560                 assert(res.msgs.length == 1);
561         }
562
563         assert(res.msgs[0].dn == ("CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn));
564         assert(res.msgs[0].cn == "ldaptestutf8user èùéìòà");
565         assert(res.msgs[0].name == "ldaptestutf8user èùéìòà");
566         assert(res.msgs[0].objectClass[0] == "top");
567         assert(res.msgs[0].objectClass[1] == "person");
568         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
569         assert(res.msgs[0].objectClass[3] == "user");
570         assert(res.msgs[0].objectGUID != undefined);
571         assert(res.msgs[0].whenCreated != undefined);
572
573         ok = ldb.del(res.msgs[0].dn);
574         if (ok.error != 0) {
575                 println(ok.errstr);
576                 assert(ok.error == 0);
577         }
578
579         println("Testing ldb.search for (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
580         var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
581
582         if (res.error != 0 || res.msgs.length != 1) {
583                 println("Could not find (expect space collapse, win2k3 fails) (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
584         } else {
585                 assert(res.msgs[0].dn == ("cn=ldaptestutf8user2 èùéìòà,cn=users," + base_dn));
586                 assert(res.msgs[0].cn == "ldaptestutf8user2 èùéìòà");
587         }
588
589         println("Testing that we can't get at the configuration DN from the main search base");
590         var attrs = new Array("cn");
591         var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
592         assert(res.error == 0);
593         if (res.msgs.length != 0) {
594                 println("Got configuration DN " + res.msgs[0].dn + " which should not be able to be seen from main search base");
595         }
596         assert(res.msgs.length == 0);
597
598         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");
599         var attrs = new Array("cn");
600         var controls = new Array("search_options:1:2");
601         var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
602         assert(res.error == 0);
603         assert(res.msgs.length > 0);
604
605         if (gc_ldb != undefined) {
606                 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");
607                 var attrs = new Array("cn");
608                 var controls = new Array("search_options:1:0");
609                 var res = gc_ldb.search("objectClass=crossRef", base_dn, gc_ldb.SCOPE_SUBTREE, attrs, controls);
610                 assert(res.error == 0);
611                 assert(res.msgs.length > 0);
612
613                 println("Testing that we do find configuration elements in the global catlog");
614                 var attrs = new Array("cn");
615                 var res = gc_ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
616                 assert(res.error == 0);
617                 assert (res.msgs.length > 0);
618         
619                 println("Testing that we do find configuration elements and user elements at the same time");
620                 var attrs = new Array("cn");
621                 var res = gc_ldb.search("(|(objectClass=crossRef)(objectClass=person))", base_dn, ldb.SCOPE_SUBTREE, attrs);
622                 assert(res.error == 0);
623                 assert (res.msgs.length > 0);
624
625                 println("Testing that we do find configuration elements in the global catlog, with the configuration basedn");
626                 var attrs = new Array("cn");
627                 var res = gc_ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
628                 assert(res.error == 0);
629                 assert (res.msgs.length > 0);
630         }
631
632         println("Testing that we can get at the configuration DN on the main LDAP port");
633         var attrs = new Array("cn");
634         var res = ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
635         assert(res.error == 0);
636         assert (res.msgs.length > 0);
637
638         println("Testing objectCategory canonacolisation");
639         var attrs = new Array("cn");
640         var res = ldb.search("objectCategory=ntDsDSA", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
641         assert(res.error == 0);
642         if (res.msgs.length == 0) {
643                 println("Didn't find any records with objectCategory=ntDsDSA");
644         }
645         assert(res.msgs.length != 0);
646         
647         var attrs = new Array("cn");
648         var res = ldb.search("objectCategory=CN=ntDs-DSA," + schema_dn, configuration_dn, ldb.SCOPE_SUBTREE, attrs);
649         assert(res.error == 0);
650         if (res.msgs.length == 0) {
651                 println("Didn't find any records with objectCategory=CN=ntDs-DSA," + schema_dn);
652         }
653         assert(res.msgs.length != 0);
654         
655         println("Testing objectClass attribute order on "+ base_dn);
656         var attrs = new Array("objectClass");
657         var res = ldb.search("objectClass=domain", base_dn, ldb.SCOPE_BASE, attrs);
658         assert(res.error == 0);
659         assert(res.msgs.length == 1);
660
661         assert(res.msgs[0].objectClass[0] == "top");
662         assert(res.msgs[0].objectClass[1] == "domain");
663         assert(res.msgs[0].objectClass[2] == "domainDNS");
664
665 //  check enumeration
666
667         var attrs = new Array("cn");
668         println("Testing ldb.search for objectCategory=person");
669         var res = ldb.search("objectCategory=person", base_dn, ldb.SCOPE_SUBTREE, attrs);
670         assert(res.error == 0);
671         assert(res.msgs.length > 0);
672
673         var attrs = new Array("cn");
674         var controls = new Array("domain_scope:1");
675         println("Testing ldb.search for objectCategory=person with domain scope control");
676         var res = ldb.search("objectCategory=person", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
677         assert(res.error == 0);
678         assert(res.msgs.length > 0);
679  
680         var attrs = new Array("cn");
681         println("Testing ldb.search for objectCategory=user");
682         var res = ldb.search("objectCategory=user", base_dn, ldb.SCOPE_SUBTREE, attrs);
683         assert(res.error == 0);
684         assert(res.msgs.length > 0);
685
686         var attrs = new Array("cn");
687         var controls = new Array("domain_scope:1");
688         println("Testing ldb.search for objectCategory=user with domain scope control");
689         var res = ldb.search("objectCategory=user", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
690         assert(res.error == 0);
691         assert(res.msgs.length > 0);
692         
693         var attrs = new Array("cn");
694         println("Testing ldb.search for objectCategory=group");
695         var res = ldb.search("objectCategory=group", base_dn, ldb.SCOPE_SUBTREE, attrs);
696         assert(res.error == 0);
697         assert(res.msgs.length > 0);
698
699         var attrs = new Array("cn");
700         var controls = new Array("domain_scope:1");
701         println("Testing ldb.search for objectCategory=group with domain scope control");
702         var res = ldb.search("objectCategory=group", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
703         assert(res.error == 0);
704         assert(res.msgs.length > 0);
705         
706 }
707
708 function basedn_tests(ldb, gc_ldb)
709 {
710         println("Testing for all rootDSE attributes");
711         var attrs = new Array();
712         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
713         assert(res.error == 0);
714         assert(res.msgs.length == 1);
715
716         println("Testing for highestCommittedUSN");
717         var attrs = new Array("highestCommittedUSN");
718         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
719         assert(res.error == 0);
720         assert(res.msgs.length == 1);
721         assert(res.msgs[0].highestCommittedUSN != undefined);
722         assert(res.msgs[0].highestCommittedUSN != 0);
723
724         println("Testing for netlogon via LDAP");
725         var attrs = new Array("netlogon");
726         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
727         assert(res.error == 0);
728         assert(res.msgs.length == 0);
729
730         println("Testing for netlogon and highestCommittedUSN via LDAP");
731         var attrs = new Array("netlogon", "highestCommittedUSN");
732         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
733         assert(res.error == 0);
734         assert(res.msgs.length == 0);
735 }
736
737 function find_basedn(ldb)
738 {
739     var attrs = new Array("defaultNamingContext");
740     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
741     assert(res.error == 0);
742     assert(res.msgs.length == 1);
743     return res.msgs[0].defaultNamingContext;
744 }
745
746 function find_configurationdn(ldb)
747 {
748     var attrs = new Array("configurationNamingContext");
749     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
750     assert(res.error == 0);
751     assert(res.msgs.length == 1);
752     return res.msgs[0].configurationNamingContext;
753 }
754
755 function find_schemadn(ldb)
756 {
757     var attrs = new Array("schemaNamingContext");
758     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
759     assert(res.error == 0);
760     assert(res.msgs.length == 1);
761     return res.msgs[0].schemaNamingContext;
762 }
763
764 /* use command line creds if available */
765 ldb.credentials = options.get_credentials();
766 gc_ldb.credentials = options.get_credentials();
767
768 var ok = ldb.connect("ldap://" + host);
769 var base_dn = find_basedn(ldb);
770 var configuration_dn = find_configurationdn(ldb);
771 var schema_dn = find_schemadn(ldb);
772
773 printf("baseDN: %s\n", base_dn);
774
775 var ok = gc_ldb.connect("ldap://" + host + ":3268");
776 if (!ok) {
777         gc_ldb = undefined;
778 }
779
780 basic_tests(ldb, gc_ldb, base_dn, configuration_dn, schema_dn)
781
782 basedn_tests(ldb, gc_ldb)
783
784 return 0;