8 import samba.getopt as options
10 from samba.tests.subunitrun import SubunitOptions, TestProgram
12 from samba.tests import delete_force
13 from samba.dcerpc import security, misc
14 from samba.samdb import SamDB
15 from samba.auth import system_session
16 from samba.ndr import ndr_unpack
17 from ldb import Message, MessageElement, Dn, LdbError
18 from ldb import FLAG_MOD_ADD, FLAG_MOD_REPLACE, FLAG_MOD_DELETE
19 from ldb import SCOPE_BASE, SCOPE_SUBTREE, SCOPE_ONELEVEL
21 # TODO I'm ignoring case in these tests for now.
22 # This should be fixed to work inline with Windows.
23 # The literal strings are in the case Windows uses.
24 # Windows appear to preserve casing of the RDN and uppercase the other keys.
25 class MatchRulesTests(samba.tests.TestCase):
27 super(MatchRulesTests, self).setUp()
29 self.ldb = SamDB(host, credentials=creds, session_info=system_session(lp), lp=lp)
30 self.base_dn = self.ldb.domain_dn()
31 self.ou = "OU=matchrulestest,%s" % self.base_dn
32 self.ou_users = "OU=users,%s" % self.ou
33 self.ou_groups = "OU=groups,%s" % self.ou
34 self.ou_computers = "OU=computers,%s" % self.ou
36 # Add a organizational unit to create objects
39 "objectclass": "organizationalUnit"})
41 # Add the following OU hierarchy and set otherWellKnownObjects,
42 # which has BinaryDN syntax:
50 "dn": "OU=o1,%s" % self.ou,
51 "objectclass": "organizationalUnit"})
53 "dn": "OU=o2,OU=o1,%s" % self.ou,
54 "objectclass": "organizationalUnit"})
56 "dn": "OU=o3,OU=o2,OU=o1,%s" % self.ou,
57 "objectclass": "organizationalUnit"})
59 "dn": "OU=o4,OU=o3,OU=o2,OU=o1,%s" % self.ou,
60 "objectclass": "organizationalUnit"})
63 m.dn = Dn(self.ldb, self.ou)
64 m["otherWellKnownObjects"] = MessageElement("B:32:00000000000000000000000000000001:OU=o1,%s" % self.ou,
65 FLAG_MOD_ADD, "otherWellKnownObjects")
69 m.dn = Dn(self.ldb, "OU=o1,%s" % self.ou)
70 m["otherWellKnownObjects"] = MessageElement("B:32:00000000000000000000000000000002:OU=o2,OU=o1,%s" % self.ou,
71 FLAG_MOD_ADD, "otherWellKnownObjects")
75 m.dn = Dn(self.ldb, "OU=o2,OU=o1,%s" % self.ou)
76 m["otherWellKnownObjects"] = MessageElement("B:32:00000000000000000000000000000003:OU=o3,OU=o2,OU=o1,%s" % self.ou,
77 FLAG_MOD_ADD, "otherWellKnownObjects")
81 m.dn = Dn(self.ldb, "OU=o3,OU=o2,OU=o1,%s" % self.ou)
82 m["otherWellKnownObjects"] = MessageElement("B:32:00000000000000000000000000000004:OU=o4,OU=o3,OU=o2,OU=o1,%s" % self.ou,
83 FLAG_MOD_ADD, "otherWellKnownObjects")
86 # Create OU for users and groups
89 "objectclass": "organizationalUnit"})
92 "objectclass": "organizationalUnit"})
94 "dn": self.ou_computers,
95 "objectclass": "organizationalUnit"})
99 "dn": "cn=g1,%s" % self.ou_groups,
100 "objectclass": "group" })
102 "dn": "cn=g2,%s" % self.ou_groups,
103 "objectclass": "group" })
105 "dn": "cn=g4,%s" % self.ou_groups,
106 "objectclass": "group" })
108 "dn": "cn=g3,%s" % self.ou_groups,
109 "objectclass": "group" })
113 "dn": "cn=u1,%s" % self.ou_users,
114 "objectclass": "user"})
116 "dn": "cn=u2,%s" % self.ou_users,
117 "objectclass": "user"})
119 "dn": "cn=u3,%s" % self.ou_users,
120 "objectclass": "user"})
122 "dn": "cn=u4,%s" % self.ou_users,
123 "objectclass": "user"})
125 # Add computers to test Object(DN-Binary) syntax
127 "dn": "cn=c1,%s" % self.ou_computers,
128 "objectclass": "computer",
129 "dNSHostName": "c1.%s" % self.lp.get("realm").lower(),
130 "servicePrincipalName": ["HOST/c1"],
131 "sAMAccountName": "c1$",
132 "userAccountControl": "83890178"})
135 "dn": "cn=c2,%s" % self.ou_computers,
136 "objectclass": "computer",
137 "dNSHostName": "c2.%s" % self.lp.get("realm").lower(),
138 "servicePrincipalName": ["HOST/c2"],
139 "sAMAccountName": "c2$",
140 "userAccountControl": "83890178"})
143 "dn": "cn=c3,%s" % self.ou_computers,
144 "objectclass": "computer",
145 "dNSHostName": "c3.%s" % self.lp.get("realm").lower(),
146 "servicePrincipalName": ["HOST/c3"],
147 "sAMAccountName": "c3$",
148 "userAccountControl": "83890178"})
150 # Create the following hierarchy:
162 m.dn = Dn(self.ldb, "CN=g1,%s" % self.ou_groups)
163 m["member"] = MessageElement("CN=u1,%s" % self.ou_users,
164 FLAG_MOD_ADD, "member")
169 m.dn = Dn(self.ldb, "CN=g2,%s" % self.ou_groups)
170 m["member"] = MessageElement("cn=u2,%s" % self.ou_users,
171 FLAG_MOD_ADD, "member")
176 m.dn = Dn(self.ldb, "cn=g3,%s" % self.ou_groups)
177 m["member"] = MessageElement("CN=u3,%s" % self.ou_users,
178 FLAG_MOD_ADD, "member")
183 m.dn = Dn(self.ldb, "cn=g4,%s" % self.ou_groups)
184 m["member"] = MessageElement("cn=u4,%s" % self.ou_users,
185 FLAG_MOD_ADD, "member")
190 m.dn = Dn(self.ldb, "CN=g4,%s" % self.ou_groups)
191 m["member"] = MessageElement("cn=g3,%s" % self.ou_groups,
192 FLAG_MOD_ADD, "member")
197 m.dn = Dn(self.ldb, "cn=g3,%s" % self.ou_groups)
198 m["member"] = MessageElement("CN=g2,%s" % self.ou_groups,
199 FLAG_MOD_ADD, "member")
204 m.dn = Dn(self.ldb, "cn=g2,%s" % self.ou_groups)
205 m["member"] = MessageElement("cn=g1,%s" % self.ou_groups,
206 FLAG_MOD_ADD, "member")
209 # The msDS-RevealedUsers is owned by system and cannot be modified
210 # directly. Set the schemaUpgradeInProgress flag as workaround
211 # and create this hierarchy:
218 # While appropriate for this test, this is NOT a good practice
219 # in general. This is only done here because the alternative
220 # is to make a schema modification.
222 # IF/WHEN Samba protects this attribute better, this
223 # particular part of the test can be removed, as the same code
224 # is covered by the addressBookRoots2 case well enough.
227 m.dn = Dn(self.ldb, "")
228 m["e1"] = MessageElement("1", FLAG_MOD_REPLACE, "schemaUpgradeInProgress")
232 m.dn = Dn(self.ldb, "cn=c2,%s" % self.ou_computers)
233 m["e1"] = MessageElement("B:8:01010101:cn=c3,%s" % self.ou_computers,
234 FLAG_MOD_ADD, "msDS-RevealedUsers")
238 m.dn = Dn(self.ldb, "cn=c1,%s" % self.ou_computers)
239 m["e1"] = MessageElement("B:8:01010101:cn=c2,%s" % self.ou_computers,
240 FLAG_MOD_ADD, "msDS-RevealedUsers")
244 m.dn = Dn(self.ldb, "")
245 m["e1"] = MessageElement("0", FLAG_MOD_REPLACE, "schemaUpgradeInProgress")
248 # Add a couple of ms-Exch-Configuration-Container to test forward-link
249 # attributes without backward link (addressBookRoots2)
254 "dn": "cn=e1,%s" % self.ou,
255 "objectclass": "msExchConfigurationContainer"})
257 "dn": "cn=e2,%s" % self.ou,
258 "objectclass": "msExchConfigurationContainer"})
261 m.dn = Dn(self.ldb, "cn=e2,%s" % self.ou)
262 m["e1"] = MessageElement("cn=c1,%s" % self.ou_computers,
263 FLAG_MOD_ADD, "addressBookRoots2")
267 m.dn = Dn(self.ldb, "cn=e1,%s" % self.ou)
268 m["e1"] = MessageElement("cn=e2,%s" % self.ou,
269 FLAG_MOD_ADD, "addressBookRoots2")
273 super(MatchRulesTests, self).tearDown()
274 self.ldb.delete(self.ou, controls=['tree_delete:0'])
276 def test_u1_member_of_g4(self):
277 # Search without transitive match must return 0 results
278 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
280 expression="member=cn=u1,%s" % self.ou_users)
281 self.assertEqual(len(res1), 0)
283 res1 = self.ldb.search("cn=u1,%s" % self.ou_users,
285 expression="memberOf=cn=g4,%s" % self.ou_groups)
286 self.assertEqual(len(res1), 0)
288 # Search with transitive match must return 1 results
289 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
291 expression="member:1.2.840.113556.1.4.1941:=cn=u1,%s" % self.ou_users)
292 self.assertEqual(len(res1), 1)
293 self.assertEqual(str(res1[0].dn).lower(), ("CN=g4,%s" % self.ou_groups).lower())
295 res1 = self.ldb.search("cn=u1,%s" % self.ou_users,
297 expression="memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s" % self.ou_groups)
298 self.assertEqual(len(res1), 1)
299 self.assertEqual(str(res1[0].dn).lower(), ("CN=u1,%s" % self.ou_users).lower())
301 def test_g1_member_of_g4(self):
302 # Search without transitive match must return 0 results
303 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
305 expression="member=cn=g1,%s" % self.ou_groups)
306 self.assertEqual(len(res1), 0)
308 res1 = self.ldb.search("cn=g1,%s" % self.ou_groups,
310 expression="memberOf=cn=g4,%s" % self.ou_groups)
311 self.assertEqual(len(res1), 0)
313 # Search with transitive match must return 1 results
314 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
316 expression="member:1.2.840.113556.1.4.1941:=cn=g1,%s" % self.ou_groups)
317 self.assertEqual(len(res1), 1)
318 self.assertEqual(str(res1[0].dn).lower(), ("CN=g4,%s" % self.ou_groups).lower())
320 res1 = self.ldb.search("cn=g1,%s" % self.ou_groups,
322 expression="memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s" % self.ou_groups)
323 self.assertEqual(len(res1), 1)
324 self.assertEqual(str(res1[0].dn).lower(), ("CN=g1,%s" % self.ou_groups).lower())
326 def test_u1_groups(self):
327 res1 = self.ldb.search(self.ou_groups,
329 expression="member=cn=u1,%s" % self.ou_users)
330 self.assertEqual(len(res1), 1)
331 self.assertEqual(str(res1[0].dn).lower(), ("CN=g1,%s" % self.ou_groups).lower())
333 res1 = self.ldb.search(self.ou_users,
335 expression="member=cn=u1,%s" % self.ou_users)
336 self.assertEqual(len(res1), 0)
338 res1 = self.ldb.search(self.ou_groups,
340 expression="member:1.2.840.113556.1.4.1941:=cn=u1,%s" % self.ou_users)
341 self.assertEqual(len(res1), 4)
342 dn_list = [str(res.dn).lower() for res in res1]
343 self.assertTrue(("CN=g1,%s" % self.ou_groups).lower() in dn_list)
344 self.assertTrue(("CN=g2,%s" % self.ou_groups).lower() in dn_list)
345 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
346 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
348 res1 = self.ldb.search(self.ou_users,
350 expression="member:1.2.840.113556.1.4.1941:=cn=u1,%s" % self.ou_users)
351 self.assertEqual(len(res1), 0)
353 def test_u2_groups(self):
354 res1 = self.ldb.search(self.ou_groups,
356 expression="member=cn=u2,%s" % self.ou_users)
357 self.assertEqual(len(res1), 1)
358 self.assertEqual(str(res1[0].dn).lower(), ("CN=g2,%s" % self.ou_groups).lower())
360 res1 = self.ldb.search(self.ou_users,
362 expression="member=cn=u2,%s" % self.ou_users)
363 self.assertEqual(len(res1), 0)
365 res1 = self.ldb.search(self.ou_groups,
367 expression="member:1.2.840.113556.1.4.1941:=cn=u2,%s" % self.ou_users)
368 self.assertEqual(len(res1), 3)
369 dn_list = [str(res.dn).lower() for res in res1]
370 self.assertTrue(("CN=g2,%s" % self.ou_groups).lower() in dn_list)
371 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
372 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
374 res1 = self.ldb.search(self.ou_users,
376 expression="member:1.2.840.113556.1.4.1941:=cn=u2,%s" % self.ou_users)
377 self.assertEqual(len(res1), 0)
379 def test_u3_groups(self):
380 res1 = self.ldb.search(self.ou_groups,
382 expression="member=cn=u3,%s" % self.ou_users)
383 self.assertEqual(len(res1), 1)
384 self.assertEqual(str(res1[0].dn).lower(), ("CN=g3,%s" % self.ou_groups).lower())
386 res1 = self.ldb.search(self.ou_users,
388 expression="member=cn=u3,%s" % self.ou_users)
389 self.assertEqual(len(res1), 0)
391 res1 = self.ldb.search(self.ou_groups,
393 expression="member:1.2.840.113556.1.4.1941:=cn=u3,%s" % self.ou_users)
394 self.assertEqual(len(res1), 2)
395 dn_list = [str(res.dn).lower() for res in res1]
396 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
397 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
399 res1 = self.ldb.search(self.ou_users,
401 expression="member:1.2.840.113556.1.4.1941:=cn=u3,%s" % self.ou_users)
402 self.assertEqual(len(res1), 0)
404 def test_u4_groups(self):
405 res1 = self.ldb.search(self.ou_groups,
407 expression="member=cn=u4,%s" % self.ou_users)
408 self.assertEqual(len(res1), 1)
409 self.assertEqual(str(res1[0].dn).lower(), ("CN=g4,%s" % self.ou_groups).lower())
411 res1 = self.ldb.search(self.ou_users,
413 expression="member=cn=u4,%s" % self.ou_users)
414 self.assertEqual(len(res1), 0)
416 res1 = self.ldb.search(self.ou_groups,
418 expression="member:1.2.840.113556.1.4.1941:=cn=u4,%s" % self.ou_users)
419 self.assertEqual(len(res1), 1)
420 self.assertEqual(str(res1[0].dn).lower(), ("CN=g4,%s" % self.ou_groups).lower())
422 res1 = self.ldb.search(self.ou_users,
424 expression="member:1.2.840.113556.1.4.1941:=cn=u4,%s" % self.ou_users)
425 self.assertEqual(len(res1), 0)
427 def test_extended_dn_u1(self):
428 res1 = self.ldb.search("cn=u1,%s" % self.ou_users,
430 expression="objectClass=*",
431 attrs=['objectSid', 'objectGUID'])
432 self.assertEqual(len(res1), 1)
433 self.assertEqual(str(res1[0].dn).lower(), ("cn=u1,%s" % self.ou_users).lower())
435 sid = self.ldb.schema_format_value("objectSid", res1[0]["objectSid"][0])
436 guid = self.ldb.schema_format_value("objectGUID", res1[0]['objectGUID'][0])
438 res1 = self.ldb.search(self.ou_groups,
440 expression="member=<SID=%s>" % sid)
441 self.assertEqual(len(res1), 1)
442 self.assertEqual(str(res1[0].dn).lower(), ("CN=g1,%s" % self.ou_groups).lower())
444 res1 = self.ldb.search(self.ou_groups,
446 expression="member=<GUID=%s>" % guid)
447 self.assertEqual(len(res1), 1)
448 self.assertEqual(str(res1[0].dn).lower(), ("CN=g1,%s" % self.ou_groups).lower())
450 res1 = self.ldb.search(self.ou_groups,
452 expression="member:1.2.840.113556.1.4.1941:=<SID=%s>" % sid)
453 self.assertEqual(len(res1), 4)
454 dn_list = [str(res.dn).lower() for res in res1]
455 self.assertTrue(("CN=g1,%s" % self.ou_groups).lower() in dn_list)
456 self.assertTrue(("CN=g2,%s" % self.ou_groups).lower() in dn_list)
457 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
458 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
460 res1 = self.ldb.search(self.ou_groups,
461 scope=SCOPE_ONELEVEL,
462 expression="member:1.2.840.113556.1.4.1941:=<SID=%s>" % sid)
463 self.assertEqual(len(res1), 4)
464 dn_list = [str(res.dn).lower() for res in res1]
465 self.assertTrue(("CN=g1,%s" % self.ou_groups).lower() in dn_list)
466 self.assertTrue(("CN=g2,%s" % self.ou_groups).lower() in dn_list)
467 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
468 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
470 res1 = self.ldb.search(self.ou_groups,
472 expression="member:1.2.840.113556.1.4.1941:=<GUID=%s>" % guid)
473 self.assertEqual(len(res1), 4)
474 dn_list = [str(res.dn).lower() for res in res1]
475 self.assertTrue(("CN=g1,%s" % self.ou_groups).lower() in dn_list)
476 self.assertTrue(("CN=g2,%s" % self.ou_groups).lower() in dn_list)
477 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
478 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
480 res1 = self.ldb.search(self.ou_groups,
481 scope=SCOPE_ONELEVEL,
482 expression="member:1.2.840.113556.1.4.1941:=<GUID=%s>" % guid)
483 self.assertEqual(len(res1), 4)
484 dn_list = [str(res.dn).lower() for res in res1]
485 self.assertTrue(("CN=g1,%s" % self.ou_groups).lower() in dn_list)
486 self.assertTrue(("CN=g2,%s" % self.ou_groups).lower() in dn_list)
487 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
488 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
490 def test_extended_dn_u2(self):
491 res1 = self.ldb.search("cn=u2,%s" % self.ou_users,
493 expression="objectClass=*",
494 attrs=['objectSid', 'objectGUID'])
495 self.assertEqual(len(res1), 1)
496 self.assertEqual(str(res1[0].dn).lower(), ("cn=u2,%s" % self.ou_users).lower())
498 sid = self.ldb.schema_format_value("objectSid", res1[0]["objectSid"][0])
499 guid = self.ldb.schema_format_value("objectGUID", res1[0]['objectGUID'][0])
501 res1 = self.ldb.search(self.ou_groups,
503 expression="member=<SID=%s>" % sid)
504 self.assertEqual(len(res1), 1)
505 self.assertEqual(str(res1[0].dn).lower(), ("CN=g2,%s" % self.ou_groups).lower())
507 res1 = self.ldb.search(self.ou_groups,
509 expression="member=<GUID=%s>" % guid)
510 self.assertEqual(len(res1), 1)
511 self.assertEqual(str(res1[0].dn).lower(), ("CN=g2,%s" % self.ou_groups).lower())
513 res1 = self.ldb.search(self.ou_groups,
515 expression="member:1.2.840.113556.1.4.1941:=<SID=%s>" % sid)
516 self.assertEqual(len(res1), 3)
517 dn_list = [str(res.dn).lower() for res in res1]
518 self.assertTrue(("CN=g2,%s" % self.ou_groups).lower() in dn_list)
519 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
520 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
522 res1 = self.ldb.search(self.ou_groups,
523 scope=SCOPE_ONELEVEL,
524 expression="member:1.2.840.113556.1.4.1941:=<SID=%s>" % sid)
525 self.assertEqual(len(res1), 3)
526 dn_list = [str(res.dn).lower() for res in res1]
527 self.assertTrue(("CN=g2,%s" % self.ou_groups).lower() in dn_list)
528 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
529 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
531 res1 = self.ldb.search(self.ou_groups,
533 expression="member:1.2.840.113556.1.4.1941:=<GUID=%s>" % guid)
534 self.assertEqual(len(res1), 3)
535 dn_list = [str(res.dn).lower() for res in res1]
536 self.assertTrue(("CN=g2,%s" % self.ou_groups).lower() in dn_list)
537 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
538 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
540 res1 = self.ldb.search(self.ou_groups,
541 scope=SCOPE_ONELEVEL,
542 expression="member:1.2.840.113556.1.4.1941:=<GUID=%s>" % guid)
543 self.assertEqual(len(res1), 3)
544 dn_list = [str(res.dn).lower() for res in res1]
545 self.assertTrue(("CN=g2,%s" % self.ou_groups).lower() in dn_list)
546 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
547 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
549 def test_extended_dn_u3(self):
550 res1 = self.ldb.search("cn=u3,%s" % self.ou_users,
552 expression="objectClass=*",
553 attrs=['objectSid', 'objectGUID'])
554 self.assertEqual(len(res1), 1)
555 self.assertEqual(str(res1[0].dn).lower(), ("cn=u3,%s" % self.ou_users).lower())
557 sid = self.ldb.schema_format_value("objectSid", res1[0]["objectSid"][0])
558 guid = self.ldb.schema_format_value("objectGUID", res1[0]['objectGUID'][0])
560 res1 = self.ldb.search(self.ou_groups,
562 expression="member=<SID=%s>" % sid)
563 self.assertEqual(len(res1), 1)
564 self.assertEqual(str(res1[0].dn).lower(), ("CN=g3,%s" % self.ou_groups).lower())
566 res1 = self.ldb.search(self.ou_groups,
568 expression="member=<GUID=%s>" % guid)
569 self.assertEqual(len(res1), 1)
570 self.assertEqual(str(res1[0].dn).lower(), ("CN=g3,%s" % self.ou_groups).lower())
572 res1 = self.ldb.search(self.ou_groups,
574 expression="member:1.2.840.113556.1.4.1941:=<SID=%s>" % sid)
575 self.assertEqual(len(res1), 2)
576 dn_list = [str(res.dn).lower() for res in res1]
577 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
578 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
580 res1 = self.ldb.search(self.ou_groups,
581 scope=SCOPE_ONELEVEL,
582 expression="member:1.2.840.113556.1.4.1941:=<SID=%s>" % sid)
583 self.assertEqual(len(res1), 2)
584 dn_list = [str(res.dn).lower() for res in res1]
585 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
586 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
588 res1 = self.ldb.search(self.ou_groups,
590 expression="member:1.2.840.113556.1.4.1941:=<GUID=%s>" % guid)
591 self.assertEqual(len(res1), 2)
592 dn_list = [str(res.dn).lower() for res in res1]
593 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
594 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
596 res1 = self.ldb.search(self.ou_groups,
597 scope=SCOPE_ONELEVEL,
598 expression="member:1.2.840.113556.1.4.1941:=<GUID=%s>" % guid)
599 self.assertEqual(len(res1), 2)
600 dn_list = [str(res.dn).lower() for res in res1]
601 self.assertTrue(("CN=g3,%s" % self.ou_groups).lower() in dn_list)
602 self.assertTrue(("CN=g4,%s" % self.ou_groups).lower() in dn_list)
604 def test_extended_dn_u4(self):
605 res1 = self.ldb.search("cn=u4,%s" % self.ou_users,
607 expression="objectClass=*",
608 attrs=['objectSid', 'objectGUID'])
609 self.assertEqual(len(res1), 1)
610 self.assertEqual(str(res1[0].dn).lower(), ("cn=u4,%s" % self.ou_users).lower())
612 sid = self.ldb.schema_format_value("objectSid", res1[0]["objectSid"][0])
613 guid = self.ldb.schema_format_value("objectGUID", res1[0]['objectGUID'][0])
615 res1 = self.ldb.search(self.ou_groups,
617 expression="member=<SID=%s>" % sid)
618 self.assertEqual(len(res1), 1)
619 self.assertEqual(str(res1[0].dn).lower(), ("CN=g4,%s" % self.ou_groups).lower())
621 res1 = self.ldb.search(self.ou_groups,
623 expression="member=<GUID=%s>" % guid)
624 self.assertEqual(len(res1), 1)
625 self.assertEqual(str(res1[0].dn).lower(), ("CN=g4,%s" % self.ou_groups).lower())
627 res1 = self.ldb.search(self.ou_groups,
628 scope=SCOPE_ONELEVEL,
629 expression="member=<GUID=%s>" % guid)
630 self.assertEqual(len(res1), 1)
631 self.assertEqual(str(res1[0].dn).lower(), ("CN=g4,%s" % self.ou_groups).lower())
633 res1 = self.ldb.search(self.ou_groups,
635 expression="member:1.2.840.113556.1.4.1941:=<SID=%s>" % sid)
636 self.assertEqual(len(res1), 1)
637 self.assertEqual(str(res1[0].dn).lower(), ("CN=g4,%s" % self.ou_groups).lower())
639 res1 = self.ldb.search(self.ou_groups,
640 scope=SCOPE_ONELEVEL,
641 expression="member:1.2.840.113556.1.4.1941:=<SID=%s>" % sid)
642 self.assertEqual(len(res1), 1)
643 self.assertEqual(str(res1[0].dn).lower(), ("CN=g4,%s" % self.ou_groups).lower())
645 res1 = self.ldb.search(self.ou_groups,
647 expression="member:1.2.840.113556.1.4.1941:=<GUID=%s>" % guid)
648 self.assertEqual(len(res1), 1)
649 self.assertEqual(str(res1[0].dn).lower(), ("CN=g4,%s" % self.ou_groups).lower())
651 res1 = self.ldb.search(self.ou_groups,
652 scope=SCOPE_ONELEVEL,
653 expression="member:1.2.840.113556.1.4.1941:=<GUID=%s>" % guid)
654 self.assertEqual(len(res1), 1)
655 self.assertEqual(str(res1[0].dn).lower(), ("CN=g4,%s" % self.ou_groups).lower())
657 def test_object_dn_binary(self):
658 res1 = self.ldb.search(self.ou_computers,
660 expression="msDS-RevealedUsers=B:8:01010101:cn=c3,%s" % self.ou_computers)
661 self.assertEqual(len(res1), 1)
662 self.assertEqual(str(res1[0].dn).lower(), ("CN=c2,%s" % self.ou_computers).lower())
664 res1 = self.ldb.search(self.ou_computers,
665 scope=SCOPE_ONELEVEL,
666 expression="msDS-RevealedUsers=B:8:01010101:cn=c3,%s" % self.ou_computers)
667 self.assertEqual(len(res1), 1)
668 self.assertEqual(str(res1[0].dn).lower(), ("CN=c2,%s" % self.ou_computers).lower())
670 res1 = self.ldb.search(self.ou_computers,
672 expression="msDS-RevealedUsers:1.2.840.113556.1.4.1941:=B:8:01010101:cn=c3,%s" % self.ou_computers)
673 self.assertEqual(len(res1), 2)
674 dn_list = [str(res.dn).lower() for res in res1]
675 self.assertTrue(("CN=c1,%s" % self.ou_computers).lower() in dn_list)
676 self.assertTrue(("CN=c2,%s" % self.ou_computers).lower() in dn_list)
678 res1 = self.ldb.search(self.ou_computers,
679 scope=SCOPE_ONELEVEL,
680 expression="msDS-RevealedUsers:1.2.840.113556.1.4.1941:=B:8:01010101:cn=c3,%s" % self.ou_computers)
681 self.assertEqual(len(res1), 2)
682 dn_list = [str(res.dn).lower() for res in res1]
683 self.assertTrue(("CN=c1,%s" % self.ou_computers).lower() in dn_list)
684 self.assertTrue(("CN=c2,%s" % self.ou_computers).lower() in dn_list)
686 def test_one_way_links(self):
687 res1 = self.ldb.search(self.ou,
689 expression="addressBookRoots2=cn=c1,%s" % self.ou_computers)
690 self.assertEqual(len(res1), 1)
691 self.assertEqual(str(res1[0].dn).lower(), ("CN=e2,%s" % self.ou).lower())
693 res1 = self.ldb.search(self.ou,
694 scope=SCOPE_ONELEVEL,
695 expression="addressBookRoots2=cn=c1,%s" % self.ou_computers)
696 self.assertEqual(len(res1), 1)
697 self.assertEqual(str(res1[0].dn).lower(), ("CN=e2,%s" % self.ou).lower())
699 res1 = self.ldb.search(self.ou,
701 expression="addressBookRoots2:1.2.840.113556.1.4.1941:=cn=c1,%s" % self.ou_computers)
702 self.assertEqual(len(res1), 2)
703 dn_list = [str(res.dn).lower() for res in res1]
704 self.assertTrue(("CN=e1,%s" % self.ou).lower() in dn_list)
705 self.assertTrue(("CN=e2,%s" % self.ou).lower() in dn_list)
707 res1 = self.ldb.search(self.ou,
708 scope=SCOPE_ONELEVEL,
709 expression="addressBookRoots2:1.2.840.113556.1.4.1941:=cn=c1,%s" % self.ou_computers)
710 self.assertEqual(len(res1), 2)
711 dn_list = [str(res.dn).lower() for res in res1]
712 self.assertTrue(("CN=e1,%s" % self.ou).lower() in dn_list)
713 self.assertTrue(("CN=e2,%s" % self.ou).lower() in dn_list)
715 def test_not_linked_attrs(self):
716 res1 = self.ldb.search(self.base_dn,
718 expression="wellKnownObjects=B:32:aa312825768811d1aded00c04fd8d5cd:CN=computers,%s" % self.base_dn)
719 self.assertEqual(len(res1), 1)
720 self.assertEqual(str(res1[0].dn).lower(), self.base_dn.lower())
722 def test_invalid_basedn(self):
723 res1 = self.ldb.search(self.base_dn,
725 expression="memberOf:1.2.840.113556.1.4.1941:=cn=c1,ou=computers,ou=matchrulestest,%sXX" % self.base_dn)
726 self.assertEqual(len(res1), 0)
728 res1 = self.ldb.search(self.base_dn,
730 expression="memberOf:1.2.840.113556.1.4.1941:=cn=XX,ou=computers,ou=matchrulestest,%s" % self.base_dn)
731 self.assertEqual(len(res1), 0)
733 def test_subtree(self):
734 res1 = self.ldb.search(self.ou,
736 expression="otherWellKnownObjects=B:32:00000000000000000000000000000004:OU=o4,OU=o3,OU=o2,OU=o1,%s" % self.ou)
737 self.assertEqual(len(res1), 1)
738 self.assertEqual(str(res1[0].dn).lower(), ("OU=o3,OU=o2,OU=o1,%s" % self.ou).lower())
740 res1 = self.ldb.search(self.ou,
741 scope=SCOPE_ONELEVEL,
742 expression="otherWellKnownObjects=B:32:00000000000000000000000000000004:OU=o4,OU=o3,OU=o2,OU=o1,%s" % self.ou)
743 self.assertEqual(len(res1), 0)
745 res1 = self.ldb.search(self.ou,
747 expression="otherWellKnownObjects:1.2.840.113556.1.4.1941:=B:32:00000000000000000000000000000004:OU=o4,OU=o3,OU=o2,OU=o1,%s" % self.ou)
748 self.assertEqual(len(res1), 0)
750 res1 = self.ldb.search(self.ou,
751 scope=SCOPE_ONELEVEL,
752 expression="otherWellKnownObjects:1.2.840.113556.1.4.1941:=B:32:00000000000000000000000000000004:OU=o4,OU=o3,OU=o2,OU=o1,%s" % self.ou)
753 self.assertEqual(len(res1), 0)
755 def test_unknown_oid(self):
756 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
758 expression="member:2.4.681.226012.2.8.3882:=cn=u1,%s" % self.ou_users)
759 self.assertEqual(len(res1), 0)
761 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
763 expression="member:8.16.8720.1008448.8.32.15528:=cn=u1,%s" % self.ou_users)
764 self.assertEqual(len(res1), 0)
766 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
768 expression="member:1.2.3.4:=cn=u1,%s" % self.ou_users)
769 self.assertEqual(len(res1), 0)
771 def test_nul_text(self):
772 self.assertRaises(TypeError,
773 lambda: self.ldb.search("cn=g4,%s" % self.ou_groups,
775 expression="\00member:1.2.840.113556.1.4.1941:=cn=u1,%s" % self.ou_users))
776 self.assertRaises(TypeError,
777 lambda: self.ldb.search("cn=g4,%s" % self.ou_groups,
779 expression="member:1.2.840\00.113556.1.4.1941:=cn=u1,%s" % self.ou_users))
780 self.assertRaises(TypeError,
781 lambda: self.ldb.search("cn=g4,%s" % self.ou_groups,
783 expression="member:1.2.840.113556.1.4.1941:=cn=u1\00,%s" % self.ou_users))
784 self.assertRaises(LdbError,
785 lambda: self.ldb.search("cn=\00g4,%s" % self.ou_groups,
787 expression="member:1.2.840.113556.1.4.1941:=cn=u1,%s" % self.ou_users))
788 self.assertRaises(LdbError,
789 lambda: self.ldb.search("cn=g4,%s" % self.ou_groups,
791 expression="member:1.2.840.113556.1.4.1941:"))
792 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
794 expression="member:1.2.840.113556.1.4.1941:=")
795 self.assertEqual(len(res1), 0)
796 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
798 expression="member=")
799 self.assertEqual(len(res1), 0)
800 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
802 expression="member:1.2.840.113556.1.4.1941:=nonexistent")
803 self.assertEqual(len(res1), 0)
804 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
806 expression="member=nonexistent")
807 self.assertEqual(len(res1), 0)
808 self.assertRaises(LdbError,
809 lambda: self.ldb.search("cn=\00g4,%s" % self.ou_groups,
811 expression="member:1.2.840.113556.1.4.1941:cn=u1,%s" % self.ou_users))
812 self.assertRaises(LdbError,
813 lambda: self.ldb.search("cn=\00g4,%s" % self.ou_groups,
815 expression="member:1.2.840.113556.1.4.1941:=cn=u1"))
816 self.assertRaises(LdbError,
817 lambda: self.ldb.search("cn=\00g4,%s" % self.ou_groups,
819 expression="member:1.2.840.113556.1.4.1941:=cn="))
820 self.assertRaises(LdbError,
821 lambda: self.ldb.search("cn=\00g4,%s" % self.ou_groups,
823 expression="member::=cn=u1,%s" % self.ou_users))
825 def test_misc_matches(self):
826 res1 = self.ldb.search(self.ou_groups,
828 expression="member=cn=g1,%s" % self.ou_groups)
829 self.assertEqual(len(res1), 0)
831 res1 = self.ldb.search("cn=g1,%s" % self.ou_groups,
833 expression="member=cn=g1,%s" % self.ou_groups)
834 self.assertEqual(len(res1), 0)
836 res1 = self.ldb.search(self.ou_groups,
838 expression="member=cn=g1,%s" % self.ou_groups)
839 self.assertEqual(len(res1), 1)
840 self.assertEqual(str(res1[0].dn), "CN=g2,%s" % self.ou_groups)
842 res1 = self.ldb.search(self.ou_groups,
843 scope=SCOPE_ONELEVEL,
844 expression="member=cn=g1,%s" % self.ou_groups)
845 self.assertEqual(len(res1), 1)
846 self.assertEqual(str(res1[0].dn), "CN=g2,%s" % self.ou_groups)
848 res1 = self.ldb.search(self.ou_groups,
850 expression="member:1.2.840.113556.1.4.1941:=cn=g1,%s" % self.ou_groups)
851 self.assertEqual(len(res1), 0)
853 res1 = self.ldb.search("cn=g1,%s" % self.ou_groups,
855 expression="member:1.2.840.113556.1.4.1941:=cn=g1,%s" % self.ou_groups)
856 self.assertEqual(len(res1), 0)
858 res1 = self.ldb.search(self.ou_groups,
860 expression="member:1.2.840.113556.1.4.1941:=cn=g1,%s" % self.ou_groups)
861 self.assertEqual(len(res1), 3)
862 dn_list = [str(res.dn) for res in res1]
863 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
864 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
865 self.assertTrue("CN=g4,%s" % self.ou_groups in dn_list)
867 res1 = self.ldb.search(self.ou_groups,
868 scope=SCOPE_ONELEVEL,
869 expression="member:1.2.840.113556.1.4.1941:=cn=g1,%s" % self.ou_groups)
870 self.assertEqual(len(res1), 3)
871 dn_list = [str(res.dn) for res in res1]
872 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
873 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
874 self.assertTrue("CN=g4,%s" % self.ou_groups in dn_list)
876 res1 = self.ldb.search(self.ou_groups,
878 expression="member:1.2.840.113556.1.4.1941:=cn=g4,%s" % self.ou_groups)
879 self.assertEqual(len(res1), 0)
881 res1 = self.ldb.search(self.ou_groups,
882 scope=SCOPE_ONELEVEL,
883 expression="member:1.2.840.113556.1.4.1941:=cn=g4,%s" % self.ou_groups)
884 self.assertEqual(len(res1), 0)
886 res1 = self.ldb.search(self.ou_groups,
888 expression="memberOf=cn=g4,%s" % self.ou_groups)
889 self.assertEqual(len(res1), 0)
891 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
893 expression="memberOf=cn=g4,%s" % self.ou_groups)
894 self.assertEqual(len(res1), 0)
896 res1 = self.ldb.search(self.ou_groups,
898 expression="memberOf=cn=g4,%s" % self.ou_groups)
899 self.assertEqual(len(res1), 1)
900 self.assertEqual(str(res1[0].dn), ("CN=g3,%s" % self.ou_groups))
902 res1 = self.ldb.search(self.ou_groups,
903 scope=SCOPE_ONELEVEL,
904 expression="memberOf=cn=g4,%s" % self.ou_groups)
905 self.assertEqual(len(res1), 1)
906 self.assertEqual(str(res1[0].dn), ("CN=g3,%s" % self.ou_groups))
908 res1 = self.ldb.search(self.ou_groups,
910 expression="memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s" % self.ou_groups)
911 self.assertEqual(len(res1), 0)
913 res1 = self.ldb.search("cn=g4,%s" % self.ou_groups,
915 expression="memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s" % self.ou_groups)
916 self.assertEqual(len(res1), 0)
918 res1 = self.ldb.search(self.ou_groups,
920 expression="memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s" % self.ou_groups)
921 self.assertEqual(len(res1), 3)
922 dn_list = [str(res.dn) for res in res1]
923 self.assertTrue("CN=g1,%s" % self.ou_groups in dn_list)
924 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
925 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
927 res1 = self.ldb.search(self.ou_groups,
928 scope=SCOPE_ONELEVEL,
929 expression="memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s" % self.ou_groups)
930 self.assertEqual(len(res1), 3)
931 dn_list = [str(res.dn) for res in res1]
932 self.assertTrue("CN=g1,%s" % self.ou_groups in dn_list)
933 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
934 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
936 res1 = self.ldb.search(self.ou_groups,
938 expression="memberOf:1.2.840.113556.1.4.1941:=cn=g1,%s" % self.ou_groups)
939 self.assertEqual(len(res1), 0)
941 res1 = self.ldb.search(self.ou_groups,
943 expression="memberOf:1.2.840.113556.1.4.1941:=cn=g1,%s" % self.ou_groups)
944 self.assertEqual(len(res1), 0)
946 class MatchRuleConditionTests(samba.tests.TestCase):
948 super(MatchRuleConditionTests, self).setUp()
950 self.ldb = SamDB(host, credentials=creds, session_info=system_session(lp), lp=lp)
951 self.base_dn = self.ldb.domain_dn()
952 self.ou = "OU=matchruleconditiontests,%s" % self.base_dn
953 self.ou_users = "OU=users,%s" % self.ou
954 self.ou_groups = "OU=groups,%s" % self.ou
955 self.ou_computers = "OU=computers,%s" % self.ou
957 # Add a organizational unit to create objects
960 "objectclass": "organizationalUnit"})
962 # Create users, groups, and computers
965 "objectclass": "organizationalUnit"})
967 "dn": self.ou_groups,
968 "objectclass": "organizationalUnit"})
970 "dn": self.ou_computers,
971 "objectclass": "organizationalUnit"})
974 "dn": "cn=g1,%s" % self.ou_groups,
975 "objectclass": "group" })
977 "dn": "cn=g2,%s" % self.ou_groups,
978 "objectclass": "group" })
980 "dn": "cn=g3,%s" % self.ou_groups,
981 "objectclass": "group" })
983 "dn": "cn=g4,%s" % self.ou_groups,
984 "objectclass": "group" })
987 "dn": "cn=u1,%s" % self.ou_users,
988 "objectclass": "group"})
990 "dn": "cn=u2,%s" % self.ou_users,
991 "objectclass": "group"})
993 "dn": "cn=u3,%s" % self.ou_users,
994 "objectclass": "group"})
996 "dn": "cn=u4,%s" % self.ou_users,
997 "objectclass": "group"})
1000 "dn": "cn=c1,%s" % self.ou_computers,
1001 "objectclass": "user"})
1004 "dn": "cn=c2,%s" % self.ou_computers,
1005 "objectclass": "user"})
1008 "dn": "cn=c3,%s" % self.ou_computers,
1009 "objectclass": "user"})
1012 "dn": "cn=c4,%s" % self.ou_computers,
1013 "objectclass": "user"})
1015 # Assign groups according to the following structure:
1016 # g1-->g2---->g3 --g4
1018 # u1- >u2-- | u3<- | u4
1021 # *c1 is a member of u1, u2, u3, and u4
1023 # u2 is a member of g1 and g2
1025 m.dn = Dn(self.ldb, "CN=g1,%s" % self.ou_groups)
1026 m["member"] = MessageElement("CN=u2,%s" % self.ou_users,
1027 FLAG_MOD_ADD, "member")
1031 m.dn = Dn(self.ldb, "CN=g2,%s" % self.ou_groups)
1032 m["member"] = MessageElement("CN=u2,%s" % self.ou_users,
1033 FLAG_MOD_ADD, "member")
1036 # g2 is a member of g1
1038 m.dn = Dn(self.ldb, "CN=g1,%s" % self.ou_groups)
1039 m["member"] = MessageElement("CN=g2,%s" % self.ou_groups,
1040 FLAG_MOD_ADD, "member")
1043 # g3 is a member of g2
1045 m.dn = Dn(self.ldb, "CN=g2,%s" % self.ou_groups)
1046 m["member"] = MessageElement("CN=g3,%s" % self.ou_groups,
1047 FLAG_MOD_ADD, "member")
1050 # u3 is a member of g3 and g4
1052 m.dn = Dn(self.ldb, "CN=g3,%s" % self.ou_groups)
1053 m["member"] = MessageElement("CN=u3,%s" % self.ou_users,
1054 FLAG_MOD_ADD, "member")
1058 m.dn = Dn(self.ldb, "CN=g4,%s" % self.ou_groups)
1059 m["member"] = MessageElement("CN=u3,%s" % self.ou_users,
1060 FLAG_MOD_ADD, "member")
1063 # u4 is a member of g4
1065 m.dn = Dn(self.ldb, "CN=g4,%s" % self.ou_groups)
1066 m["member"] = MessageElement("CN=u4,%s" % self.ou_users,
1067 FLAG_MOD_ADD, "member")
1070 # c1 is a member of u1, u2, u3, and u4
1072 m.dn = Dn(self.ldb, "CN=u1,%s" % self.ou_users)
1073 m["member"] = MessageElement("CN=c1,%s" % self.ou_computers,
1074 FLAG_MOD_ADD, "member")
1078 m.dn = Dn(self.ldb, "CN=u2,%s" % self.ou_users)
1079 m["member"] = MessageElement("CN=c1,%s" % self.ou_computers,
1080 FLAG_MOD_ADD, "member")
1084 m.dn = Dn(self.ldb, "CN=u3,%s" % self.ou_users)
1085 m["member"] = MessageElement("CN=c1,%s" % self.ou_computers,
1086 FLAG_MOD_ADD, "member")
1090 m.dn = Dn(self.ldb, "CN=u4,%s" % self.ou_users)
1091 m["member"] = MessageElement("CN=c1,%s" % self.ou_computers,
1092 FLAG_MOD_ADD, "member")
1095 # c2 is a member of u1
1097 m.dn = Dn(self.ldb, "CN=u1,%s" % self.ou_users)
1098 m["member"] = MessageElement("CN=c2,%s" % self.ou_computers,
1099 FLAG_MOD_ADD, "member")
1102 # c3 is a member of u2 and g3
1104 m.dn = Dn(self.ldb, "CN=u2,%s" % self.ou_users)
1105 m["member"] = MessageElement("CN=c3,%s" % self.ou_computers,
1106 FLAG_MOD_ADD, "member")
1110 m.dn = Dn(self.ldb, "CN=g3,%s" % self.ou_groups)
1111 m["member"] = MessageElement("CN=c3,%s" % self.ou_computers,
1112 FLAG_MOD_ADD, "member")
1115 # c4 is a member of u4 and g4
1117 m.dn = Dn(self.ldb, "CN=u4,%s" % self.ou_users)
1118 m["member"] = MessageElement("CN=c4,%s" % self.ou_computers,
1119 FLAG_MOD_ADD, "member")
1123 m.dn = Dn(self.ldb, "CN=g4,%s" % self.ou_groups)
1124 m["member"] = MessageElement("CN=c4,%s" % self.ou_computers,
1125 FLAG_MOD_ADD, "member")
1128 self.question = 6*(9-2)
1132 super(MatchRuleConditionTests, self).tearDown()
1133 self.ldb.delete(self.ou, controls=['tree_delete:0'])
1136 def test_g1_members(self):
1137 res1 = self.ldb.search(self.ou,
1138 scope=SCOPE_SUBTREE,
1139 expression="memberOf=cn=g1,%s" % self.ou_groups)
1140 self.assertEquals(len(res1), 2)
1141 dn_list = [str(res.dn) for res in res1]
1142 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1143 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1145 res1 = self.ldb.search(self.ou,
1146 scope=SCOPE_SUBTREE,
1147 expression="memberOf:1.2.840.113556.1.4.1941:=cn=g1,%s" % self.ou_groups)
1148 self.assertEquals(len(res1), 6)
1149 dn_list = [str(res.dn) for res in res1]
1150 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1151 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1152 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1153 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1154 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1155 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1157 res1 = self.ldb.search(self.ou,
1158 scope=SCOPE_SUBTREE,
1159 expression="member=cn=g1,%s" % self.ou_groups)
1160 self.assertEquals(len(res1), 0)
1162 res1 = self.ldb.search(self.ou,
1163 scope=SCOPE_SUBTREE,
1164 expression="member:1.2.840.113556.1.4.1941:=cn=g1,%s" % self.ou_groups)
1165 self.assertEquals(len(res1), 0)
1167 def test_g2_members(self):
1168 res1 = self.ldb.search(self.ou,
1169 scope=SCOPE_SUBTREE,
1170 expression="memberOf=cn=g2,%s" % self.ou_groups)
1171 self.assertEquals(len(res1), 2)
1172 dn_list = [str(res.dn) for res in res1]
1173 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1174 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1176 res1 = self.ldb.search(self.ou,
1177 scope=SCOPE_SUBTREE,
1178 expression="memberOf:1.2.840.113556.1.4.1941:=cn=g2,%s" % self.ou_groups)
1179 self.assertEquals(len(res1), 5)
1180 dn_list = [str(res.dn) for res in res1]
1181 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1182 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1183 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1184 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1185 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1187 res1 = self.ldb.search(self.ou,
1188 scope=SCOPE_SUBTREE,
1189 expression="member=cn=g2,%s" % self.ou_groups)
1190 self.assertEquals(len(res1), 1)
1191 self.assertEquals(str(res1[0].dn), "CN=g1,%s" % self.ou_groups)
1193 res1 = self.ldb.search(self.ou,
1194 scope=SCOPE_SUBTREE,
1195 expression="member:1.2.840.113556.1.4.1941:=cn=g2,%s" % self.ou_groups)
1196 self.assertEquals(len(res1), 1)
1197 self.assertEquals(str(res1[0].dn), "CN=g1,%s" % self.ou_groups)
1199 def test_g3_members(self):
1200 res1 = self.ldb.search(self.ou,
1201 scope=SCOPE_SUBTREE,
1202 expression="memberOf=cn=g3,%s" % self.ou_groups)
1203 self.assertEquals(len(res1), 2)
1204 dn_list = [str(res.dn) for res in res1]
1205 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1206 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1208 res1 = self.ldb.search(self.ou,
1209 scope=SCOPE_SUBTREE,
1210 expression="memberOf:1.2.840.113556.1.4.1941:=cn=g3,%s" % self.ou_groups)
1211 self.assertEquals(len(res1), 3)
1212 dn_list = [str(res.dn) for res in res1]
1213 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1214 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1215 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1217 res1 = self.ldb.search(self.ou,
1218 scope=SCOPE_SUBTREE,
1219 expression="member=cn=g3,%s" % self.ou_groups)
1220 self.assertEquals(len(res1), 1)
1221 self.assertEquals(str(res1[0].dn), "CN=g2,%s" % self.ou_groups)
1223 res1 = self.ldb.search(self.ou,
1224 scope=SCOPE_SUBTREE,
1225 expression="member:1.2.840.113556.1.4.1941:=cn=g3,%s" % self.ou_groups)
1226 self.assertEquals(len(res1), 2)
1227 dn_list = [str(res.dn) for res in res1]
1228 self.assertTrue("CN=g1,%s" % self.ou_groups in dn_list)
1229 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1231 def test_g4_members(self):
1232 res1 = self.ldb.search(self.ou,
1233 scope=SCOPE_SUBTREE,
1234 expression="memberOf=cn=g4,%s" % self.ou_groups)
1235 self.assertEquals(len(res1), 3)
1236 dn_list = [str(res.dn) for res in res1]
1237 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1238 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1239 self.assertTrue("CN=c4,%s" % self.ou_computers in dn_list)
1241 res1 = self.ldb.search(self.ou,
1242 scope=SCOPE_SUBTREE,
1243 expression="memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s" % self.ou_groups)
1244 self.assertEquals(len(res1), 4)
1245 dn_list = [str(res.dn) for res in res1]
1246 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1247 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1248 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1249 self.assertTrue("CN=c4,%s" % self.ou_computers in dn_list)
1251 res1 = self.ldb.search(self.ou,
1252 scope=SCOPE_SUBTREE,
1253 expression="member=cn=g4,%s" % self.ou_groups)
1254 self.assertEquals(len(res1), 0)
1256 res1 = self.ldb.search(self.ou,
1257 scope=SCOPE_SUBTREE,
1258 expression="member:1.2.840.113556.1.4.1941:=cn=g4,%s" % self.ou_groups)
1259 self.assertEquals(len(res1), 0)
1261 def test_u1_members(self):
1262 res1 = self.ldb.search(self.ou,
1263 scope=SCOPE_SUBTREE,
1264 expression="memberOf=cn=u1,%s" % self.ou_users)
1265 self.assertEqual(len(res1), 2)
1266 dn_list = [str(res.dn) for res in res1]
1267 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1268 self.assertTrue("CN=c2,%s" % self.ou_computers in dn_list)
1270 res1 = self.ldb.search(self.ou,
1271 scope=SCOPE_SUBTREE,
1272 expression="memberOf:1.2.840.113556.1.4.1941:=cn=u1,%s" % self.ou_users)
1273 self.assertEqual(len(res1), 2)
1274 dn_list = [str(res.dn) for res in res1]
1275 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1276 self.assertTrue("CN=c2,%s" % self.ou_computers in dn_list)
1278 res1 = self.ldb.search(self.ou,
1279 scope=SCOPE_SUBTREE,
1280 expression="member=cn=u1,%s" % self.ou_users)
1281 self.assertEqual(len(res1), 0)
1283 res1 = self.ldb.search(self.ou,
1284 scope=SCOPE_SUBTREE,
1285 expression="member:1.2.840.113556.1.4.1941:=cn=u1,%s" % self.ou_users)
1286 self.assertEqual(len(res1), 0)
1288 def test_u2_members(self):
1289 res1 = self.ldb.search(self.ou,
1290 scope=SCOPE_SUBTREE,
1291 expression="memberOf=cn=u2,%s" % self.ou_users)
1292 self.assertEqual(len(res1), 2)
1293 dn_list = [str(res.dn) for res in res1]
1294 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1295 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1297 res1 = self.ldb.search(self.ou,
1298 scope=SCOPE_SUBTREE,
1299 expression="memberOf:1.2.840.113556.1.4.1941:=cn=u2,%s" % self.ou_users)
1300 self.assertEqual(len(res1), 2)
1301 dn_list = [str(res.dn) for res in res1]
1302 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1303 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1305 res1 = self.ldb.search(self.ou,
1306 scope=SCOPE_SUBTREE,
1307 expression="member=cn=u2,%s" % self.ou_users)
1308 self.assertEqual(len(res1), 2)
1309 dn_list = [str(res.dn) for res in res1]
1310 self.assertTrue("CN=g1,%s" % self.ou_groups in dn_list)
1311 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1313 res1 = self.ldb.search(self.ou,
1314 scope=SCOPE_SUBTREE,
1315 expression="member:1.2.840.113556.1.4.1941:=cn=u2,%s" % self.ou_users)
1316 self.assertEqual(len(res1), 2)
1317 dn_list = [str(res.dn) for res in res1]
1318 self.assertTrue("CN=g1,%s" % self.ou_groups in dn_list)
1319 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1321 def test_u3_members(self):
1322 res1 = self.ldb.search(self.ou,
1323 scope=SCOPE_SUBTREE,
1324 expression="member=cn=u3,%s" % self.ou_users)
1325 self.assertEqual(len(res1), 2)
1326 dn_list = [str(res.dn) for res in res1]
1327 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1328 self.assertTrue("CN=g4,%s" % self.ou_groups in dn_list)
1330 res1 = self.ldb.search(self.ou,
1331 scope=SCOPE_SUBTREE,
1332 expression="member:1.2.840.113556.1.4.1941:=cn=u3,%s" % self.ou_users)
1333 self.assertEqual(len(res1), 4)
1334 dn_list = [str(res.dn) for res in res1]
1335 self.assertTrue("CN=g1,%s" % self.ou_groups in dn_list)
1336 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1337 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1338 self.assertTrue("CN=g4,%s" % self.ou_groups in dn_list)
1340 res1 = self.ldb.search(self.ou,
1341 scope=SCOPE_SUBTREE,
1342 expression="memberOf=cn=u3,%s" % self.ou_users)
1343 self.assertEqual(len(res1), 1)
1344 self.assertEqual(str(res1[0].dn), "CN=c1,%s" % self.ou_computers)
1346 res1 = self.ldb.search(self.ou,
1347 scope=SCOPE_SUBTREE,
1348 expression="memberOf:1.2.840.113556.1.4.1941:=cn=u3,%s" % self.ou_users)
1349 self.assertEqual(len(res1), 1)
1350 self.assertEqual(str(res1[0].dn), "CN=c1,%s" % self.ou_computers)
1352 def test_u4_members(self):
1353 res1 = self.ldb.search(self.ou,
1354 scope=SCOPE_SUBTREE,
1355 expression="member=cn=u4,%s" % self.ou_users)
1356 self.assertEqual(len(res1), 1)
1357 self.assertEqual(str(res1[0].dn), "CN=g4,%s" % self.ou_groups)
1359 res1 = self.ldb.search(self.ou,
1360 scope=SCOPE_SUBTREE,
1361 expression="member:1.2.840.113556.1.4.1941:=cn=u4,%s" % self.ou_users)
1362 self.assertEqual(len(res1), 1)
1363 self.assertEqual(str(res1[0].dn), "CN=g4,%s" % self.ou_groups)
1365 res1 = self.ldb.search(self.ou,
1366 scope=SCOPE_SUBTREE,
1367 expression="memberOf=cn=u4,%s" % self.ou_users)
1368 self.assertEqual(len(res1), 2)
1369 dn_list = [str(res.dn) for res in res1]
1370 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1371 self.assertTrue("CN=c4,%s" % self.ou_computers in dn_list)
1373 res1 = self.ldb.search(self.ou,
1374 scope=SCOPE_SUBTREE,
1375 expression="memberOf:1.2.840.113556.1.4.1941:=cn=u4,%s" % self.ou_users)
1376 self.assertEqual(len(res1), 2)
1377 dn_list = [str(res.dn) for res in res1]
1378 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1379 self.assertTrue("CN=c4,%s" % self.ou_computers in dn_list)
1381 def test_c1_members(self):
1382 res1 = self.ldb.search(self.ou,
1383 scope=SCOPE_SUBTREE,
1384 expression="member=cn=c1,%s" % self.ou_computers)
1385 self.assertEqual(len(res1), 4)
1386 dn_list = [str(res.dn) for res in res1]
1387 self.assertTrue("CN=u1,%s" % self.ou_users in dn_list)
1388 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1389 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1390 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1392 res1 = self.ldb.search(self.ou,
1393 scope=SCOPE_SUBTREE,
1394 expression="member:1.2.840.113556.1.4.1941:=cn=c1,%s" % self.ou_computers)
1395 self.assertEqual(len(res1), 8)
1396 dn_list = [str(res.dn) for res in res1]
1397 self.assertTrue("CN=u1,%s" % self.ou_users in dn_list)
1398 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1399 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1400 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1401 self.assertTrue("CN=g1,%s" % self.ou_groups in dn_list)
1402 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1403 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1404 self.assertTrue("CN=g4,%s" % self.ou_groups in dn_list)
1406 res1 = self.ldb.search(self.ou,
1407 scope=SCOPE_SUBTREE,
1408 expression="memberOf=cn=c1,%s" % self.ou_computers)
1409 self.assertEqual(len(res1), 0)
1411 res1 = self.ldb.search(self.ou,
1412 scope=SCOPE_SUBTREE,
1413 expression="memberOf:1.2.840.113556.1.4.1941:=cn=c1,%s" % self.ou_computers)
1414 self.assertEqual(len(res1), 0)
1416 def test_c2_members(self):
1417 res1 = self.ldb.search(self.ou,
1418 scope=SCOPE_SUBTREE,
1419 expression="member=cn=c2,%s" % self.ou_computers)
1420 self.assertEqual(len(res1), 1)
1421 self.assertEqual(str(res1[0].dn), "CN=u1,%s" % self.ou_users)
1423 res1 = self.ldb.search(self.ou,
1424 scope=SCOPE_SUBTREE,
1425 expression="member:1.2.840.113556.1.4.1941:=cn=c2,%s" % self.ou_computers)
1426 self.assertEqual(len(res1), 1)
1427 self.assertEqual(str(res1[0].dn), "CN=u1,%s" % self.ou_users)
1429 res1 = self.ldb.search(self.ou,
1430 scope=SCOPE_SUBTREE,
1431 expression="memberOf=cn=c2,%s" % self.ou_computers)
1432 self.assertEqual(len(res1), 0)
1434 res1 = self.ldb.search(self.ou,
1435 scope=SCOPE_SUBTREE,
1436 expression="memberOf:1.2.840.113556.1.4.1941:=cn=c2,%s" % self.ou_computers)
1437 self.assertEqual(len(res1), 0)
1439 def test_c3_members(self):
1440 res1 = self.ldb.search(self.ou,
1441 scope=SCOPE_SUBTREE,
1442 expression="member=cn=c3,%s" % self.ou_computers)
1443 self.assertEqual(len(res1), 2)
1444 dn_list = [str(res.dn) for res in res1]
1445 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1446 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1448 res1 = self.ldb.search(self.ou,
1449 scope=SCOPE_SUBTREE,
1450 expression="member:1.2.840.113556.1.4.1941:=cn=c3,%s" % self.ou_computers)
1451 self.assertEqual(len(res1), 4)
1452 dn_list = [str(res.dn) for res in res1]
1453 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1454 self.assertTrue("CN=g1,%s" % self.ou_groups in dn_list)
1455 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1456 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1458 res1 = self.ldb.search(self.ou,
1459 scope=SCOPE_SUBTREE,
1460 expression="memberOf=cn=c3,%s" % self.ou_computers)
1461 self.assertEqual(len(res1), 0)
1463 res1 = self.ldb.search(self.ou,
1464 scope=SCOPE_SUBTREE,
1465 expression="memberOf:1.2.840.113556.1.4.1941:=cn=c3,%s" % self.ou_computers)
1466 self.assertEqual(len(res1), 0)
1468 def test_c4_members(self):
1469 res1 = self.ldb.search(self.ou,
1470 scope=SCOPE_SUBTREE,
1471 expression="member=cn=c4,%s" % self.ou_computers)
1472 self.assertEqual(len(res1), 2)
1473 dn_list = [str(res.dn) for res in res1]
1474 self.assertTrue("CN=g4,%s" % self.ou_groups in dn_list)
1475 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1477 res1 = self.ldb.search(self.ou,
1478 scope=SCOPE_SUBTREE,
1479 expression="member:1.2.840.113556.1.4.1941:=cn=c4,%s" % self.ou_computers)
1480 self.assertEqual(len(res1), 2)
1481 dn_list = [str(res.dn) for res in res1]
1482 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1483 self.assertTrue("CN=g4,%s" % self.ou_groups in dn_list)
1485 res1 = self.ldb.search(self.ou,
1486 scope=SCOPE_SUBTREE,
1487 expression="memberOf=cn=c4,%s" % self.ou_computers)
1488 self.assertEqual(len(res1), 0)
1490 res1 = self.ldb.search(self.ou,
1491 scope=SCOPE_SUBTREE,
1492 expression="memberOf:1.2.840.113556.1.4.1941:=cn=c4,%s" % self.ou_computers)
1493 self.assertEqual(len(res1), 0)
1495 def test_or_member_queries(self):
1496 res1 = self.ldb.search(self.ou,
1497 scope=SCOPE_SUBTREE,
1498 expression=("(|(member:1.2.840.113556.1.4.1941:=cn=c1,%s)"
1499 "(member:1.2.840.113556.1.4.1941:=cn=c2,%s))") % (
1500 self.ou_computers, self.ou_computers))
1501 self.assertEqual(len(res1), 8)
1502 dn_list = [str(res.dn) for res in res1]
1503 self.assertTrue("CN=u1,%s" % self.ou_users in dn_list)
1504 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1505 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1506 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1507 self.assertTrue("CN=g1,%s" % self.ou_groups in dn_list)
1508 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1509 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1510 self.assertTrue("CN=g4,%s" % self.ou_groups in dn_list)
1512 res1 = self.ldb.search(self.ou,
1513 scope=SCOPE_SUBTREE,
1514 expression=("(|(member:1.2.840.113556.1.4.1941:=cn=c2,%s)"
1515 "(member:1.2.840.113556.1.4.1941:=cn=c3,%s))") % (
1516 self.ou_computers, self.ou_computers))
1517 self.assertEqual(len(res1), 5)
1518 dn_list = [str(res.dn) for res in res1]
1519 self.assertTrue("CN=u1,%s" % self.ou_users in dn_list)
1520 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1521 self.assertTrue("CN=g1,%s" % self.ou_groups in dn_list)
1522 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1523 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1525 res1 = self.ldb.search(self.ou,
1526 scope=SCOPE_SUBTREE,
1527 expression=("(|(member:1.2.840.113556.1.4.1941:=cn=c2,%s)"
1528 "(member:1.2.840.113556.1.4.1941:=cn=c4,%s))") % (
1529 self.ou_computers, self.ou_computers))
1530 self.assertEqual(len(res1), 3)
1531 dn_list = [str(res.dn) for res in res1]
1532 self.assertTrue("CN=u1,%s" % self.ou_users in dn_list)
1533 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1534 self.assertTrue("CN=g4,%s" % self.ou_groups in dn_list)
1536 res1 = self.ldb.search(self.ou,
1537 scope=SCOPE_SUBTREE,
1538 expression=("(|(member:1.2.840.113556.1.4.1941:=cn=c3,%s)"
1539 "(member:1.2.840.113556.1.4.1941:=cn=c4,%s))") % (
1540 self.ou_computers, self.ou_computers))
1541 self.assertEqual(len(res1), 6)
1542 dn_list = [str(res.dn) for res in res1]
1543 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1544 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1545 self.assertTrue("CN=g1,%s" % self.ou_groups in dn_list)
1546 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1547 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1548 self.assertTrue("CN=g4,%s" % self.ou_groups in dn_list)
1550 res1 = self.ldb.search(self.ou,
1551 scope=SCOPE_SUBTREE,
1552 expression=("(|(member:1.2.840.113556.1.4.1941:=cn=u1,%s)"
1553 "(member:1.2.840.113556.1.4.1941:=cn=c4,%s))") % (
1554 self.ou_users, self.ou_computers))
1555 self.assertEqual(len(res1), 2)
1556 dn_list = [str(res.dn) for res in res1]
1557 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1558 self.assertTrue("CN=g4,%s" % self.ou_groups in dn_list)
1560 def test_and_member_queries(self):
1561 res1 = self.ldb.search(self.ou,
1562 scope=SCOPE_SUBTREE,
1563 expression=("(&(member:1.2.840.113556.1.4.1941:=cn=c1,%s)"
1564 "(member:1.2.840.113556.1.4.1941:=cn=c2,%s))") % (
1565 self.ou_computers, self.ou_computers))
1566 self.assertEqual(len(res1), 1)
1567 self.assertEqual(str(res1[0].dn), "CN=u1,%s" % self.ou_users)
1569 res1 = self.ldb.search(self.ou,
1570 scope=SCOPE_SUBTREE,
1571 expression=("(&(member:1.2.840.113556.1.4.1941:=cn=c2,%s)"
1572 "(member:1.2.840.113556.1.4.1941:=cn=c3,%s))") % (
1573 self.ou_computers, self.ou_computers))
1574 self.assertEqual(len(res1), 0)
1576 res1 = self.ldb.search(self.ou,
1577 scope=SCOPE_SUBTREE,
1578 expression=("(&(member:1.2.840.113556.1.4.1941:=cn=c3,%s)"
1579 "(member:1.2.840.113556.1.4.1941:=cn=u3,%s))") % (
1580 self.ou_computers, self.ou_users))
1581 self.assertEqual(len(res1), 3)
1582 dn_list = [str(res.dn) for res in res1]
1583 self.assertTrue("CN=g1,%s" % self.ou_groups in dn_list)
1584 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1585 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1587 res1 = self.ldb.search(self.ou,
1588 scope=SCOPE_SUBTREE,
1589 expression=("(&(member:1.2.840.113556.1.4.1941:=cn=c1,%s)"
1590 "(member:1.2.840.113556.1.4.1941:=cn=u4,%s))") % (
1591 self.ou_computers, self.ou_computers))
1592 self.assertEqual(len(res1), 0)
1594 def test_or_memberOf_queries(self):
1595 res1 = self.ldb.search(self.ou,
1596 scope=SCOPE_SUBTREE,
1597 expression=("(|(memberOf:1.2.840.113556.1.4.1941:=cn=g1,%s)"
1598 "(memberOf:1.2.840.113556.1.4.1941:=cn=g2,%s))") % (
1599 self.ou_groups, self.ou_groups))
1600 self.assertEqual(len(res1), 6)
1601 dn_list = [str(res.dn) for res in res1]
1602 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1603 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1604 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1605 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1606 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1607 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1609 res1 = self.ldb.search(self.ou,
1610 scope=SCOPE_SUBTREE,
1611 expression=("(|(memberOf:1.2.840.113556.1.4.1941:=cn=g1,%s)"
1612 "(memberOf:1.2.840.113556.1.4.1941:=cn=g3,%s))") % (
1613 self.ou_groups, self.ou_groups))
1614 self.assertEqual(len(res1), 6)
1615 dn_list = [str(res.dn) for res in res1]
1616 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1617 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1618 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1619 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1620 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1621 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1623 res1 = self.ldb.search(self.ou,
1624 scope=SCOPE_SUBTREE,
1625 expression=("(|(memberOf:1.2.840.113556.1.4.1941:=cn=g1,%s)"
1626 "(memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s))") % (
1627 self.ou_groups, self.ou_groups))
1628 self.assertEqual(len(res1), 8)
1629 dn_list = [str(res.dn) for res in res1]
1630 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1631 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1632 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1633 self.assertTrue("CN=g2,%s" % self.ou_groups in dn_list)
1634 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1635 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1636 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1637 self.assertTrue("CN=c4,%s" % self.ou_computers in dn_list)
1639 res1 = self.ldb.search(self.ou,
1640 scope=SCOPE_SUBTREE,
1641 expression=("(|(memberOf:1.2.840.113556.1.4.1941:=cn=g2,%s)"
1642 "(memberOf:1.2.840.113556.1.4.1941:=cn=g3,%s))") %
1643 (self.ou_groups, self.ou_groups))
1644 self.assertEqual(len(res1), 5)
1645 dn_list = [str(res.dn) for res in res1]
1646 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1647 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1648 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1649 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1650 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1652 res1 = self.ldb.search(self.ou,
1653 scope=SCOPE_SUBTREE,
1654 expression=("(|(memberOf:1.2.840.113556.1.4.1941:=cn=g2,%s)"
1655 "(memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s))") % (
1656 self.ou_groups, self.ou_groups))
1657 self.assertEqual(len(res1), 7)
1658 dn_list = [str(res.dn) for res in res1]
1659 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1660 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1661 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1662 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1663 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1664 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1665 self.assertTrue("CN=c4,%s" % self.ou_computers in dn_list)
1667 res1 = self.ldb.search(self.ou,
1668 scope=SCOPE_SUBTREE,
1669 expression=("(|(memberOf:1.2.840.113556.1.4.1941:=cn=g3,%s)"
1670 "(memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s))") % (
1671 self.ou_groups, self.ou_groups))
1672 self.assertEqual(len(res1), 5)
1673 dn_list = [str(res.dn) for res in res1]
1674 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1675 self.assertTrue("CN=u4,%s" % self.ou_users in dn_list)
1676 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1677 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1678 self.assertTrue("CN=c4,%s" % self.ou_computers in dn_list)
1680 def test_and_memberOf_queries(self):
1681 res1 = self.ldb.search(self.ou,
1682 scope=SCOPE_SUBTREE,
1683 expression=("(&(memberOf:1.2.840.113556.1.4.1941:=cn=g1,%s)"
1684 "(memberOf:1.2.840.113556.1.4.1941:=cn=g2,%s))") % (
1685 self.ou_groups, self.ou_groups))
1686 self.assertEqual(len(res1), 5)
1687 dn_list = [str(res.dn) for res in res1]
1688 self.assertTrue("CN=u2,%s" % self.ou_users in dn_list)
1689 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1690 self.assertTrue("CN=g3,%s" % self.ou_groups in dn_list)
1691 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1692 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1694 res1 = self.ldb.search(self.ou,
1695 scope=SCOPE_SUBTREE,
1696 expression=("(&(memberOf:1.2.840.113556.1.4.1941:=cn=g1,%s)"
1697 "(memberOf:1.2.840.113556.1.4.1941:=cn=g3,%s))") % (
1698 self.ou_groups, self.ou_groups))
1699 self.assertEqual(len(res1), 3)
1700 dn_list = [str(res.dn) for res in res1]
1701 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1702 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1703 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1705 res1 = self.ldb.search(self.ou,
1706 scope=SCOPE_SUBTREE,
1707 expression=("(&(memberOf:1.2.840.113556.1.4.1941:=cn=g1,%s)"
1708 "(memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s))") % (
1709 self.ou_groups, self.ou_groups))
1710 self.assertEqual(len(res1), 2)
1711 dn_list = [str(res.dn) for res in res1]
1712 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1713 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1715 res1 = self.ldb.search(self.ou,
1716 scope=SCOPE_SUBTREE,
1717 expression=("(&(memberOf:1.2.840.113556.1.4.1941:=cn=g2,%s)"
1718 "(memberOf:1.2.840.113556.1.4.1941:=cn=g3,%s))") % (
1719 self.ou_groups, self.ou_groups))
1720 self.assertEqual(len(res1), 3)
1721 dn_list = [str(res.dn) for res in res1]
1722 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1723 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1724 self.assertTrue("CN=c3,%s" % self.ou_computers in dn_list)
1726 res1 = self.ldb.search(self.ou,
1727 scope=SCOPE_SUBTREE,
1728 expression=("(&(memberOf:1.2.840.113556.1.4.1941:=cn=g2,%s)"
1729 "(memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s))") % (
1730 self.ou_groups, self.ou_groups))
1731 self.assertEqual(len(res1), 2)
1732 dn_list = [str(res.dn) for res in res1]
1733 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1734 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1736 res1 = self.ldb.search(self.ou,
1737 scope=SCOPE_SUBTREE,
1738 expression=("(&(memberOf:1.2.840.113556.1.4.1941:=cn=g3,%s)"
1739 "(memberOf:1.2.840.113556.1.4.1941:=cn=g4,%s))") % (
1740 self.ou_groups, self.ou_groups))
1741 self.assertEqual(len(res1), 2)
1742 dn_list = [str(res.dn) for res in res1]
1743 self.assertTrue("CN=u3,%s" % self.ou_users in dn_list)
1744 self.assertTrue("CN=c1,%s" % self.ou_computers in dn_list)
1746 res1 = self.ldb.search(self.ou,
1747 scope=SCOPE_SUBTREE,
1748 expression=("(&(memberOf:1.2.840.113556.1.4.1941:=cn=g1,%s)"
1749 "(memberOf:1.2.840.113556.1.4.1941:=cn=c1,%s))") % (
1750 self.ou_groups, self.ou_computers))
1751 self.assertEqual(len(res1), 0)
1753 parser = optparse.OptionParser("match_rules.py [options] <host>")
1754 sambaopts = options.SambaOptions(parser)
1755 parser.add_option_group(sambaopts)
1756 parser.add_option_group(options.VersionOptions(parser))
1758 # use command line creds if available
1759 credopts = options.CredentialsOptions(parser)
1760 parser.add_option_group(credopts)
1761 opts, args = parser.parse_args()
1762 subunitopts = SubunitOptions(parser)
1763 parser.add_option_group(subunitopts)
1766 parser.print_usage()
1771 lp = sambaopts.get_loadparm()
1772 creds = credopts.get_credentials(lp)
1774 if not "://" in host:
1775 if os.path.isfile(host):
1776 host = "tdb://%s" % host
1778 host = "ldap://%s" % host
1780 TestProgram(module=__name__, opts=subunitopts)