2 # -*- coding: utf-8 -*-
3 # This is a port of the original in testprogs/ejs/ldap.js
11 sys
.path
.append("bin/python")
13 import samba
.getopt
as options
15 from samba
.auth
import system_session
16 from ldb
import SCOPE_SUBTREE
, SCOPE_ONELEVEL
, SCOPE_BASE
, LdbError
17 from ldb
import ERR_NO_SUCH_OBJECT
, ERR_ATTRIBUTE_OR_VALUE_EXISTS
18 from ldb
import ERR_ENTRY_ALREADY_EXISTS
, ERR_UNWILLING_TO_PERFORM
19 from ldb
import ERR_NOT_ALLOWED_ON_NON_LEAF
, ERR_OTHER
, ERR_INVALID_DN_SYNTAX
20 from ldb
import ERR_NO_SUCH_ATTRIBUTE
21 from ldb
import ERR_OBJECT_CLASS_VIOLATION
, ERR_NOT_ALLOWED_ON_RDN
22 from ldb
import ERR_NAMING_VIOLATION
, ERR_CONSTRAINT_VIOLATION
23 from ldb
import ERR_UNDEFINED_ATTRIBUTE_TYPE
24 from ldb
import Message
, MessageElement
, Dn
25 from ldb
import FLAG_MOD_ADD
, FLAG_MOD_REPLACE
, FLAG_MOD_DELETE
27 from samba
import UF_NORMAL_ACCOUNT
28 from samba
import UF_WORKSTATION_TRUST_ACCOUNT
29 from samba
import UF_PASSWD_NOTREQD
, UF_ACCOUNTDISABLE
30 from samba
import ATYPE_NORMAL_ACCOUNT
, ATYPE_WORKSTATION_TRUST
32 from subunit
.run
import SubunitTestRunner
35 from samba
.ndr
import ndr_pack
, ndr_unpack
36 from samba
.dcerpc
import security
38 parser
= optparse
.OptionParser("ldap [options] <host>")
39 sambaopts
= options
.SambaOptions(parser
)
40 parser
.add_option_group(sambaopts
)
41 parser
.add_option_group(options
.VersionOptions(parser
))
42 # use command line creds if available
43 credopts
= options
.CredentialsOptions(parser
)
44 parser
.add_option_group(credopts
)
45 opts
, args
= parser
.parse_args()
53 lp
= sambaopts
.get_loadparm()
54 creds
= credopts
.get_credentials(lp
)
56 class BasicTests(unittest
.TestCase
):
57 def delete_force(self
, ldb
, dn
):
60 except LdbError
, (num
, _
):
61 self
.assertEquals(num
, ERR_NO_SUCH_OBJECT
)
63 def find_basedn(self
, ldb
):
64 res
= ldb
.search(base
="", expression
="", scope
=SCOPE_BASE
,
65 attrs
=["defaultNamingContext"])
66 self
.assertEquals(len(res
), 1)
67 return res
[0]["defaultNamingContext"][0]
69 def find_configurationdn(self
, ldb
):
70 res
= ldb
.search(base
="", expression
="", scope
=SCOPE_BASE
, attrs
=["configurationNamingContext"])
71 self
.assertEquals(len(res
), 1)
72 return res
[0]["configurationNamingContext"][0]
74 def find_schemadn(self
, ldb
):
75 res
= ldb
.search(base
="", expression
="", scope
=SCOPE_BASE
, attrs
=["schemaNamingContext"])
76 self
.assertEquals(len(res
), 1)
77 return res
[0]["schemaNamingContext"][0]
79 def find_domain_sid(self
):
80 res
= self
.ldb
.search(base
=self
.base_dn
, expression
="(objectClass=*)", scope
=SCOPE_BASE
)
81 return ndr_unpack( security
.dom_sid
,res
[0]["objectSid"][0])
86 self
.base_dn
= self
.find_basedn(ldb
)
87 self
.configuration_dn
= self
.find_configurationdn(ldb
)
88 self
.schema_dn
= self
.find_schemadn(ldb
)
89 self
.domain_sid
= self
.find_domain_sid()
91 print "baseDN: %s\n" % self
.base_dn
93 self
.delete_force(self
.ldb
, "cn=ldaptestuser,cn=users," + self
.base_dn
)
94 self
.delete_force(self
.ldb
, "cn=ldaptestuser2,cn=users," + self
.base_dn
)
95 self
.delete_force(self
.ldb
, "cn=ldaptestuser3,cn=users," + self
.base_dn
)
96 self
.delete_force(self
.ldb
, "cn=ldaptestuser4,cn=ldaptestcontainer," + self
.base_dn
)
97 self
.delete_force(self
.ldb
, "cn=ldaptestuser4,cn=ldaptestcontainer2," + self
.base_dn
)
98 self
.delete_force(self
.ldb
, "cn=ldaptestuser5,cn=users," + self
.base_dn
)
99 self
.delete_force(self
.ldb
, "cn=ldaptestgroup,cn=users," + self
.base_dn
)
100 self
.delete_force(self
.ldb
, "cn=ldaptestgroup2,cn=users," + self
.base_dn
)
101 self
.delete_force(self
.ldb
, "cn=ldaptestcomputer,cn=computers," + self
.base_dn
)
102 self
.delete_force(self
.ldb
, "cn=ldaptest2computer,cn=computers," + self
.base_dn
)
103 self
.delete_force(self
.ldb
, "cn=ldaptestcomputer3,cn=computers," + self
.base_dn
)
104 self
.delete_force(self
.ldb
, "cn=ldaptestutf8user èùéìòà,cn=users," + self
.base_dn
)
105 self
.delete_force(self
.ldb
, "cn=ldaptestutf8user2 èùéìòà,cn=users," + self
.base_dn
)
106 self
.delete_force(self
.ldb
, "cn=ldaptestcontainer," + self
.base_dn
)
107 self
.delete_force(self
.ldb
, "cn=ldaptestcontainer2," + self
.base_dn
)
108 self
.delete_force(self
.ldb
, "cn=parentguidtest,cn=users," + self
.base_dn
)
109 self
.delete_force(self
.ldb
, "cn=parentguidtest,cn=testotherusers," + self
.base_dn
)
110 self
.delete_force(self
.ldb
, "cn=testotherusers," + self
.base_dn
)
111 self
.delete_force(self
.ldb
, "cn=ldaptestobject," + self
.base_dn
)
112 self
.delete_force(self
.ldb
, "description=xyz,cn=users," + self
.base_dn
)
113 self
.delete_force(self
.ldb
, "ou=testou,cn=users," + self
.base_dn
)
115 def test_system_only(self
):
116 """Test systemOnly objects"""
117 print "Test systemOnly objects"""
121 "dn
": "cn
=ldaptestobject
," + self.base_dn,
122 "objectclass
": "configuration
"})
124 except LdbError, (num, _):
125 self.assertEquals(num, ERR_UNWILLING_TO_PERFORM)
127 self.delete_force(self.ldb, "cn
=ldaptestobject
," + self.base_dn)
129 def test_invalid_parent(self):
130 """Test adding an object with invalid parent"""
131 print "Test adding an
object with invalid parent
"""
135 "dn": "cn=ldaptestgroup,cn=thisdoesnotexist123,"
137 "objectclass": "group"})
139 except LdbError, (num, _):
140 self.assertEquals(num, ERR_NO_SUCH_OBJECT)
142 self.delete_force(self.ldb, "cn=ldaptestgroup,cn=thisdoesnotexist123,"
147 "dn": "ou=testou,cn=users," + self.base_dn,
148 "objectclass": "organizationalUnit"})
150 except LdbError, (num, _):
151 self.assertEquals(num, ERR_NAMING_VIOLATION)
153 self.delete_force(self.ldb, "ou=testou,cn=users," + self.base_dn)
155 def test_invalid_attribute(self):
156 """Test adding invalid
attributes (not in schema
)"""
157 print "Test adding invalid attributes (not in schema)"""
161 "dn": "cn=ldaptestgroup,cn=users," + self
.base_dn
,
162 "objectclass": "group",
163 "thisdoesnotexist": "x"})
165 except LdbError
, (num
, _
):
166 self
.assertEquals(num
, ERR_NO_SUCH_ATTRIBUTE
)
169 "dn": "cn=ldaptestgroup,cn=users," + self
.base_dn
,
170 "objectclass": "group"})
173 m
.dn
= Dn(ldb
, "cn=ldaptestgroup,cn=users," + self
.base_dn
)
174 m
["thisdoesnotexist"] = MessageElement("x", FLAG_MOD_REPLACE
,
179 except LdbError
, (num
, _
):
180 self
.assertEquals(num
, ERR_NO_SUCH_ATTRIBUTE
)
182 self
.delete_force(self
.ldb
, "cn=ldaptestgroup,cn=users," + self
.base_dn
)
184 def test_single_valued_attributes(self
):
185 """Test single-valued attributes"""
186 print "Test single-valued attributes"""
190 "dn
": "cn
=ldaptestgroup
,cn
=users
," + self.base_dn,
191 "objectclass
": "group
",
192 "sAMAccountName
": ["nam1
", "nam2
"]})
194 except LdbError, (num, _):
195 self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
198 "dn
": "cn
=ldaptestgroup
,cn
=users
," + self.base_dn,
199 "objectclass
": "group
"})
202 m.dn = Dn(ldb, "cn
=ldaptestgroup
,cn
=users
," + self.base_dn)
203 m["sAMAccountName
"] = MessageElement(["nam1
","nam2
"], FLAG_MOD_REPLACE,
208 except LdbError, (num, _):
209 self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
212 m.dn = Dn(ldb, "cn
=ldaptestgroup
,cn
=users
," + self.base_dn)
213 m["sAMAccountName
"] = MessageElement("testgroupXX
", FLAG_MOD_REPLACE,
218 m.dn = Dn(ldb, "cn
=ldaptestgroup
,cn
=users
," + self.base_dn)
219 m["sAMAccountName
"] = MessageElement("testgroupXX2
", FLAG_MOD_ADD,
224 except LdbError, (num, _):
225 self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
227 self.delete_force(self.ldb, "cn
=ldaptestgroup
,cn
=users
," + self.base_dn)
229 def test_multi_valued_attributes(self):
230 """Test multi-valued attributes"""
231 print "Test multi
-valued attributes
"""
233 # TODO: In this test I added some special tests where I got very unusual
234 # results back from a real AD. s4 doesn't match them and I've no idea how to
235 # implement those error cases (maybe there exists a special trigger for
236 # "description" attributes which handle them)
239 "dn": "cn=ldaptestgroup,cn=users," + self.base_dn,
240 "description": "desc2",
241 "objectclass": "group",
242 "description": "desc1"})
244 self.delete_force(self.ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
247 "dn": "cn=ldaptestgroup,cn=users," + self.base_dn,
248 "objectclass": "group",
249 "description": ["desc1", "desc2"]})
252 # m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
253 # m["description"] = MessageElement(["desc1","desc2"], FLAG_MOD_REPLACE,
258 # except LdbError, (num, _):
259 # self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
262 m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
263 m["description"] = MessageElement("desc1", FLAG_MOD_REPLACE,
268 # m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
269 # m["description"] = MessageElement("desc3", FLAG_MOD_ADD,
274 # except LdbError, (num, _):
275 # self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
278 m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
279 m["description"] = MessageElement(["desc1","desc2"], FLAG_MOD_DELETE,
284 except LdbError, (num, _):
285 self.assertEquals(num, ERR_NO_SUCH_ATTRIBUTE)
288 m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
289 m["description"] = MessageElement("desc1", FLAG_MOD_DELETE,
294 # m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
295 # m["description"] = MessageElement(["desc1","desc2"], FLAG_MOD_REPLACE,
300 # except LdbError, (num, _):
301 # self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
304 # m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
305 # m["description"] = MessageElement(["desc3", "desc4"], FLAG_MOD_ADD,
310 # except LdbError, (num, _):
311 # self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
314 m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
315 m["description"] = MessageElement("desc3", FLAG_MOD_ADD,
319 self.delete_force(self.ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
321 def test_empty_messages(self):
322 """Test empty messages
"""
323 print "Test empty messages"""
326 m
.dn
= Dn(ldb
, "cn=ldaptestgroup,cn=users," + self
.base_dn
)
331 except LdbError
, (num
, _
):
332 self
.assertEquals(num
, ERR_OBJECT_CLASS_VIOLATION
)
337 except LdbError
, (num
, _
):
338 self
.assertEquals(num
, ERR_UNWILLING_TO_PERFORM
)
340 self
.delete_force(self
.ldb
, "cn=ldaptestgroup,cn=users," + self
.base_dn
)
342 def test_empty_attributes(self
):
343 """Test empty attributes"""
344 print "Test empty attributes"""
347 m.dn = Dn(ldb, "cn
=ldaptestgroup
,cn
=users
," + self.base_dn)
348 m["objectClass
"] = MessageElement("group
", FLAG_MOD_ADD, "objectClass
")
349 m["description
"] = MessageElement([], FLAG_MOD_ADD, "description
")
354 except LdbError, (num, _):
355 self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
358 "dn
": "cn
=ldaptestgroup
,cn
=users
," + self.base_dn,
359 "objectclass
": "group
"})
362 m.dn = Dn(ldb, "cn
=ldaptestgroup
,cn
=users
," + self.base_dn)
363 m["description
"] = MessageElement([], FLAG_MOD_ADD, "description
")
368 except LdbError, (num, _):
369 self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
372 m.dn = Dn(ldb, "cn
=ldaptestgroup
,cn
=users
," + self.base_dn)
373 m["description
"] = MessageElement([], FLAG_MOD_REPLACE, "description
")
377 m.dn = Dn(ldb, "cn
=ldaptestgroup
,cn
=users
," + self.base_dn)
378 m["description
"] = MessageElement([], FLAG_MOD_DELETE, "description
")
382 except LdbError, (num, _):
383 self.assertEquals(num, ERR_NO_SUCH_ATTRIBUTE)
385 self.delete_force(self.ldb, "cn
=ldaptestgroup
,cn
=users
," + self.base_dn)
387 def test_distinguished_name(self):
388 """Tests the 'distinguishedName' attribute"""
389 print "Tests the
'distinguishedName' attribute
"""
392 "dn": "cn=ldaptestgroup,cn=users," + self.base_dn,
393 "objectclass": "group"})
396 m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
397 m["distinguishedName"] = MessageElement(
398 "cn=ldaptestuser,cn=users," + self.base_dn, FLAG_MOD_ADD,
404 except LdbError, (num, _):
405 self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
408 m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
409 m["distinguishedName"] = MessageElement(
410 "cn=ldaptestuser,cn=users," + self.base_dn, FLAG_MOD_REPLACE,
416 except LdbError, (num, _):
417 self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
420 m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
421 m["distinguishedName"] = MessageElement(
422 "cn=ldaptestuser,cn=users," + self.base_dn, FLAG_MOD_DELETE,
428 except LdbError, (num, _):
429 self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
431 self.delete_force(self.ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
433 def test_rdn_name(self):
435 print "Tests the RDN"""
439 "dn": "description=xyz,cn=users," + self
.base_dn
,
440 "objectclass": "group"})
442 except LdbError
, (num
, _
):
443 self
.assertEquals(num
, ERR_NAMING_VIOLATION
)
445 self
.delete_force(self
.ldb
, "description=xyz,cn=users," + self
.base_dn
)
448 "dn": "cn=ldaptestgroup,cn=users," + self
.base_dn
,
449 "objectclass": "group"})
452 m
.dn
= Dn(ldb
, "cn=ldaptestgroup,cn=users," + self
.base_dn
)
453 m
["name"] = MessageElement("cn=ldaptestuser", FLAG_MOD_REPLACE
,
459 except LdbError
, (num
, _
):
460 self
.assertEquals(num
, ERR_NOT_ALLOWED_ON_RDN
)
463 m
.dn
= Dn(ldb
, "cn=ldaptestgroup,cn=users," + self
.base_dn
)
464 m
["cn"] = MessageElement("ldaptestuser",
465 FLAG_MOD_REPLACE
, "cn")
470 except LdbError
, (num
, _
):
471 self
.assertEquals(num
, ERR_NOT_ALLOWED_ON_RDN
)
473 self
.delete_force(self
.ldb
, "cn=ldaptestgroup,cn=users," + self
.base_dn
)
476 # this test needs to be disabled until we really understand
477 # what the rDN length constraints are
478 def DISABLED_test_largeRDN(self
):
479 """Testing large rDN (limit 64 characters)"""
480 rdn
= "CN=a012345678901234567890123456789012345678901234567890123456789012";
481 self
.delete_force(self
.ldb
, "%s,%s" % (rdn
, self
.base_dn
))
483 dn: %s,%s""" % (rdn
,self
.base_dn
) + """
484 objectClass: container
486 self
.ldb
.add_ldif(ldif
)
487 self
.delete_force(self
.ldb
, "%s,%s" % (rdn
, self
.base_dn
))
489 rdn
= "CN=a0123456789012345678901234567890123456789012345678901234567890120";
490 self
.delete_force(self
.ldb
, "%s,%s" % (rdn
, self
.base_dn
))
493 dn: %s,%s""" % (rdn
,self
.base_dn
) + """
494 objectClass: container
496 self
.ldb
.add_ldif(ldif
)
498 except LdbError
, (num
, _
):
499 self
.assertEquals(num
, ERR_CONSTRAINT_VIOLATION
)
500 self
.delete_force(self
.ldb
, "%s,%s" % (rdn
, self
.base_dn
))
502 def test_rename(self
):
503 """Tests the rename operation"""
504 print "Tests the rename operations"""
507 "dn
": "cn
=ldaptestuser2
,cn
=users
," + self.base_dn,
508 "objectclass
": ["user
", "person
"] })
510 ldb.rename("cn
=ldaptestuser2
,cn
=users
," + self.base_dn, "cn
=ldaptestuser2
,cn
=users
," + self.base_dn)
511 ldb.rename("cn
=ldaptestuser2
,cn
=users
," + self.base_dn, "cn
=ldaptestuser3
,cn
=users
," + self.base_dn)
512 ldb.rename("cn
=ldaptestuser3
,cn
=users
," + self.base_dn, "cn
=ldaptestUSER3
,cn
=users
," + self.base_dn)
514 ldb.rename("cn
=ldaptestuser3
,cn
=users
," + self.base_dn, ",cn
=users
," + self.base_dn)
516 except LdbError, (num, _):
517 self.assertEquals(num, ERR_INVALID_DN_SYNTAX)
519 self.delete_force(self.ldb, "cn
=ldaptestuser3
,cn
=users
," + self.base_dn)
521 def test_rename_twice(self):
522 """Tests the rename operation twice - this corresponds to a past bug"""
523 print "Tests the rename twice operation
"""
526 "dn": "cn=ldaptestuser5,cn=users," + self.base_dn,
527 "objectclass": ["user", "person"] })
529 ldb.rename("cn=ldaptestuser5,cn=users," + self.base_dn, "cn=ldaptestUSER5,cn=users," + self.base_dn)
530 self.delete_force(self.ldb, "cn=ldaptestuser5,cn=users," + self.base_dn)
532 "dn": "cn=ldaptestuser5,cn=users," + self.base_dn,
533 "objectclass": ["user", "person"] })
534 ldb.rename("cn=ldaptestuser5,cn=Users," + self.base_dn, "cn=ldaptestUSER5,cn=users," + self.base_dn)
535 res = ldb.search(expression="cn=ldaptestuser5")
536 print "Found %u records" % len(res)
537 self.assertEquals(len(res), 1, "Wrong number of hits for cn=ldaptestuser5")
538 res = ldb.search(expression="(&(cn=ldaptestuser5)(objectclass=user))")
539 print "Found %u records" % len(res)
540 self.assertEquals(len(res), 1, "Wrong number of hits for (&(cn=ldaptestuser5)(objectclass=user))")
541 self.delete_force(self.ldb, "cn=ldaptestuser5,cn=users," + self.base_dn)
543 def test_parentGUID(self):
544 """Test parentGUID behaviour
"""
545 print "Testing parentGUID behaviour\n"
547 # TODO: This seems to fail on Windows Server. Hidden attribute?
550 "dn": "cn=parentguidtest,cn=users," + self.base_dn,
551 "objectclass":"user",
552 "samaccountname":"parentguidtest"});
553 res1 = ldb.search(base="cn=parentguidtest,cn=users," + self.base_dn, scope=SCOPE_BASE,
554 attrs=["parentGUID", "samaccountname"]);
555 res2 = ldb.search(base="cn=users," + self.base_dn,scope=SCOPE_BASE,
556 attrs=["objectGUID"]);
557 res3 = ldb.search(base=self.base_dn, scope=SCOPE_BASE,
558 attrs=["parentGUID"]);
560 """Check
if the parentGUID
is valid
"""
561 self.assertEquals(res1[0]["parentGUID"], res2[0]["objectGUID"]);
563 """Check
if it returns nothing when there
is no parent
object"""
564 has_parentGUID = False
565 for key in res3[0].keys():
566 if key == "parentGUID":
567 has_parentGUID = True
569 self.assertFalse(has_parentGUID);
571 """Ensures that
if you look
for another
object attribute after the constructed
572 parentGUID
, it will
return correctly
"""
573 has_another_attribute = False
574 for key in res1[0].keys():
575 if key == "sAMAccountName":
576 has_another_attribute = True
578 self.assertTrue(has_another_attribute)
579 self.assertTrue(len(res1[0]["samaccountname"]) == 1)
580 self.assertEquals(res1[0]["samaccountname"][0], "parentguidtest");
582 print "Testing parentGUID behaviour on rename\n"
585 "dn": "cn=testotherusers," + self.base_dn,
586 "objectclass":"container"});
587 res1 = ldb.search(base="cn=testotherusers," + self.base_dn,scope=SCOPE_BASE,
588 attrs=["objectGUID"]);
589 ldb.rename("cn=parentguidtest,cn=users," + self.base_dn,
590 "cn=parentguidtest,cn=testotherusers," + self.base_dn);
591 res2 = ldb.search(base="cn=parentguidtest,cn=testotherusers," + self.base_dn,
593 attrs=["parentGUID"]);
594 self.assertEquals(res1[0]["objectGUID"], res2[0]["parentGUID"]);
596 self.delete_force(self.ldb, "cn=parentguidtest,cn=testotherusers," + self.base_dn)
597 self.delete_force(self.ldb, "cn=testotherusers," + self.base_dn)
599 def test_groupType_int32(self):
600 """Test
groupType (int32
) behaviour (should appear to be casted to a
32 bit signed integer before comparsion
)"""
601 print "Testing groupType (int32) behaviour\n"
603 res1 = ldb.search(base=self.base_dn, scope=SCOPE_SUBTREE,
604 attrs=["groupType"], expression="groupType=2147483653");
606 res2 = ldb.search(base=self.base_dn, scope=SCOPE_SUBTREE,
607 attrs=["groupType"], expression="groupType=-2147483643");
609 self.assertEquals(len(res1), len(res2))
611 self.assertTrue(res1.count > 0)
613 self.assertEquals(res1[0]["groupType"][0], "-2147483643")
615 def test_groups(self):
616 """This tests the group
behaviour (setting
, changing
) of a user account
"""
617 print "Testing group behaviour\n"
620 "dn": "cn=ldaptestgroup,cn=users," + self.base_dn,
621 "objectclass": "group"})
624 "dn": "cn=ldaptestgroup2,cn=users," + self.base_dn,
625 "objectclass": "group"})
627 res1 = ldb.search("cn=ldaptestgroup,cn=users," + self.base_dn,
628 scope=SCOPE_BASE, attrs=["objectSID"])
629 self.assertTrue(len(res1) == 1)
630 group_rid_1 = security.dom_sid(ldb.schema_format_value("objectSID",
631 res1[0]["objectSID"][0])).split()[1]
633 res1 = ldb.search("cn=ldaptestgroup2,cn=users," + self.base_dn,
634 scope=SCOPE_BASE, attrs=["objectSID"])
635 self.assertTrue(len(res1) == 1)
636 group_rid_2 = security.dom_sid(ldb.schema_format_value("objectSID",
637 res1[0]["objectSID"][0])).split()[1]
639 # Try to create a user with an invalid primary group
642 "dn": "cn=ldaptestuser,cn=users," + self.base_dn,
643 "objectclass": ["user", "person"],
644 "primaryGroupID": "0"})
646 except LdbError, (num, _):
647 self.assertEquals(num, ERR_UNWILLING_TO_PERFORM)
648 self.delete_force(self.ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
650 # Try to Create a user with a valid primary group
651 # TODO Some more investigation needed here
654 # "dn": "cn=ldaptestuser,cn=users," + self.base_dn,
655 # "objectclass": ["user", "person"],
656 # "primaryGroupID": str(group_rid_1)})
658 # except LdbError, (num, _):
659 # self.assertEquals(num, ERR_UNWILLING_TO_PERFORM)
660 # self.delete_force(self.ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
663 "dn": "cn=ldaptestuser,cn=users," + self.base_dn,
664 "objectclass": ["user", "person"]})
666 # Try to add invalid primary group
668 m.dn = Dn(ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
669 m["primaryGroupID"] = MessageElement("0", FLAG_MOD_REPLACE,
674 except LdbError, (num, _):
675 self.assertEquals(num, ERR_UNWILLING_TO_PERFORM)
677 # Try to make group 1 primary - should be denied since it is not yet
680 m.dn = Dn(ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
681 m["primaryGroupID"] = MessageElement(str(group_rid_1),
682 FLAG_MOD_REPLACE, "primaryGroupID")
686 except LdbError, (num, _):
687 self.assertEquals(num, ERR_UNWILLING_TO_PERFORM)
689 # Make group 1 secondary
691 m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
692 m["member"] = MessageElement("cn=ldaptestuser,cn=users," + self.base_dn,
693 FLAG_MOD_REPLACE, "member")
696 # Make group 1 primary
698 m.dn = Dn(ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
699 m["primaryGroupID"] = MessageElement(str(group_rid_1),
700 FLAG_MOD_REPLACE, "primaryGroupID")
703 # Try to delete group 1 - should be denied
705 ldb.delete("cn=ldaptestgroup,cn=users," + self.base_dn)
707 except LdbError, (num, _):
708 self.assertEquals(num, ERR_ENTRY_ALREADY_EXISTS)
710 # Try to add group 1 also as secondary - should be denied
712 m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
713 m["member"] = MessageElement("cn=ldaptestuser,cn=users," + self.base_dn,
714 FLAG_MOD_ADD, "member")
718 except LdbError, (num, _):
719 self.assertEquals(num, ERR_ENTRY_ALREADY_EXISTS)
721 # Try to add invalid member to group 1 - should be denied
723 m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
724 m["member"] = MessageElement(
725 "cn=ldaptestuser3,cn=users," + self.base_dn,
726 FLAG_MOD_ADD, "member")
730 except LdbError, (num, _):
731 self.assertEquals(num, ERR_NO_SUCH_OBJECT)
733 # Make group 2 secondary
735 m.dn = Dn(ldb, "cn=ldaptestgroup2,cn=users," + self.base_dn)
736 m["member"] = MessageElement("cn=ldaptestuser,cn=users," + self.base_dn,
737 FLAG_MOD_ADD, "member")
742 m.dn = Dn(ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
743 m["primaryGroupID"] = MessageElement(str(group_rid_2),
744 FLAG_MOD_REPLACE, "primaryGroupID")
747 # Old primary group should contain a "member" attribute for the user,
748 # the new shouldn't contain anymore one
749 res1 = ldb.search("cn=ldaptestgroup, cn=users," + self.base_dn,
750 scope=SCOPE_BASE, attrs=["member"])
751 self.assertTrue(len(res1) == 1)
752 self.assertTrue(len(res1[0]["member"]) == 1)
753 self.assertEquals(res1[0]["member"][0].lower(),
754 ("cn=ldaptestuser,cn=users," + self.base_dn).lower())
756 res1 = ldb.search("cn=ldaptestgroup2, cn=users," + self.base_dn,
757 scope=SCOPE_BASE, attrs=["member"])
758 self.assertTrue(len(res1) == 1)
759 self.assertFalse("member" in res1[0])
761 # Also this should be denied
764 "dn": "cn=ldaptestuser1,cn=users," + self.base_dn,
765 "objectclass": ["user", "person"],
766 "primaryGroupID": "0"})
768 except LdbError, (num, _):
769 self.assertEquals(num, ERR_UNWILLING_TO_PERFORM)
771 self.delete_force(self.ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
772 self.delete_force(self.ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
773 self.delete_force(self.ldb, "cn=ldaptestgroup2,cn=users," + self.base_dn)
775 def test_primary_group_token(self):
776 """Test the primary group token
behaviour (hidden
-generated
-readonly attribute on groups
)"""
777 print "Testing primary group token behaviour\n"
781 "dn": "cn=ldaptestgroup,cn=users," + self.base_dn,
782 "objectclass": "group",
783 "primaryGroupToken": "100"})
785 except LdbError, (num, _):
786 self.assertEquals(num, ERR_UNDEFINED_ATTRIBUTE_TYPE)
787 self.delete_force(self.ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
790 "dn": "cn=ldaptestuser,cn=users," + self.base_dn,
791 "objectclass": ["user", "person"]})
794 "dn": "cn=ldaptestgroup,cn=users," + self.base_dn,
795 "objectclass": "group"})
797 # Testing for one invalid, and one valid operational attribute, but also the things they are built from
798 res1 = ldb.search(self.base_dn,
799 scope=SCOPE_BASE, attrs=["primaryGroupToken", "canonicalName", "objectClass", "objectSid"])
800 self.assertTrue(len(res1) == 1)
801 self.assertFalse("primaryGroupToken" in res1[0])
802 self.assertTrue("canonicalName" in res1[0])
803 self.assertTrue("objectClass" in res1[0])
804 self.assertTrue("objectSid" in res1[0])
806 res1 = ldb.search(self.base_dn,
807 scope=SCOPE_BASE, attrs=["primaryGroupToken", "canonicalName"])
808 self.assertTrue(len(res1) == 1)
809 self.assertFalse("primaryGroupToken" in res1[0])
810 self.assertFalse("objectSid" in res1[0])
811 self.assertFalse("objectClass" in res1[0])
812 self.assertTrue("canonicalName" in res1[0])
814 res1 = ldb.search("cn=users,"+self.base_dn,
815 scope=SCOPE_BASE, attrs=["primaryGroupToken"])
816 self.assertTrue(len(res1) == 1)
817 self.assertFalse("primaryGroupToken" in res1[0])
819 res1 = ldb.search("cn=ldaptestuser, cn=users," + self.base_dn,
820 scope=SCOPE_BASE, attrs=["primaryGroupToken"])
821 self.assertTrue(len(res1) == 1)
822 self.assertFalse("primaryGroupToken" in res1[0])
824 res1 = ldb.search("cn=ldaptestgroup,cn=users," + self.base_dn,
826 self.assertTrue(len(res1) == 1)
827 self.assertFalse("primaryGroupToken" in res1[0])
829 res1 = ldb.search("cn=ldaptestgroup,cn=users," + self.base_dn,
830 scope=SCOPE_BASE, attrs=["primaryGroupToken", "objectSID"])
831 self.assertTrue(len(res1) == 1)
832 primary_group_token = int(res1[0]["primaryGroupToken"][0])
834 rid = security.dom_sid(ldb.schema_format_value("objectSID", res1[0]["objectSID"][0])).split()[1]
835 self.assertEquals(primary_group_token, rid)
838 m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
839 m["primaryGroupToken"] = "100"
843 except LdbError, (num, _):
844 self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
846 self.delete_force(self.ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
847 self.delete_force(self.ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
849 def test_wkguid(self):
850 """Test Well known GUID
behaviours (including DN
+Binary
)"""
851 print "Test Well known GUID behaviours (including DN+Binary)"""
853 res
= self
.ldb
.search(base
=("<WKGUID=ab1d30f3768811d1aded00c04fd8d5cd,%s>" % self
.base_dn
), scope
=SCOPE_BASE
, attrs
=[])
854 self
.assertEquals(len(res
), 1)
856 res2
= self
.ldb
.search(scope
=SCOPE_BASE
, attrs
=["wellKnownObjects"], expression
=("wellKnownObjects=B:32:ab1d30f3768811d1aded00c04fd8d5cd:%s" % res
[0].dn
))
857 self
.assertEquals(len(res2
), 1)
859 # Prove that the matching rule is over the whole DN+Binary
860 res2
= self
.ldb
.search(scope
=SCOPE_BASE
, attrs
=["wellKnownObjects"], expression
=("wellKnownObjects=B:32:ab1d30f3768811d1aded00c04fd8d5cd"))
861 self
.assertEquals(len(res2
), 0)
862 # Prove that the matching rule is over the whole DN+Binary
863 res2
= self
.ldb
.search(scope
=SCOPE_BASE
, attrs
=["wellKnownObjects"], expression
=("wellKnownObjects=%s") % res
[0].dn
)
864 self
.assertEquals(len(res2
), 0)
866 def test_subschemasubentry(self
):
867 """Test subSchemaSubEntry appears when requested, but not when not requested"""
868 print "Test subSchemaSubEntry"""
870 res = self.ldb.search(base=self.base_dn, scope=SCOPE_BASE, attrs=["subSchemaSubEntry
"])
871 self.assertEquals(len(res), 1)
872 self.assertEquals(res[0]["subSchemaSubEntry
"][0], "CN
=Aggregate
,"+self.schema_dn)
874 res = self.ldb.search(base=self.base_dn, scope=SCOPE_BASE, attrs=["*"])
875 self.assertEquals(len(res), 1)
876 self.assertTrue("subScheamSubEntry
" not in res[0])
881 print "Testing user add
"
884 "dn
": "cn
=ldaptestuser
,cn
=uSers
," + self.base_dn,
885 "objectclass
": ["user
", "person
"],
886 "cN
": "LDAPtestUSER
",
891 "dn
": "cn
=ldaptestgroup
,cn
=uSers
," + self.base_dn,
892 "objectclass
": "group
",
893 "member
": "cn
=ldaptestuser
,cn
=useRs
," + self.base_dn})
896 "dn
": "cn
=ldaptestcomputer
,cn
=computers
," + self.base_dn,
897 "objectclass
": "computer
",
898 "cN
": "LDAPtestCOMPUTER
"})
900 ldb.add({"dn
": "cn
=ldaptest2computer
,cn
=computers
," + self.base_dn,
901 "objectClass
": "computer
",
902 "cn
": "LDAPtest2COMPUTER
",
903 "userAccountControl
": str(UF_WORKSTATION_TRUST_ACCOUNT),
904 "displayname
": "ldap testy
"})
907 ldb.add({"dn
": "cn
=ldaptestcomputer3
,cn
=computers
," + self.base_dn,
908 "objectClass
": "computer
",
909 "cn
": "LDAPtest2COMPUTER
"
912 except LdbError, (num, _):
913 self.assertEquals(num, ERR_INVALID_DN_SYNTAX)
916 ldb.add({"dn
": "cn
=ldaptestcomputer3
,cn
=computers
," + self.base_dn,
917 "objectClass
": "computer
",
918 "cn
": "ldaptestcomputer3
",
919 "sAMAccountType
": str(ATYPE_NORMAL_ACCOUNT)
922 except LdbError, (num, _):
923 self.assertEquals(num, ERR_UNWILLING_TO_PERFORM)
925 ldb.add({"dn
": "cn
=ldaptestcomputer3
,cn
=computers
," + self.base_dn,
926 "objectClass
": "computer
",
927 "cn
": "LDAPtestCOMPUTER3
"
930 print "Testing ldb
.search
for (&(cn
=ldaptestcomputer3
)(objectClass
=user
))";
931 res = ldb.search(self.base_dn, expression="(&(cn
=ldaptestcomputer3
)(objectClass
=user
))");
932 self.assertEquals(len(res), 1, "Found only
%d for (&(cn
=ldaptestcomputer3
)(objectClass
=user
))" % len(res))
934 self.assertEquals(str(res[0].dn), ("CN
=ldaptestcomputer3
,CN
=Computers
," + self.base_dn));
935 self.assertEquals(res[0]["cn
"][0], "ldaptestcomputer3
");
936 self.assertEquals(res[0]["name
"][0], "ldaptestcomputer3
");
937 self.assertEquals(res[0]["objectClass
"][0], "top
");
938 self.assertEquals(res[0]["objectClass
"][1], "person
");
939 self.assertEquals(res[0]["objectClass
"][2], "organizationalPerson
");
940 self.assertEquals(res[0]["objectClass
"][3], "user
");
941 self.assertEquals(res[0]["objectClass
"][4], "computer
");
942 self.assertTrue("objectGUID
" in res[0])
943 self.assertTrue("whenCreated
" in res[0])
944 self.assertEquals(res[0]["objectCategory
"][0], ("CN
=Computer
,CN
=Schema
,CN
=Configuration
," + self.base_dn));
945 self.assertEquals(int(res[0]["primaryGroupID
"][0]), 513);
946 self.assertEquals(int(res[0]["sAMAccountType
"][0]), ATYPE_NORMAL_ACCOUNT);
947 self.assertEquals(int(res[0]["userAccountControl
"][0]), UF_NORMAL_ACCOUNT | UF_PASSWD_NOTREQD | UF_ACCOUNTDISABLE);
949 self.delete_force(self.ldb, "cn
=ldaptestcomputer3
,cn
=computers
," + self.base_dn)
951 print "Testing attribute
or value exists behaviour
"
954 dn: cn=ldaptest2computer,cn=computers,""" + self.base_dn + """
956 replace: servicePrincipalName
957 servicePrincipalName: host/ldaptest2computer
958 servicePrincipalName: host/ldaptest2computer
959 servicePrincipalName: cifs/ldaptest2computer
962 except LdbError, (num, msg):
963 self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
966 dn: cn=ldaptest2computer,cn=computers,""" + self.base_dn + """
968 replace: servicePrincipalName
969 servicePrincipalName: host/ldaptest2computer
970 servicePrincipalName: cifs/ldaptest2computer
974 dn: cn=ldaptest2computer,cn=computers,""" + self.base_dn + """
976 add: servicePrincipalName
977 servicePrincipalName: host/ldaptest2computer
980 except LdbError, (num, msg):
981 self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
983 print "Testing ranged results
"
985 dn: cn=ldaptest2computer,cn=computers,""" + self.base_dn + """
987 replace: servicePrincipalName
991 dn: cn=ldaptest2computer,cn=computers,""" + self.base_dn + """
993 add: servicePrincipalName
994 servicePrincipalName: host/ldaptest2computer0
995 servicePrincipalName: host/ldaptest2computer1
996 servicePrincipalName: host/ldaptest2computer2
997 servicePrincipalName: host/ldaptest2computer3
998 servicePrincipalName: host/ldaptest2computer4
999 servicePrincipalName: host/ldaptest2computer5
1000 servicePrincipalName: host/ldaptest2computer6
1001 servicePrincipalName: host/ldaptest2computer7
1002 servicePrincipalName: host/ldaptest2computer8
1003 servicePrincipalName: host/ldaptest2computer9
1004 servicePrincipalName: host/ldaptest2computer10
1005 servicePrincipalName: host/ldaptest2computer11
1006 servicePrincipalName: host/ldaptest2computer12
1007 servicePrincipalName: host/ldaptest2computer13
1008 servicePrincipalName: host/ldaptest2computer14
1009 servicePrincipalName: host/ldaptest2computer15
1010 servicePrincipalName: host/ldaptest2computer16
1011 servicePrincipalName: host/ldaptest2computer17
1012 servicePrincipalName: host/ldaptest2computer18
1013 servicePrincipalName: host/ldaptest2computer19
1014 servicePrincipalName: host/ldaptest2computer20
1015 servicePrincipalName: host/ldaptest2computer21
1016 servicePrincipalName: host/ldaptest2computer22
1017 servicePrincipalName: host/ldaptest2computer23
1018 servicePrincipalName: host/ldaptest2computer24
1019 servicePrincipalName: host/ldaptest2computer25
1020 servicePrincipalName: host/ldaptest2computer26
1021 servicePrincipalName: host/ldaptest2computer27
1022 servicePrincipalName: host/ldaptest2computer28
1023 servicePrincipalName: host/ldaptest2computer29
1026 res = ldb.search(self.base_dn, expression="(cn
=ldaptest2computer
))", scope=SCOPE_SUBTREE,
1027 attrs=["servicePrincipalName
;range=0-*"])
1028 self.assertEquals(len(res), 1, "Could
not find (cn
=ldaptest2computer
)")
1029 #print len(res[0]["servicePrincipalName
;range=0-*"])
1030 self.assertEquals(len(res[0]["servicePrincipalName
;range=0-*"]), 30)
1032 res = ldb.search(self.base_dn, expression="(cn
=ldaptest2computer
))", scope=SCOPE_SUBTREE, attrs=["servicePrincipalName
;range=0-19"])
1033 self.assertEquals(len(res), 1, "Could
not find (cn
=ldaptest2computer
)")
1034 # print res[0]["servicePrincipalName
;range=0-19"].length
1035 self.assertEquals(len(res[0]["servicePrincipalName
;range=0-19"]), 20)
1038 res = ldb.search(self.base_dn, expression="(cn
=ldaptest2computer
))", scope=SCOPE_SUBTREE, attrs=["servicePrincipalName
;range=0-30"])
1039 self.assertEquals(len(res), 1, "Could
not find (cn
=ldaptest2computer
)")
1040 self.assertEquals(len(res[0]["servicePrincipalName
;range=0-*"]), 30)
1042 res = ldb.search(self.base_dn, expression="(cn
=ldaptest2computer
))", scope=SCOPE_SUBTREE, attrs=["servicePrincipalName
;range=0-40"])
1043 self.assertEquals(len(res), 1, "Could
not find (cn
=ldaptest2computer
)")
1044 self.assertEquals(len(res[0]["servicePrincipalName
;range=0-*"]), 30)
1046 res = ldb.search(self.base_dn, expression="(cn
=ldaptest2computer
))", scope=SCOPE_SUBTREE, attrs=["servicePrincipalName
;range=30-40"])
1047 self.assertEquals(len(res), 1, "Could
not find (cn
=ldaptest2computer
)")
1048 self.assertEquals(len(res[0]["servicePrincipalName
;range=30-*"]), 0)
1051 res = ldb.search(self.base_dn, expression="(cn
=ldaptest2computer
))", scope=SCOPE_SUBTREE, attrs=["servicePrincipalName
;range=10-40"])
1052 self.assertEquals(len(res), 1, "Could
not find (cn
=ldaptest2computer
)")
1053 self.assertEquals(len(res[0]["servicePrincipalName
;range=10-*"]), 20)
1054 # pos_11 = res[0]["servicePrincipalName
;range=10-*"][18]
1056 res = ldb.search(self.base_dn, expression="(cn
=ldaptest2computer
))", scope=SCOPE_SUBTREE, attrs=["servicePrincipalName
;range=11-40"])
1057 self.assertEquals(len(res), 1, "Could
not find (cn
=ldaptest2computer
)")
1058 self.assertEquals(len(res[0]["servicePrincipalName
;range=11-*"]), 19)
1059 # print res[0]["servicePrincipalName
;range=11-*"][18]
1061 # self.assertEquals((res[0]["servicePrincipalName
;range=11-*"][18]), pos_11)
1063 res = ldb.search(self.base_dn, expression="(cn
=ldaptest2computer
))", scope=SCOPE_SUBTREE, attrs=["servicePrincipalName
;range=11-15"])
1064 self.assertEquals(len(res), 1, "Could
not find (cn
=ldaptest2computer
)")
1065 self.assertEquals(len(res[0]["servicePrincipalName
;range=11-15"]), 5)
1066 # self.assertEquals(res[0]["servicePrincipalName
;range=11-15"][4], pos_11)
1068 res = ldb.search(self.base_dn, expression="(cn
=ldaptest2computer
))", scope=SCOPE_SUBTREE, attrs=["servicePrincipalName
"])
1069 self.assertEquals(len(res), 1, "Could
not find (cn
=ldaptest2computer
)")
1070 # print res[0]["servicePrincipalName
"][18]
1072 self.assertEquals(len(res[0]["servicePrincipalName
"]), 30)
1073 # self.assertEquals(res[0]["servicePrincipalName
"][18], pos_11)
1075 self.delete_force(self.ldb, "cn
=ldaptestuser2
,cn
=users
," + self.base_dn)
1077 "dn
": "cn
=ldaptestuser2
,cn
=useRs
," + self.base_dn,
1078 "objectClass
": ["person
", "user
"],
1079 "cn
": "LDAPtestUSER2
",
1080 "givenname
": "testy
",
1081 "sn
": "ldap user2
"})
1083 print "Testing Ambigious Name Resolution
"
1084 # Testing ldb.search for (&(anr=ldap testy)(objectClass=user))
1085 res = ldb.search(expression="(&(anr
=ldap testy
)(objectClass
=user
))")
1086 self.assertEquals(len(res), 3, "Found only
%d of
3 for (&(anr
=ldap testy
)(objectClass
=user
))" % len(res))
1088 # Testing ldb.search for (&(anr=testy ldap)(objectClass=user))
1089 res = ldb.search(expression="(&(anr
=testy ldap
)(objectClass
=user
))")
1090 self.assertEquals(len(res), 2, "Found only
%d of
2 for (&(anr
=testy ldap
)(objectClass
=user
))" % len(res))
1092 # Testing ldb.search for (&(anr=ldap)(objectClass=user))
1093 res = ldb.search(expression="(&(anr
=ldap
)(objectClass
=user
))")
1094 self.assertEquals(len(res), 4, "Found only
%d of
4 for (&(anr
=ldap
)(objectClass
=user
))" % len(res))
1096 # Testing ldb.search for (&(anr==ldap)(objectClass=user))
1097 res = ldb.search(expression="(&(anr
==ldap
)(objectClass
=user
))")
1098 self.assertEquals(len(res), 1, "Could
not find (&(anr
==ldap
)(objectClass
=user
)). Found only
%d for (&(anr
=ldap
)(objectClass
=user
))" % len(res))
1100 self.assertEquals(str(res[0].dn), ("CN
=ldaptestuser
,CN
=Users
," + self.base_dn))
1101 self.assertEquals(res[0]["cn
"][0], "ldaptestuser
")
1102 self.assertEquals(str(res[0]["name
"]), "ldaptestuser
")
1104 # Testing ldb.search for (&(anr=testy)(objectClass=user))
1105 res = ldb.search(expression="(&(anr
=testy
)(objectClass
=user
))")
1106 self.assertEquals(len(res), 2, "Found only
%d for (&(anr
=testy
)(objectClass
=user
))" % len(res))
1108 # Testing ldb.search for (&(anr=testy ldap)(objectClass=user))
1109 res = ldb.search(expression="(&(anr
=testy ldap
)(objectClass
=user
))")
1110 self.assertEquals(len(res), 2, "Found only
%d for (&(anr
=testy ldap
)(objectClass
=user
))" % len(res))
1112 # Testing ldb.search for (&(anr==testy ldap)(objectClass=user))
1113 # this test disabled for the moment, as anr with == tests are not understood
1114 # res = ldb.search(expression="(&(anr
==testy ldap
)(objectClass
=user
))")
1115 # self.assertEquals(len(res), 1, "Found only
%d for (&(anr
==testy ldap
)(objectClass
=user
))" % len(res))
1117 # self.assertEquals(str(res[0].dn), ("CN
=ldaptestuser
,CN
=Users
," + self.base_dn))
1118 # self.assertEquals(res[0]["cn
"][0], "ldaptestuser
")
1119 # self.assertEquals(res[0]["name
"][0], "ldaptestuser
")
1121 # Testing ldb.search for (&(anr==testy ldap)(objectClass=user))
1122 # res = ldb.search(expression="(&(anr
==testy ldap
)(objectClass
=user
))")
1123 # self.assertEquals(len(res), 1, "Could
not find (&(anr
==testy ldap
)(objectClass
=user
))")
1125 # self.assertEquals(str(res[0].dn), ("CN
=ldaptestuser
,CN
=Users
," + self.base_dn))
1126 # self.assertEquals(res[0]["cn
"][0], "ldaptestuser
")
1127 # self.assertEquals(res[0]["name
"][0], "ldaptestuser
")
1129 # Testing ldb.search for (&(anr=testy ldap user)(objectClass=user))
1130 res = ldb.search(expression="(&(anr
=testy ldap user
)(objectClass
=user
))")
1131 self.assertEquals(len(res), 1, "Could
not find (&(anr
=testy ldap user
)(objectClass
=user
))")
1133 self.assertEquals(str(res[0].dn), ("CN
=ldaptestuser2
,CN
=Users
," + self.base_dn))
1134 self.assertEquals(str(res[0]["cn
"]), "ldaptestuser2
")
1135 self.assertEquals(str(res[0]["name
"]), "ldaptestuser2
")
1137 # Testing ldb.search for (&(anr==testy ldap user2)(objectClass=user))
1138 # res = ldb.search(expression="(&(anr
==testy ldap user2
)(objectClass
=user
))")
1139 # self.assertEquals(len(res), 1, "Could
not find (&(anr
==testy ldap user2
)(objectClass
=user
))")
1141 self.assertEquals(str(res[0].dn), ("CN
=ldaptestuser2
,CN
=Users
," + self.base_dn))
1142 self.assertEquals(str(res[0]["cn
"]), "ldaptestuser2
")
1143 self.assertEquals(str(res[0]["name
"]), "ldaptestuser2
")
1145 # Testing ldb.search for (&(anr==ldap user2)(objectClass=user))
1146 # res = ldb.search(expression="(&(anr
==ldap user2
)(objectClass
=user
))")
1147 # self.assertEquals(len(res), 1, "Could
not find (&(anr
==ldap user2
)(objectClass
=user
))")
1149 self.assertEquals(str(res[0].dn), ("CN
=ldaptestuser2
,CN
=Users
," + self.base_dn))
1150 self.assertEquals(str(res[0]["cn
"]), "ldaptestuser2
")
1151 self.assertEquals(str(res[0]["name
"]), "ldaptestuser2
")
1153 # Testing ldb.search for (&(anr==not ldap user2)(objectClass=user))
1154 # res = ldb.search(expression="(&(anr
==not ldap user2
)(objectClass
=user
))")
1155 # self.assertEquals(len(res), 0, "Must
not find (&(anr
==not ldap user2
)(objectClass
=user
))")
1157 # Testing ldb.search for (&(anr=not ldap user2)(objectClass=user))
1158 res = ldb.search(expression="(&(anr
=not ldap user2
)(objectClass
=user
))")
1159 self.assertEquals(len(res), 0, "Must
not find (&(anr
=not ldap user2
)(objectClass
=user
))")
1161 # Testing ldb.search for (&(anr="testy ldap
")(objectClass=user)) (ie, with quotes)
1162 # res = ldb.search(expression="(&(anr
==\"testy ldap
\")(objectClass
=user
))")
1163 # self.assertEquals(len(res), 0, "Found (&(anr
==\"testy ldap
\")(objectClass
=user
))")
1165 print "Testing Renames
"
1167 attrs = ["objectGUID
", "objectSid
"]
1168 print "Testing ldb
.search
for (&(cn
=ldaptestUSer2
)(objectClass
=user
))"
1169 res_user = ldb.search(self.base_dn, expression="(&(cn
=ldaptestUSer2
)(objectClass
=user
))", scope=SCOPE_SUBTREE, attrs=attrs)
1170 self.assertEquals(len(res_user), 1, "Could
not find (&(cn
=ldaptestUSer2
)(objectClass
=user
))")
1172 # Check rename works with extended/alternate DN forms
1173 ldb.rename("<SID
=" + ldb.schema_format_value("objectSID
", res_user[0]["objectSID
"][0]) + ">" , "cn
=ldaptestUSER3
,cn
=users
," + self.base_dn)
1175 print "Testing ldb
.search
for (&(cn
=ldaptestuser3
)(objectClass
=user
))"
1176 res = ldb.search(expression="(&(cn
=ldaptestuser3
)(objectClass
=user
))")
1177 self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptestuser3
)(objectClass
=user
))")
1179 self.assertEquals(str(res[0].dn), ("CN
=ldaptestUSER3
,CN
=Users
," + self.base_dn))
1180 self.assertEquals(str(res[0]["cn
"]), "ldaptestUSER3
")
1181 self.assertEquals(str(res[0]["name
"]), "ldaptestUSER3
")
1183 #"Testing ldb
.search
for (&(&(cn
=ldaptestuser3
)(userAccountControl
=*))(objectClass
=user
))"
1184 res = ldb.search(expression="(&(&(cn
=ldaptestuser3
)(userAccountControl
=*))(objectClass
=user
))")
1185 self.assertEquals(len(res), 1, "(&(&(cn
=ldaptestuser3
)(userAccountControl
=*))(objectClass
=user
))")
1187 self.assertEquals(str(res[0].dn), ("CN
=ldaptestUSER3
,CN
=Users
," + self.base_dn))
1188 self.assertEquals(str(res[0]["cn
"]), "ldaptestUSER3
")
1189 self.assertEquals(str(res[0]["name
"]), "ldaptestUSER3
")
1191 #"Testing ldb
.search
for (&(&(cn
=ldaptestuser3
)(userAccountControl
=546))(objectClass
=user
))"
1192 res = ldb.search(expression="(&(&(cn
=ldaptestuser3
)(userAccountControl
=546))(objectClass
=user
))")
1193 self.assertEquals(len(res), 1, "(&(&(cn
=ldaptestuser3
)(userAccountControl
=546))(objectClass
=user
))")
1195 self.assertEquals(str(res[0].dn), ("CN
=ldaptestUSER3
,CN
=Users
," + self.base_dn))
1196 self.assertEquals(str(res[0]["cn
"]), "ldaptestUSER3
")
1197 self.assertEquals(str(res[0]["name
"]), "ldaptestUSER3
")
1199 #"Testing ldb
.search
for (&(&(cn
=ldaptestuser3
)(userAccountControl
=547))(objectClass
=user
))"
1200 res = ldb.search(expression="(&(&(cn
=ldaptestuser3
)(userAccountControl
=547))(objectClass
=user
))")
1201 self.assertEquals(len(res), 0, "(&(&(cn
=ldaptestuser3
)(userAccountControl
=547))(objectClass
=user
))")
1203 # This is a Samba special, and does not exist in real AD
1204 # print "Testing ldb
.search
for (dn
=CN
=ldaptestUSER3
,CN
=Users
," + self.base_dn + ")"
1205 # res = ldb.search("(dn
=CN
=ldaptestUSER3
,CN
=Users
," + self.base_dn + ")")
1206 # if (res.error != 0 || len(res) != 1) {
1207 # print "Could
not find (dn
=CN
=ldaptestUSER3
,CN
=Users
," + self.base_dn + ")"
1208 # self.assertEquals(len(res), 1)
1210 # self.assertEquals(res[0].dn, ("CN
=ldaptestUSER3
,CN
=Users
," + self.base_dn))
1211 # self.assertEquals(res[0].cn, "ldaptestUSER3
")
1212 # self.assertEquals(res[0].name, "ldaptestUSER3
")
1214 print "Testing ldb
.search
for (distinguishedName
=CN
=ldaptestUSER3
,CN
=Users
," + self.base_dn + ")"
1215 res = ldb.search(expression="(distinguishedName
=CN
=ldaptestUSER3
,CN
=Users
," + self.base_dn + ")")
1216 self.assertEquals(len(res), 1, "Could
not find (dn
=CN
=ldaptestUSER3
,CN
=Users
," + self.base_dn + ")")
1217 self.assertEquals(str(res[0].dn), ("CN
=ldaptestUSER3
,CN
=Users
," + self.base_dn))
1218 self.assertEquals(str(res[0]["cn
"]), "ldaptestUSER3
")
1219 self.assertEquals(str(res[0]["name
"]), "ldaptestUSER3
")
1221 # ensure we cannot add it again
1223 ldb.add({"dn
": "cn
=ldaptestuser3
,cn
=userS
," + self.base_dn,
1224 "objectClass
": ["person
", "user
"],
1225 "cn
": "LDAPtestUSER3
"})
1227 except LdbError, (num, _):
1228 self.assertEquals(num, ERR_ENTRY_ALREADY_EXISTS)
1231 ldb.rename("cn
=ldaptestuser3
,cn
=users
," + self.base_dn, "cn
=ldaptestuser2
,cn
=users
," + self.base_dn)
1233 # ensure we cannot rename it twice
1235 ldb.rename("cn
=ldaptestuser3
,cn
=users
," + self.base_dn,
1236 "cn
=ldaptestuser2
,cn
=users
," + self.base_dn)
1238 except LdbError, (num, _):
1239 self.assertEquals(num, ERR_NO_SUCH_OBJECT)
1241 # ensure can now use that name
1242 ldb.add({"dn
": "cn
=ldaptestuser3
,cn
=users
," + self.base_dn,
1243 "objectClass
": ["person
", "user
"],
1244 "cn
": "LDAPtestUSER3
"})
1246 # ensure we now cannot rename
1248 ldb.rename("cn
=ldaptestuser2
,cn
=users
," + self.base_dn, "cn
=ldaptestuser3
,cn
=users
," + self.base_dn)
1250 except LdbError, (num, _):
1251 self.assertEquals(num, ERR_ENTRY_ALREADY_EXISTS)
1253 ldb.rename("cn
=ldaptestuser3
,cn
=users
," + self.base_dn, "cn
=ldaptestuser3
,cn
=configuration
," + self.base_dn)
1255 except LdbError, (num, _):
1256 self.assertTrue(num in (71, 64))
1258 ldb.rename("cn
=ldaptestuser3
,cn
=users
," + self.base_dn, "cn
=ldaptestuser5
,cn
=users
," + self.base_dn)
1260 ldb.delete("cn
=ldaptestuser5
,cn
=users
," + self.base_dn)
1262 self.delete_force(ldb, "cn
=ldaptestgroup2
,cn
=users
," + self.base_dn)
1264 ldb.rename("cn
=ldaptestgroup
,cn
=users
," + self.base_dn, "cn
=ldaptestgroup2
,cn
=users
," + self.base_dn)
1266 print "Testing subtree renames
"
1268 ldb.add({"dn
": "cn
=ldaptestcontainer
," + self.base_dn,
1269 "objectClass
": "container
"})
1271 ldb.add({"dn
": "CN
=ldaptestuser4
,CN
=ldaptestcontainer
," + self.base_dn,
1272 "objectClass
": ["person
", "user
"],
1273 "cn
": "LDAPtestUSER4
"})
1276 dn: cn=ldaptestgroup2,cn=users,""" + self.base_dn + """
1279 member: cn=ldaptestuser4,cn=ldaptestcontainer,""" + self.base_dn + """
1280 member: cn=ldaptestcomputer,cn=computers,""" + self.base_dn + """
1281 member: cn=ldaptestuser2,cn=users,""" + self.base_dn + """
1284 print "Testing ldb
.rename of cn
=ldaptestcontainer
," + self.base_dn + " to cn
=ldaptestcontainer2
," + self.base_dn
1285 ldb.rename("CN
=ldaptestcontainer
," + self.base_dn, "CN
=ldaptestcontainer2
," + self.base_dn)
1287 print "Testing ldb
.search
for (&(cn
=ldaptestuser4
)(objectClass
=user
))"
1288 res = ldb.search(expression="(&(cn
=ldaptestuser4
)(objectClass
=user
))")
1289 self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptestuser4
)(objectClass
=user
))")
1291 print "Testing subtree ldb
.search
for (&(cn
=ldaptestuser4
)(objectClass
=user
)) in (just renamed
from) cn
=ldaptestcontainer
," + self.base_dn
1293 res = ldb.search("cn
=ldaptestcontainer
," + self.base_dn,
1294 expression="(&(cn
=ldaptestuser4
)(objectClass
=user
))",
1295 scope=SCOPE_SUBTREE)
1297 except LdbError, (num, _):
1298 self.assertEquals(num, ERR_NO_SUCH_OBJECT)
1300 print "Testing one
-level ldb
.search
for (&(cn
=ldaptestuser4
)(objectClass
=user
)) in (just renamed
from) cn
=ldaptestcontainer
," + self.base_dn
1302 res = ldb.search("cn
=ldaptestcontainer
," + self.base_dn,
1303 expression="(&(cn
=ldaptestuser4
)(objectClass
=user
))", scope=SCOPE_ONELEVEL)
1305 except LdbError, (num, _):
1306 self.assertEquals(num, ERR_NO_SUCH_OBJECT)
1308 print "Testing ldb
.search
for (&(cn
=ldaptestuser4
)(objectClass
=user
)) in renamed container
"
1309 res = ldb.search("cn
=ldaptestcontainer2
," + self.base_dn, expression="(&(cn
=ldaptestuser4
)(objectClass
=user
))", scope=SCOPE_SUBTREE)
1310 self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptestuser4
)(objectClass
=user
)) under cn
=ldaptestcontainer2
," + self.base_dn)
1312 self.assertEquals(str(res[0].dn), ("CN
=ldaptestuser4
,CN
=ldaptestcontainer2
," + self.base_dn))
1313 self.assertEquals(res[0]["memberOf
"][0].upper(), ("CN
=ldaptestgroup2
,CN
=Users
," + self.base_dn).upper())
1317 print "Testing ldb
.search
for (&(member
=CN
=ldaptestuser4
,CN
=ldaptestcontainer2
," + self.base_dn + ")(objectclass
=group
)) to check subtree renames
and linked attributes
"
1318 res = ldb.search(self.base_dn, expression="(&(member
=CN
=ldaptestuser4
,CN
=ldaptestcontainer2
," + self.base_dn + ")(objectclass
=group
))", scope=SCOPE_SUBTREE)
1319 self.assertEquals(len(res), 1, "Could
not find (&(member
=CN
=ldaptestuser4
,CN
=ldaptestcontainer2
," + self.base_dn + ")(objectclass
=group
)), perhaps linked attributes are
not consistant with subtree renames?
")
1321 print "Testing ldb
.rename (into itself
) of cn
=ldaptestcontainer2
," + self.base_dn + " to cn
=ldaptestcontainer
,cn
=ldaptestcontainer2
," + self.base_dn
1323 ldb.rename("cn
=ldaptestcontainer2
," + self.base_dn, "cn
=ldaptestcontainer
,cn
=ldaptestcontainer2
," + self.base_dn)
1325 except LdbError, (num, _):
1326 self.assertEquals(num, ERR_UNWILLING_TO_PERFORM)
1328 print "Testing ldb
.rename (into non
-existent container
) of cn
=ldaptestcontainer2
," + self.base_dn + " to cn
=ldaptestcontainer
,cn
=ldaptestcontainer3
," + self.base_dn
1330 ldb.rename("cn
=ldaptestcontainer2
," + self.base_dn, "cn
=ldaptestcontainer
,cn
=ldaptestcontainer3
," + self.base_dn)
1332 except LdbError, (num, _):
1333 self.assertTrue(num in (ERR_UNWILLING_TO_PERFORM, ERR_OTHER))
1335 print "Testing
delete (should fail
, not a leaf node
) of renamed cn
=ldaptestcontainer2
," + self.base_dn
1337 ldb.delete("cn
=ldaptestcontainer2
," + self.base_dn)
1339 except LdbError, (num, _):
1340 self.assertEquals(num, ERR_NOT_ALLOWED_ON_NON_LEAF)
1342 print "Testing base ldb
.search
for CN
=ldaptestuser4
,CN
=ldaptestcontainer2
," + self.base_dn
1343 res = ldb.search(expression="(objectclass
=*)", base=("CN
=ldaptestuser4
,CN
=ldaptestcontainer2
," + self.base_dn), scope=SCOPE_BASE)
1344 self.assertEquals(len(res), 1)
1345 res = ldb.search(expression="(cn
=ldaptestuser40
)", base=("CN
=ldaptestuser4
,CN
=ldaptestcontainer2
," + self.base_dn), scope=SCOPE_BASE)
1346 self.assertEquals(len(res), 0)
1348 print "Testing one
-level ldb
.search
for (&(cn
=ldaptestuser4
)(objectClass
=user
)) in cn
=ldaptestcontainer2
," + self.base_dn
1349 res = ldb.search(expression="(&(cn
=ldaptestuser4
)(objectClass
=user
))", base=("cn
=ldaptestcontainer2
," + self.base_dn), scope=SCOPE_ONELEVEL)
1350 # FIXME: self.assertEquals(len(res), 0)
1352 print "Testing one
-level ldb
.search
for (&(cn
=ldaptestuser4
)(objectClass
=user
)) in cn
=ldaptestcontainer2
," + self.base_dn
1353 res = ldb.search(expression="(&(cn
=ldaptestuser4
)(objectClass
=user
))", base=("cn
=ldaptestcontainer2
," + self.base_dn), scope=SCOPE_SUBTREE)
1354 # FIXME: self.assertEquals(len(res), 0)
1356 print "Testing delete of subtree renamed
"+("CN
=ldaptestuser4
,CN
=ldaptestcontainer2
," + self.base_dn)
1357 ldb.delete(("CN
=ldaptestuser4
,CN
=ldaptestcontainer2
," + self.base_dn))
1358 print "Testing delete of renamed cn
=ldaptestcontainer2
," + self.base_dn
1359 ldb.delete("cn
=ldaptestcontainer2
," + self.base_dn)
1361 ldb.add({"dn
": "cn
=ldaptestutf8user èùéìòà
,cn
=users
," + self.base_dn, "objectClass
": "user
"})
1363 ldb.add({"dn
": "cn
=ldaptestutf8user2 èùéìòà
,cn
=users
," + self.base_dn, "objectClass
": "user
"})
1365 print "Testing ldb
.search
for (&(cn
=ldaptestuser
)(objectClass
=user
))"
1366 res = ldb.search(expression="(&(cn
=ldaptestuser
)(objectClass
=user
))")
1367 self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptestuser
)(objectClass
=user
))")
1369 self.assertEquals(str(res[0].dn), ("CN
=ldaptestuser
,CN
=Users
," + self.base_dn))
1370 self.assertEquals(str(res[0]["cn
"]), "ldaptestuser
")
1371 self.assertEquals(str(res[0]["name
"]), "ldaptestuser
")
1372 self.assertEquals(set(res[0]["objectClass
"]), set(["top
", "person
", "organizationalPerson
", "user
"]))
1373 self.assertTrue("objectGUID
" in res[0])
1374 self.assertTrue("whenCreated
" in res[0])
1375 self.assertEquals(str(res[0]["objectCategory
"]), ("CN
=Person
,CN
=Schema
,CN
=Configuration
," + self.base_dn))
1376 self.assertEquals(int(res[0]["sAMAccountType
"][0]), ATYPE_NORMAL_ACCOUNT)
1377 self.assertEquals(int(res[0]["userAccountControl
"][0]), UF_NORMAL_ACCOUNT | UF_PASSWD_NOTREQD | UF_ACCOUNTDISABLE)
1378 self.assertEquals(res[0]["memberOf
"][0].upper(), ("CN
=ldaptestgroup2
,CN
=Users
," + self.base_dn).upper())
1379 self.assertEquals(len(res[0]["memberOf
"]), 1)
1381 print "Testing ldb
.search
for (&(cn
=ldaptestuser
)(objectCategory
=cn
=person
,cn
=schema
,cn
=configuration
," + self.base_dn + "))"
1382 res2 = ldb.search(expression="(&(cn
=ldaptestuser
)(objectCategory
=cn
=person
,cn
=schema
,cn
=configuration
," + self.base_dn + "))")
1383 self.assertEquals(len(res2), 1, "Could
not find (&(cn
=ldaptestuser
)(objectCategory
=cn
=person
,cn
=schema
,cn
=configuration
," + self.base_dn + "))")
1385 self.assertEquals(res[0].dn, res2[0].dn)
1387 print "Testing ldb
.search
for (&(cn
=ldaptestuser
)(objectCategory
=PerSon
))"
1388 res3 = ldb.search(expression="(&(cn
=ldaptestuser
)(objectCategory
=PerSon
))")
1389 self.assertEquals(len(res3), 1, "Could
not find (&(cn
=ldaptestuser
)(objectCategory
=PerSon
)): matched
%d" % len(res3))
1391 self.assertEquals(res[0].dn, res3[0].dn)
1393 if gc_ldb is not None:
1394 print "Testing ldb
.search
for (&(cn
=ldaptestuser
)(objectCategory
=PerSon
)) in Global Catalog
"
1395 res3gc = gc_ldb.search(expression="(&(cn
=ldaptestuser
)(objectCategory
=PerSon
))")
1396 self.assertEquals(len(res3gc), 1)
1398 self.assertEquals(res[0].dn, res3gc[0].dn)
1400 print "Testing ldb
.search
for (&(cn
=ldaptestuser
)(objectCategory
=PerSon
)) in with
'phantom root' control
"
1402 if gc_ldb is not None:
1403 res3control = gc_ldb.search(self.base_dn, expression="(&(cn
=ldaptestuser
)(objectCategory
=PerSon
))", scope=SCOPE_SUBTREE, attrs=["cn
"], controls=["search_options
:1:2"])
1404 self.assertEquals(len(res3control), 1, "Could
not find (&(cn
=ldaptestuser
)(objectCategory
=PerSon
)) in Global Catalog
")
1406 self.assertEquals(res[0].dn, res3control[0].dn)
1408 ldb.delete(res[0].dn)
1410 print "Testing ldb
.search
for (&(cn
=ldaptestcomputer
)(objectClass
=user
))"
1411 res = ldb.search(expression="(&(cn
=ldaptestcomputer
)(objectClass
=user
))")
1412 self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptestuser
)(objectClass
=user
))")
1414 self.assertEquals(str(res[0].dn), ("CN
=ldaptestcomputer
,CN
=Computers
," + self.base_dn))
1415 self.assertEquals(str(res[0]["cn
"]), "ldaptestcomputer
")
1416 self.assertEquals(str(res[0]["name
"]), "ldaptestcomputer
")
1417 self.assertEquals(set(res[0]["objectClass
"]), set(["top
", "person
", "organizationalPerson
", "user
", "computer
"]))
1418 self.assertTrue("objectGUID
" in res[0])
1419 self.assertTrue("whenCreated
" in res[0])
1420 self.assertEquals(str(res[0]["objectCategory
"]), ("CN
=Computer
,CN
=Schema
,CN
=Configuration
," + self.base_dn))
1421 self.assertEquals(int(res[0]["primaryGroupID
"][0]), 513)
1422 self.assertEquals(int(res[0]["sAMAccountType
"][0]), ATYPE_NORMAL_ACCOUNT)
1423 self.assertEquals(int(res[0]["userAccountControl
"][0]), UF_NORMAL_ACCOUNT | UF_PASSWD_NOTREQD | UF_ACCOUNTDISABLE)
1424 self.assertEquals(res[0]["memberOf
"][0].upper(), ("CN
=ldaptestgroup2
,CN
=Users
," + self.base_dn).upper())
1425 self.assertEquals(len(res[0]["memberOf
"]), 1)
1427 print "Testing ldb
.search
for (&(cn
=ldaptestcomputer
)(objectCategory
=cn
=computer
,cn
=schema
,cn
=configuration
," + self.base_dn + "))"
1428 res2 = ldb.search(expression="(&(cn
=ldaptestcomputer
)(objectCategory
=cn
=computer
,cn
=schema
,cn
=configuration
," + self.base_dn + "))")
1429 self.assertEquals(len(res2), 1, "Could
not find (&(cn
=ldaptestcomputer
)(objectCategory
=cn
=computer
,cn
=schema
,cn
=configuration
," + self.base_dn + "))")
1431 self.assertEquals(res[0].dn, res2[0].dn)
1433 if gc_ldb is not None:
1434 print "Testing ldb
.search
for (&(cn
=ldaptestcomputer
)(objectCategory
=cn
=computer
,cn
=schema
,cn
=configuration
," + self.base_dn + ")) in Global Catlog
"
1435 res2gc = gc_ldb.search(expression="(&(cn
=ldaptestcomputer
)(objectCategory
=cn
=computer
,cn
=schema
,cn
=configuration
," + self.base_dn + "))")
1436 self.assertEquals(len(res2gc), 1, "Could
not find (&(cn
=ldaptestcomputer
)(objectCategory
=cn
=computer
,cn
=schema
,cn
=configuration
," + self.base_dn + ")) in Global Catlog
")
1438 self.assertEquals(res[0].dn, res2gc[0].dn)
1440 print "Testing ldb
.search
for (&(cn
=ldaptestcomputer
)(objectCategory
=compuTER
))"
1441 res3 = ldb.search(expression="(&(cn
=ldaptestcomputer
)(objectCategory
=compuTER
))")
1442 self.assertEquals(len(res3), 1, "Could
not find (&(cn
=ldaptestcomputer
)(objectCategory
=compuTER
))")
1444 self.assertEquals(res[0].dn, res3[0].dn)
1446 if gc_ldb is not None:
1447 print "Testing ldb
.search
for (&(cn
=ldaptestcomputer
)(objectCategory
=compuTER
)) in Global Catalog
"
1448 res3gc = gc_ldb.search(expression="(&(cn
=ldaptestcomputer
)(objectCategory
=compuTER
))")
1449 self.assertEquals(len(res3gc), 1, "Could
not find (&(cn
=ldaptestcomputer
)(objectCategory
=compuTER
)) in Global Catalog
")
1451 self.assertEquals(res[0].dn, res3gc[0].dn)
1453 print "Testing ldb
.search
for (&(cn
=ldaptestcomp
*r
)(objectCategory
=compuTER
))"
1454 res4 = ldb.search(expression="(&(cn
=ldaptestcomp
*r
)(objectCategory
=compuTER
))")
1455 self.assertEquals(len(res4), 1, "Could
not find (&(cn
=ldaptestcomp
*r
)(objectCategory
=compuTER
))")
1457 self.assertEquals(res[0].dn, res4[0].dn)
1459 print "Testing ldb
.search
for (&(cn
=ldaptestcomput
*)(objectCategory
=compuTER
))"
1460 res5 = ldb.search(expression="(&(cn
=ldaptestcomput
*)(objectCategory
=compuTER
))")
1461 self.assertEquals(len(res5), 1, "Could
not find (&(cn
=ldaptestcomput
*)(objectCategory
=compuTER
))")
1463 self.assertEquals(res[0].dn, res5[0].dn)
1465 print "Testing ldb
.search
for (&(cn
=*daptestcomputer
)(objectCategory
=compuTER
))"
1466 res6 = ldb.search(expression="(&(cn
=*daptestcomputer
)(objectCategory
=compuTER
))")
1467 self.assertEquals(len(res6), 1, "Could
not find (&(cn
=*daptestcomputer
)(objectCategory
=compuTER
))")
1469 self.assertEquals(res[0].dn, res6[0].dn)
1471 ldb.delete("<GUID
=" + ldb.schema_format_value("objectGUID
", res[0]["objectGUID
"][0]) + ">")
1473 print "Testing ldb
.search
for (&(cn
=ldaptest2computer
)(objectClass
=user
))"
1474 res = ldb.search(expression="(&(cn
=ldaptest2computer
)(objectClass
=user
))")
1475 self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptest2computer
)(objectClass
=user
))")
1477 self.assertEquals(str(res[0].dn), "CN
=ldaptest2computer
,CN
=Computers
," + self.base_dn)
1478 self.assertEquals(str(res[0]["cn
"]), "ldaptest2computer
")
1479 self.assertEquals(str(res[0]["name
"]), "ldaptest2computer
")
1480 self.assertEquals(list(res[0]["objectClass
"]), ["top
", "person
", "organizationalPerson
", "user
", "computer
"])
1481 self.assertTrue("objectGUID
" in res[0])
1482 self.assertTrue("whenCreated
" in res[0])
1483 self.assertEquals(res[0]["objectCategory
"][0], "CN
=Computer
,CN
=Schema
,CN
=Configuration
," + self.base_dn)
1484 self.assertEquals(int(res[0]["sAMAccountType
"][0]), ATYPE_WORKSTATION_TRUST)
1485 self.assertEquals(int(res[0]["userAccountControl
"][0]), UF_WORKSTATION_TRUST_ACCOUNT)
1487 ldb.delete("<SID
=" + ldb.schema_format_value("objectSID
", res[0]["objectSID
"][0]) + ">")
1489 attrs = ["cn
", "name
", "objectClass
", "objectGUID
", "objectSID
", "whenCreated
", "nTSecurityDescriptor
", "memberOf
", "allowedAttributes
", "allowedAttributesEffective
"]
1490 print "Testing ldb
.search
for (&(cn
=ldaptestUSer2
)(objectClass
=user
))"
1491 res_user = ldb.search(self.base_dn, expression="(&(cn
=ldaptestUSer2
)(objectClass
=user
))", scope=SCOPE_SUBTREE, attrs=attrs)
1492 self.assertEquals(len(res_user), 1, "Could
not find (&(cn
=ldaptestUSer2
)(objectClass
=user
))")
1494 self.assertEquals(str(res_user[0].dn), ("CN
=ldaptestuser2
,CN
=Users
," + self.base_dn))
1495 self.assertEquals(str(res_user[0]["cn
"]), "ldaptestuser2
")
1496 self.assertEquals(str(res_user[0]["name
"]), "ldaptestuser2
")
1497 self.assertEquals(list(res_user[0]["objectClass
"]), ["top
", "person
", "organizationalPerson
", "user
"])
1498 self.assertTrue("objectSid
" in res_user[0])
1499 self.assertTrue("objectGUID
" in res_user[0])
1500 self.assertTrue("whenCreated
" in res_user[0])
1501 self.assertTrue("nTSecurityDescriptor
" in res_user[0])
1502 self.assertTrue("allowedAttributes
" in res_user[0])
1503 self.assertTrue("allowedAttributesEffective
" in res_user[0])
1504 self.assertEquals(res_user[0]["memberOf
"][0].upper(), ("CN
=ldaptestgroup2
,CN
=Users
," + self.base_dn).upper())
1506 ldaptestuser2_sid = res_user[0]["objectSid
"][0]
1507 ldaptestuser2_guid = res_user[0]["objectGUID
"][0]
1509 attrs = ["cn
", "name
", "objectClass
", "objectGUID
", "objectSID
", "whenCreated
", "nTSecurityDescriptor
", "member
", "allowedAttributes
", "allowedAttributesEffective
"]
1510 print "Testing ldb
.search
for (&(cn
=ldaptestgroup2
)(objectClass
=group
))"
1511 res = ldb.search(self.base_dn, expression="(&(cn
=ldaptestgroup2
)(objectClass
=group
))", scope=SCOPE_SUBTREE, attrs=attrs)
1512 self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptestgroup2
)(objectClass
=group
))")
1514 self.assertEquals(str(res[0].dn), ("CN
=ldaptestgroup2
,CN
=Users
," + self.base_dn))
1515 self.assertEquals(str(res[0]["cn
"]), "ldaptestgroup2
")
1516 self.assertEquals(str(res[0]["name
"]), "ldaptestgroup2
")
1517 self.assertEquals(list(res[0]["objectClass
"]), ["top
", "group
"])
1518 self.assertTrue("objectGUID
" in res[0])
1519 self.assertTrue("objectSid
" in res[0])
1520 self.assertTrue("whenCreated
" in res[0])
1521 self.assertTrue("nTSecurityDescriptor
" in res[0])
1522 self.assertTrue("allowedAttributes
" in res[0])
1523 self.assertTrue("allowedAttributesEffective
" in res[0])
1525 for m in res[0]["member
"]:
1526 memberUP.append(m.upper())
1527 self.assertTrue(("CN
=ldaptestuser2
,CN
=Users
," + self.base_dn).upper() in memberUP)
1529 res = ldb.search(self.base_dn, expression="(&(cn
=ldaptestgroup2
)(objectClass
=group
))", scope=SCOPE_SUBTREE, attrs=attrs, controls=["extended_dn
:1:1"])
1530 self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptestgroup2
)(objectClass
=group
))")
1532 print res[0]["member
"]
1534 for m in res[0]["member
"]:
1535 memberUP.append(m.upper())
1536 print ("<GUID
=" + ldb.schema_format_value("objectGUID
", ldaptestuser2_guid) + ">;<SID
=" + ldb.schema_format_value("objectSid
", ldaptestuser2_sid) + ">;CN
=ldaptestuser2
,CN
=Users
," + self.base_dn).upper()
1538 self.assertTrue(("<GUID
=" + ldb.schema_format_value("objectGUID
", ldaptestuser2_guid) + ">;<SID
=" + ldb.schema_format_value("objectSid
", ldaptestuser2_sid) + ">;CN
=ldaptestuser2
,CN
=Users
," + self.base_dn).upper() in memberUP)
1540 print "Testing Linked attribute behaviours
"
1542 dn: cn=ldaptestgroup2,cn=users,""" + self.base_dn + """
1545 member: CN=ldaptestuser2,CN=Users,""" + self.base_dn + """
1546 member: CN=ldaptestutf8user èùéìòà,CN=Users,""" + self.base_dn + """
1550 dn: <GUID=""" + ldb.schema_format_value("objectGUID
", res[0]["objectGUID
"][0]) + """>
1553 member: CN=ldaptestutf8user èùéìòà,CN=Users,""" + self.base_dn + """
1557 dn: <SID=""" + ldb.schema_format_value("objectSid
", res[0]["objectSid
"][0]) + """>
1563 dn: cn=ldaptestgroup2,cn=users,""" + self.base_dn + """
1566 member: <GUID=""" + ldb.schema_format_value("objectGUID
", res[0]["objectGUID
"][0]) + """>
1567 member: CN=ldaptestutf8user èùéìòà,CN=Users,""" + self.base_dn + """
1571 dn: cn=ldaptestgroup2,cn=users,""" + self.base_dn + """
1577 dn: cn=ldaptestgroup2,cn=users,""" + self.base_dn + """
1580 member: <SID=""" + ldb.schema_format_value("objectSid
", res_user[0]["objectSid
"][0]) + """>
1581 member: CN=ldaptestutf8user èùéìòà,CN=Users,""" + self.base_dn + """
1585 dn: cn=ldaptestgroup2,cn=users,""" + self.base_dn + """
1588 member: CN=ldaptestutf8user èùéìòà,CN=Users,""" + self.base_dn + """
1591 res = ldb.search(self.base_dn, expression="(&(cn
=ldaptestgroup2
)(objectClass
=group
))", scope=SCOPE_SUBTREE, attrs=attrs)
1592 self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptestgroup2
)(objectClass
=group
))")
1594 self.assertEquals(str(res[0].dn), ("CN
=ldaptestgroup2
,CN
=Users
," + self.base_dn))
1595 self.assertEquals(res[0]["member
"][0], ("CN
=ldaptestuser2
,CN
=Users
," + self.base_dn))
1596 self.assertEquals(len(res[0]["member
"]), 1)
1598 ldb.delete(("CN
=ldaptestuser2
,CN
=Users
," + self.base_dn))
1602 attrs = ["cn
", "name
", "objectClass
", "objectGUID
", "whenCreated
", "nTSecurityDescriptor
", "member
"]
1603 print "Testing ldb
.search
for (&(cn
=ldaptestgroup2
)(objectClass
=group
)) to check linked delete
"
1604 res = ldb.search(self.base_dn, expression="(&(cn
=ldaptestgroup2
)(objectClass
=group
))", scope=SCOPE_SUBTREE, attrs=attrs)
1605 self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptestgroup2
)(objectClass
=group
)) to check linked delete
")
1607 self.assertEquals(str(res[0].dn), ("CN
=ldaptestgroup2
,CN
=Users
," + self.base_dn))
1608 self.assertTrue("member
" not in res[0])
1610 print "Testing ldb
.search
for (&(cn
=ldaptestutf8user ÈÙÉÌÒÀ
)(objectClass
=user
))"
1611 # TODO UTF8 users don't seem to work fully anymore
1612 # res = ldb.search(expression="(&(cn
=ldaptestutf8user ÈÙÉÌÒÀ
)(objectClass
=user
))")
1613 res = ldb.search(expression="(&(cn
=ldaptestutf8user èùéìòà
)(objectclass
=user
))")
1614 self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptestutf8user ÈÙÉÌÒÀ
)(objectClass
=user
))")
1616 self.assertEquals(str(res[0].dn), ("CN
=ldaptestutf8user èùéìòà
,CN
=Users
," + self.base_dn))
1617 self.assertEquals(str(res[0]["cn
"]), "ldaptestutf8user èùéìòà
")
1618 self.assertEquals(str(res[0]["name
"]), "ldaptestutf8user èùéìòà
")
1619 self.assertEquals(list(res[0]["objectClass
"]), ["top
", "person
", "organizationalPerson
", "user
"])
1620 self.assertTrue("objectGUID
" in res[0])
1621 self.assertTrue("whenCreated
" in res[0])
1623 ldb.delete(res[0].dn)
1625 print "Testing ldb
.search
for (&(cn
=ldaptestutf8user2
*)(objectClass
=user
))"
1626 res = ldb.search(expression="(&(cn
=ldaptestutf8user2
*)(objectClass
=user
))")
1627 self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptestutf8user2
*)(objectClass
=user
))")
1629 ldb.delete(res[0].dn)
1631 ldb.delete(("CN
=ldaptestgroup2
,CN
=Users
," + self.base_dn))
1633 print "Testing ldb
.search
for (&(cn
=ldaptestutf8user2 ÈÙÉÌÒÀ
)(objectClass
=user
))"
1634 # TODO UTF8 users don't seem to work fully anymore
1635 # res = ldb.search(expression="(&(cn
=ldaptestutf8user ÈÙÉÌÒÀ
)(objectClass
=user
))")
1636 # self.assertEquals(len(res), 1, "Could
not find (&(cn
=ldaptestutf8user ÈÙÉÌÒÀ
)(objectClass
=user
))")
1638 print "Testing that we can
't get at the configuration DN from the main search base"
1639 res = ldb.search(self.base_dn, expression="objectClass=crossRef", scope=SCOPE_SUBTREE, attrs=["cn"])
1640 self.assertEquals(len(res), 0)
1642 print "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"
1643 res = ldb.search(self.base_dn, expression="objectClass=crossRef", scope=SCOPE_SUBTREE, attrs=["cn"], controls=["search_options:1:2"])
1644 self.assertTrue(len(res) > 0)
1646 if gc_ldb is not None:
1647 print "Testing that we can get at the configuration DN from the main search base on the GC port with the search_options control == 0"
1649 res = gc_ldb.search(self.base_dn, expression="objectClass=crossRef", scope=SCOPE_SUBTREE, attrs=["cn"], controls=["search_options:1:0"])
1650 self.assertTrue(len(res) > 0)
1652 print "Testing that we do find configuration elements in the global catlog"
1653 res = gc_ldb.search(self.base_dn, expression="objectClass=crossRef", scope=SCOPE_SUBTREE, attrs=["cn"])
1654 self.assertTrue(len(res) > 0)
1656 print "Testing that we do find configuration elements and user elements at the same time"
1657 res = gc_ldb.search(self.base_dn, expression="(|(objectClass=crossRef)(objectClass=person))", scope=SCOPE_SUBTREE, attrs=["cn"])
1658 self.assertTrue(len(res) > 0)
1660 print "Testing that we do find configuration elements in the global catlog, with the configuration basedn"
1661 res = gc_ldb.search(self.configuration_dn, expression="objectClass=crossRef", scope=SCOPE_SUBTREE, attrs=["cn"])
1662 self.assertTrue(len(res) > 0)
1664 print "Testing that we can get at the configuration DN on the main LDAP port"
1665 res = ldb.search(self.configuration_dn, expression="objectClass=crossRef", scope=SCOPE_SUBTREE, attrs=["cn"])
1666 self.assertTrue(len(res) > 0)
1668 print "Testing objectCategory canonacolisation"
1669 res = ldb.search(self.configuration_dn, expression="objectCategory=ntDsDSA", scope=SCOPE_SUBTREE, attrs=["cn"])
1670 self.assertTrue(len(res) > 0, "Didn't find any records with objectCategory
=ntDsDSA
")
1671 self.assertTrue(len(res) != 0)
1673 res = ldb.search(self.configuration_dn, expression="objectCategory
=CN
=ntDs
-DSA
," + self.schema_dn, scope=SCOPE_SUBTREE, attrs=["cn
"])
1674 self.assertTrue(len(res) > 0, "Didn
't find any records with objectCategory=CN=ntDs-DSA," + self.schema_dn)
1675 self.assertTrue(len(res) != 0)
1677 print "Testing objectClass attribute order on "+ self.base_dn
1678 res = ldb.search(expression="objectClass=domain", base=self.base_dn,
1679 scope=SCOPE_BASE, attrs=["objectClass"])
1680 self.assertEquals(len(res), 1)
1682 self.assertEquals(list(res[0]["objectClass"]), ["top", "domain", "domainDNS"])
1686 print "Testing ldb.search for objectCategory=person"
1687 res = ldb.search(self.base_dn, expression="objectCategory=person", scope=SCOPE_SUBTREE, attrs=["cn"])
1688 self.assertTrue(len(res) > 0)
1690 print "Testing ldb.search for objectCategory=person with domain scope control"
1691 res = ldb.search(self.base_dn, expression="objectCategory=person", scope=SCOPE_SUBTREE, attrs=["cn"], controls=["domain_scope:1"])
1692 self.assertTrue(len(res) > 0)
1694 print "Testing ldb.search for objectCategory=user"
1695 res = ldb.search(self.base_dn, expression="objectCategory=user", scope=SCOPE_SUBTREE, attrs=["cn"])
1696 self.assertTrue(len(res) > 0)
1698 print "Testing ldb.search for objectCategory=user with domain scope control"
1699 res = ldb.search(self.base_dn, expression="objectCategory=user", scope=SCOPE_SUBTREE, attrs=["cn"], controls=["domain_scope:1"])
1700 self.assertTrue(len(res) > 0)
1702 print "Testing ldb.search for objectCategory=group"
1703 res = ldb.search(self.base_dn, expression="objectCategory=group", scope=SCOPE_SUBTREE, attrs=["cn"])
1704 self.assertTrue(len(res) > 0)
1706 print "Testing ldb.search for objectCategory=group with domain scope control"
1707 res = ldb.search(self.base_dn, expression="objectCategory=group", scope=SCOPE_SUBTREE, attrs=["cn"], controls=["domain_scope:1"])
1708 self.assertTrue(len(res) > 0)
1710 print "Testing creating a user with the posixAccount objectClass"
1711 self.ldb.add_ldif("""dn: cn=posixuser,CN=Users,%s
1714 objectClass: posixAccount
1716 objectClass: organizationalPerson
1722 homeDirectory: /home/posixuser
1723 loginShell: /bin/bash
1724 gecos: Posix User;;;
1725 description: A POSIX user"""% (self.base_dn))
1727 print "Testing removing the posixAccount objectClass from an existing user"
1728 self.ldb.modify_ldif("""dn: cn=posixuser,CN=Users,%s
1731 objectClass: posixAccount"""% (self.base_dn))
1733 print "Testing adding the posixAccount objectClass to an existing user"
1734 self.ldb.modify_ldif("""dn: cn=posixuser,CN=Users,%s
1737 objectClass: posixAccount"""% (self.base_dn))
1739 self.delete_force(self.ldb, "cn=posixuser,cn=users," + self.base_dn)
1740 self.delete_force(self.ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
1741 self.delete_force(self.ldb, "cn=ldaptestuser2,cn=users," + self.base_dn)
1742 self.delete_force(self.ldb, "cn=ldaptestuser3,cn=users," + self.base_dn)
1743 self.delete_force(self.ldb, "cn=ldaptestuser4,cn=ldaptestcontainer," + self.base_dn)
1744 self.delete_force(self.ldb, "cn=ldaptestuser4,cn=ldaptestcontainer2," + self.base_dn)
1745 self.delete_force(self.ldb, "cn=ldaptestuser5,cn=users," + self.base_dn)
1746 self.delete_force(self.ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
1747 self.delete_force(self.ldb, "cn=ldaptestgroup2,cn=users," + self.base_dn)
1748 self.delete_force(self.ldb, "cn=ldaptestcomputer,cn=computers," + self.base_dn)
1749 self.delete_force(self.ldb, "cn=ldaptest2computer,cn=computers," + self.base_dn)
1750 self.delete_force(self.ldb, "cn=ldaptestcomputer3,cn=computers," + self.base_dn)
1751 self.delete_force(self.ldb, "cn=ldaptestutf8user èùéìòà,cn=users," + self.base_dn)
1752 self.delete_force(self.ldb, "cn=ldaptestutf8user2 èùéìòà,cn=users," + self.base_dn)
1753 self.delete_force(self.ldb, "cn=ldaptestcontainer," + self.base_dn)
1754 self.delete_force(self.ldb, "cn=ldaptestcontainer2," + self.base_dn)
1756 def test_security_descriptor_add(self):
1757 """ Testing ldb.add_ldif() for nTSecurityDescriptor """
1758 user_name = "testdescriptoruser1"
1759 user_dn = "CN=%s,CN=Users,%s" % (user_name, self.base_dn)
1761 # Test add_ldif() with SDDL security descriptor input
1763 self.delete_force(self.ldb, user_dn)
1765 sddl = "O:DUG:DUD:PAI(A;;RPWP;;;AU)S:PAI"
1766 self.ldb.add_ldif("""
1767 dn: """ + user_dn + """
1769 sAMAccountName: """ + user_name + """
1770 nTSecurityDescriptor: """ + sddl)
1771 res = self.ldb.search(base=user_dn, attrs=["nTSecurityDescriptor"])
1772 desc = res[0]["nTSecurityDescriptor"][0]
1773 desc = ndr_unpack( security.descriptor, desc )
1774 desc_sddl = desc.as_sddl( self.domain_sid )
1775 self.assertEqual(desc_sddl, sddl)
1777 self.delete_force(self.ldb, user_dn)
1779 # Test add_ldif() with BASE64 security descriptor
1782 sddl = "O:DUG:DUD:PAI(A;;RPWP;;;AU)S:PAI"
1783 desc = security.descriptor.from_sddl(sddl, self.domain_sid)
1784 desc_binary = ndr_pack(desc)
1785 desc_base64 = base64.b64encode(desc_binary)
1786 self.ldb.add_ldif("""
1787 dn: """ + user_dn + """
1789 sAMAccountName: """ + user_name + """
1790 nTSecurityDescriptor:: """ + desc_base64)
1791 res = self.ldb.search(base=user_dn, attrs=["nTSecurityDescriptor"])
1792 desc = res[0]["nTSecurityDescriptor"][0]
1793 desc = ndr_unpack(security.descriptor, desc)
1794 desc_sddl = desc.as_sddl(self.domain_sid)
1795 self.assertEqual(desc_sddl, sddl)
1797 self.delete_force(self.ldb, user_dn)
1799 def test_security_descriptor_add_neg(self):
1800 """Test add_ldif() with BASE64 security descriptor input using WRONG domain SID
1803 user_name = "testdescriptoruser1"
1804 user_dn = "CN=%s,CN=Users,%s" % (user_name, self.base_dn)
1805 self.delete_force(self.ldb, user_dn)
1807 sddl = "O:DUG:DUD:PAI(A;;RPWP;;;AU)S:PAI"
1808 desc = security.descriptor.from_sddl(sddl, security.dom_sid('S
-1-5-21'))
1809 desc_base64 = base64.b64encode( ndr_pack(desc) )
1810 self.ldb.add_ldif("""
1811 dn: """ + user_dn + """
1813 sAMAccountName: """ + user_name + """
1814 nTSecurityDescriptor:: """ + desc_base64)
1815 res = self.ldb.search(base=user_dn, attrs=["nTSecurityDescriptor"])
1816 self.assertTrue("nTSecurityDescriptor" in res[0])
1818 self.delete_force(self.ldb, user_dn)
1820 def test_security_descriptor_modify(self):
1821 """ Testing ldb.modify_ldif() for nTSecurityDescriptor """
1822 user_name = "testdescriptoruser2"
1823 user_dn = "CN=%s,CN=Users,%s" % (user_name, self.base_dn)
1825 # Delete user object and test modify_ldif() with SDDL security descriptor input
1826 # Add ACE to the original descriptor test
1829 self.delete_force(self.ldb, user_dn)
1830 self.ldb.add_ldif("""
1831 dn: """ + user_dn + """
1833 sAMAccountName: """ + user_name)
1835 res = self.ldb.search(base=user_dn, attrs=["nTSecurityDescriptor"])
1836 desc = res[0]["nTSecurityDescriptor"][0]
1837 desc = ndr_unpack(security.descriptor, desc)
1838 desc_sddl = desc.as_sddl(self.domain_sid)
1839 sddl = desc_sddl[:desc_sddl.find("(")] + "(A;;RPWP;;;AU)" + desc_sddl[desc_sddl.find("("):]
1841 dn: """ + user_dn + """
1843 replace: nTSecurityDescriptor
1844 nTSecurityDescriptor: """ + sddl
1845 self.ldb.modify_ldif(mod)
1846 # Read modified descriptor
1847 res = self.ldb.search(base=user_dn, attrs=["nTSecurityDescriptor"])
1848 desc = res[0]["nTSecurityDescriptor"][0]
1849 desc = ndr_unpack(security.descriptor, desc)
1850 desc_sddl = desc.as_sddl(self.domain_sid)
1851 self.assertEqual(desc_sddl, sddl)
1853 self.delete_force(self.ldb, user_dn)
1855 # Test modify_ldif() with SDDL security descriptor input
1856 # New desctiptor test
1859 self.ldb.add_ldif("""
1860 dn: """ + user_dn + """
1862 sAMAccountName: """ + user_name)
1864 sddl = "O:DUG:DUD:PAI(A;;RPWP;;;AU)S:PAI"
1866 dn: """ + user_dn + """
1868 replace: nTSecurityDescriptor
1869 nTSecurityDescriptor: """ + sddl
1870 self.ldb.modify_ldif(mod)
1871 # Read modified descriptor
1872 res = self.ldb.search(base=user_dn, attrs=["nTSecurityDescriptor"])
1873 desc = res[0]["nTSecurityDescriptor"][0]
1874 desc = ndr_unpack(security.descriptor, desc)
1875 desc_sddl = desc.as_sddl(self.domain_sid)
1876 self.assertEqual(desc_sddl, sddl)
1878 self.delete_force(self.ldb, user_dn)
1880 # Test modify_ldif() with BASE64 security descriptor input
1881 # Add ACE to the original descriptor test
1884 self.ldb.add_ldif("""
1885 dn: """ + user_dn + """
1887 sAMAccountName: """ + user_name)
1889 res = self.ldb.search(base=user_dn, attrs=["nTSecurityDescriptor"])
1890 desc = res[0]["nTSecurityDescriptor"][0]
1891 desc = ndr_unpack(security.descriptor, desc)
1892 desc_sddl = desc.as_sddl(self.domain_sid)
1893 sddl = desc_sddl[:desc_sddl.find("(")] + "(A;;RPWP;;;AU)" + desc_sddl[desc_sddl.find("("):]
1894 desc = security.descriptor.from_sddl(sddl, self.domain_sid)
1895 desc_base64 = base64.b64encode(ndr_pack(desc))
1897 dn: """ + user_dn + """
1899 replace: nTSecurityDescriptor
1900 nTSecurityDescriptor:: """ + desc_base64
1901 self.ldb.modify_ldif(mod)
1902 # Read modified descriptor
1903 res = self.ldb.search(base=user_dn, attrs=["nTSecurityDescriptor"])
1904 desc = res[0]["nTSecurityDescriptor"][0]
1905 desc = ndr_unpack(security.descriptor, desc)
1906 desc_sddl = desc.as_sddl(self.domain_sid)
1907 self.assertEqual(desc_sddl, sddl)
1909 self.delete_force(self.ldb, user_dn)
1911 # Test modify_ldif() with BASE64 security descriptor input
1912 # New descriptor test
1915 self.delete_force(self.ldb, user_dn)
1916 self.ldb.add_ldif("""
1917 dn: """ + user_dn + """
1919 sAMAccountName: """ + user_name)
1921 sddl = "O:DUG:DUD:PAI(A;;RPWP;;;AU)S:PAI"
1922 desc = security.descriptor.from_sddl(sddl, self.domain_sid)
1923 desc_base64 = base64.b64encode(ndr_pack(desc))
1925 dn: """ + user_dn + """
1927 replace: nTSecurityDescriptor
1928 nTSecurityDescriptor:: """ + desc_base64
1929 self.ldb.modify_ldif(mod)
1930 # Read modified descriptor
1931 res = self.ldb.search(base=user_dn, attrs=["nTSecurityDescriptor"])
1932 desc = res[0]["nTSecurityDescriptor"][0]
1933 desc = ndr_unpack(security.descriptor, desc)
1934 desc_sddl = desc.as_sddl(self.domain_sid)
1935 self.assertEqual(desc_sddl, sddl)
1937 self.delete_force(self.ldb, user_dn)
1939 class BaseDnTests(unittest.TestCase):
1943 def test_rootdse_attrs(self):
1944 """Testing for all rootDSE attributes"""
1945 res = self.ldb.search(scope=SCOPE_BASE, attrs=[])
1946 self.assertEquals(len(res), 1)
1948 def test_highestcommittedusn(self):
1949 """Testing for highestCommittedUSN"""
1950 res = self.ldb.search("", scope=SCOPE_BASE, attrs=["highestCommittedUSN"])
1951 self.assertEquals(len(res), 1)
1952 self.assertTrue(int(res[0]["highestCommittedUSN"][0]) != 0)
1954 def test_netlogon(self):
1955 """Testing for netlogon via LDAP"""
1956 res = self.ldb.search("", scope=SCOPE_BASE, attrs=["netlogon"])
1957 self.assertEquals(len(res), 0)
1959 def test_netlogon_highestcommitted_usn(self):
1960 """Testing for netlogon and highestCommittedUSN via LDAP"""
1961 res = self.ldb.search("", scope=SCOPE_BASE,
1962 attrs=["netlogon", "highestCommittedUSN"])
1963 self.assertEquals(len(res), 0)
1965 def test_namingContexts(self):
1966 """Testing for namingContexts in rootDSE"""
1967 res = self.ldb.search("", scope=SCOPE_BASE,
1968 attrs=["namingContexts", "defaultNamingContext", "schemaNamingContext", "configurationNamingContext"])
1969 self.assertEquals(len(res), 1)
1972 for nc in res[0]["namingContexts"]:
1973 self.assertTrue(nc not in ncs)
1976 self.assertTrue(res[0]["defaultNamingContext"][0] in ncs)
1977 self.assertTrue(res[0]["configurationNamingContext"][0] in ncs)
1978 self.assertTrue(res[0]["schemaNamingContext"][0] in ncs)
1981 if not "://" in host:
1982 if os.path.isfile(host):
1983 host = "tdb://%s" % host
1985 host = "ldap://%s" % host
1987 ldb = Ldb(host, credentials=creds, session_info=system_session(), lp=lp)
1988 if not "tdb://" in host:
1989 gc_ldb = Ldb("%s:3268" % host, credentials=creds,
1990 session_info=system_session(), lp=lp)
1994 runner = SubunitTestRunner()
1996 if not runner.run(unittest.makeSuite(BaseDnTests)).wasSuccessful():
1998 if not runner.run(unittest.makeSuite(BasicTests)).wasSuccessful():