automember_test.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. import logging
  2. import pytest
  3. import os
  4. import ldap
  5. from lib389.utils import ds_is_older
  6. from lib389._constants import *
  7. from lib389.plugins import AutoMembershipPlugin, AutoMembershipDefinition, AutoMembershipDefinitions, AutoMembershipRegexRule
  8. from lib389._mapped_object import DSLdapObjects, DSLdapObject
  9. from lib389 import agreement
  10. from lib389.idm.user import UserAccount, UserAccounts, TEST_USER_PROPERTIES
  11. from lib389.idm.group import Groups, Group
  12. from lib389.topologies import topology_st as topo
  13. from lib389._constants import DEFAULT_SUFFIX
  14. # Skip on older versions
  15. pytestmark = [pytest.mark.tier1,
  16. pytest.mark.skipif(ds_is_older('1.3.7'), reason="Not implemented")]
  17. DEBUGGING = os.getenv("DEBUGGING", default=False)
  18. if DEBUGGING:
  19. logging.getLogger(__name__).setLevel(logging.DEBUG)
  20. else:
  21. logging.getLogger(__name__).setLevel(logging.INFO)
  22. log = logging.getLogger(__name__)
  23. @pytest.fixture(scope="module")
  24. def automember_fixture(topo, request):
  25. groups = Groups(topo.standalone, DEFAULT_SUFFIX)
  26. group = groups.create(properties={'cn': 'testgroup'})
  27. automemberplugin = AutoMembershipPlugin(topo.standalone)
  28. automemberplugin.enable()
  29. topo.standalone.restart()
  30. automember_prop = {
  31. 'cn': 'testgroup_definition',
  32. 'autoMemberScope': 'ou=People,' + DEFAULT_SUFFIX,
  33. 'autoMemberFilter': 'objectclass=*',
  34. 'autoMemberDefaultGroup': group.dn,
  35. 'autoMemberGroupingAttr': 'member:dn',
  36. }
  37. automembers = AutoMembershipDefinitions(topo.standalone, "cn=Auto Membership Plugin,cn=plugins,cn=config")
  38. automember = automembers.create(properties=automember_prop)
  39. return (group, automembers, automember)
  40. def test_automemberscope(automember_fixture, topo):
  41. """Test if the automember scope is valid
  42. :id: c3d3f250-e7fd-4441-8387-3d24c156e982
  43. :setup: Standalone instance, enabled Auto Membership Plugin
  44. :steps:
  45. 1. Create automember with invalid cn that raises
  46. UNWILLING_TO_PERFORM exception
  47. 2. If exception raised, set scope to any cn
  48. 3. If exception is not raised, set scope to with ou=People
  49. :expectedresults:
  50. 1. Should be success
  51. 2. Should be success
  52. 3. Should be success
  53. """
  54. (group, automembers, automember) = automember_fixture
  55. automember_prop = {
  56. 'cn': 'anyrandomcn',
  57. 'autoMemberScope': 'ou=People,' + DEFAULT_SUFFIX,
  58. 'autoMemberFilter': 'objectclass=*',
  59. 'autoMemberDefaultGroup': group.dn,
  60. 'autoMemberGroupingAttr': 'member:dn',
  61. }
  62. # depends on issue #49465
  63. # with pytest.raises(ldap.UNWILLING_TO_PERFORM):
  64. # automember = automembers.create(properties=automember_prop)
  65. # automember.set_scope("cn=No Entry,%s" % DEFAULT_SUFFIX)
  66. automember.set_scope("ou=People,%s" % DEFAULT_SUFFIX)
  67. def test_automemberfilter(automember_fixture, topo):
  68. """Test if the automember filter is valid
  69. :id: 935c55de-52dc-4f80-b7dd-3aacd30f6df2
  70. :setup: Standalone instance, enabled Auto Membership Plugin
  71. :steps:
  72. 1. Create automember with invalid filter that raises
  73. UNWILLING_TO_PERFORM exception
  74. 2. If exception raised, set filter to the invalid filter
  75. 3. If exception is not raised, set filter as all objectClasses
  76. :expectedresults:
  77. 1. Should be success
  78. 2. Should be success
  79. 3. Should be success
  80. """
  81. (group, automembers, automember) = automember_fixture
  82. automember_prop = {
  83. 'cn': 'anyrandomcn',
  84. 'autoMemberScope': 'ou=People,' + DEFAULT_SUFFIX,
  85. 'autoMemberFilter': '(ou=People',
  86. 'autoMemberDefaultGroup': group.dn,
  87. 'autoMemberGroupingAttr': 'member:dn',
  88. }
  89. with pytest.raises(ldap.UNWILLING_TO_PERFORM):
  90. automember = automembers.create(properties=automember_prop)
  91. automember.set_filter("(ou=People")
  92. automember.set_filter("objectClass=*")
  93. def test_adduser(automember_fixture, topo):
  94. """Test if member is automatically added to the group
  95. :id: 14f1e2f5-2162-41ab-962c-5293516baf2e
  96. :setup: Standalone instance, enabled Auto Membership Plugin
  97. :steps:
  98. 1. Create a user
  99. 2. Assert that the user is member of the group
  100. :expectedresults:
  101. 1. Should be success
  102. 2. Should be success
  103. """
  104. (group, automembers, automember) = automember_fixture
  105. users = UserAccounts(topo.standalone, DEFAULT_SUFFIX)
  106. user = users.create(properties=TEST_USER_PROPERTIES)
  107. assert group.is_member(user.dn)
  108. user.delete()
  109. def test_delete_default_group(automember_fixture, topo):
  110. """If memberof is enable and a user became member of default group
  111. because of automember rule then delete the default group should succeeds
  112. :id: 8b55d077-8851-45a2-a547-b28a7983a3c2
  113. :setup: Standalone instance, enabled Auto Membership Plugin
  114. :steps:
  115. 1. Enable memberof plugin
  116. 2. Create a user
  117. 3. Assert that the user is member of the default group
  118. 4. Delete the default group
  119. :expectedresults:
  120. 1. Should be success
  121. 2. Should be success
  122. 3. Should be success
  123. 4. Should be success
  124. """
  125. (group, automembers, automember) = automember_fixture
  126. from lib389.plugins import MemberOfPlugin
  127. memberof = MemberOfPlugin(topo.standalone)
  128. memberof.enable()
  129. topo.standalone.restart()
  130. topo.standalone.setLogLevel(65536)
  131. users = UserAccounts(topo.standalone, DEFAULT_SUFFIX)
  132. user_1 = users.create_test_user(uid=1)
  133. try:
  134. assert group.is_member(user_1.dn)
  135. group.delete()
  136. error_lines = topo.standalone.ds_error_log.match('.*auto-membership-plugin - automember_update_member_value - group .default or target. does not exist .%s.$' % group.dn)
  137. assert (len(error_lines) == 1)
  138. finally:
  139. user_1.delete()
  140. topo.standalone.setLogLevel(0)
  141. def test_delete_target_group(automember_fixture, topo):
  142. """If memberof is enabld and a user became member of target group
  143. because of automember rule then delete the target group should succeeds
  144. :id: bf5745e3-3de8-485d-8a68-e2fd460ce1cb
  145. :setup: Standalone instance, enabled Auto Membership Plugin
  146. :steps:
  147. 1. Recreate the default group if it was deleted before
  148. 2. Create a target group (using regex)
  149. 3. Create a target group automember rule (regex)
  150. 4. Enable memberof plugin
  151. 5. Create a user that goes into the target group
  152. 6. Assert that the user is member of the target group
  153. 7. Delete the target group
  154. 8. Check automember skipped the regex automember rule because target group did not exist
  155. :expectedresults:
  156. 1. Should be success
  157. 2. Should be success
  158. 3. Should be success
  159. 4. Should be success
  160. 5. Should be success
  161. 6. Should be success
  162. 7. Should be success
  163. 8. Should be success
  164. """
  165. (group, automembers, automember) = automember_fixture
  166. # default group that may have been deleted in previous tests
  167. try:
  168. groups = Groups(topo.standalone, DEFAULT_SUFFIX)
  169. group = groups.create(properties={'cn': 'testgroup'})
  170. except:
  171. pass
  172. # target group that will receive regex automember
  173. groups = Groups(topo.standalone, DEFAULT_SUFFIX)
  174. group_regex = groups.create(properties={'cn': 'testgroup_regex'})
  175. # regex automember definition
  176. automember_regex_prop = {
  177. 'cn': 'automember regex',
  178. 'autoMemberTargetGroup': group_regex.dn,
  179. 'autoMemberInclusiveRegex': 'uid=.*1',
  180. }
  181. automember_regex_dn = 'cn=automember regex, %s' % automember.dn
  182. automember_regexes = AutoMembershipRegexRule(topo.standalone, automember_regex_dn)
  183. automember_regex = automember_regexes.create(properties=automember_regex_prop)
  184. from lib389.plugins import MemberOfPlugin
  185. memberof = MemberOfPlugin(topo.standalone)
  186. memberof.enable()
  187. topo.standalone.restart()
  188. topo.standalone.setLogLevel(65536)
  189. # create a user that goes into the target group but not in the default group
  190. users = UserAccounts(topo.standalone, DEFAULT_SUFFIX)
  191. user_1 = users.create_test_user(uid=1)
  192. try:
  193. assert group_regex.is_member(user_1.dn)
  194. assert not group.is_member(user_1.dn)
  195. # delete that target filter group
  196. group_regex.delete()
  197. error_lines = topo.standalone.ds_error_log.match('.*auto-membership-plugin - automember_update_member_value - group .default or target. does not exist .%s.$' % group_regex.dn)
  198. # one line for default group and one for target group
  199. assert (len(error_lines) == 1)
  200. finally:
  201. user_1.delete()
  202. topo.standalone.setLogLevel(0)