ticket47833_test.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. # --- BEGIN COPYRIGHT BLOCK ---
  2. # Copyright (C) 2016 Red Hat, Inc.
  3. # All rights reserved.
  4. #
  5. # License: GPL (version 3 or any later version).
  6. # See LICENSE for details.
  7. # --- END COPYRIGHT BLOCK ---
  8. #
  9. import pytest
  10. from lib389.tasks import *
  11. from lib389.utils import *
  12. from lib389.topologies import topology_st
  13. SCOPE_IN_CN = 'in'
  14. SCOPE_OUT_CN = 'out'
  15. SCOPE_IN_DN = 'cn=%s,%s' % (SCOPE_IN_CN, SUFFIX)
  16. SCOPE_OUT_DN = 'cn=%s,%s' % (SCOPE_OUT_CN, SUFFIX)
  17. PROVISIONING_CN = "provisioning"
  18. PROVISIONING_DN = "cn=%s,%s" % (PROVISIONING_CN, SCOPE_IN_DN)
  19. ACTIVE_CN = "accounts"
  20. STAGE_CN = "staged users"
  21. DELETE_CN = "deleted users"
  22. ACTIVE_DN = "cn=%s,%s" % (ACTIVE_CN, SCOPE_IN_DN)
  23. STAGE_DN = "cn=%s,%s" % (STAGE_CN, PROVISIONING_DN)
  24. DELETE_DN = "cn=%s,%s" % (DELETE_CN, PROVISIONING_DN)
  25. STAGE_USER_CN = "stage guy"
  26. STAGE_USER_DN = "cn=%s,%s" % (STAGE_USER_CN, STAGE_DN)
  27. ACTIVE_USER_CN = "active guy"
  28. ACTIVE_USER_DN = "cn=%s,%s" % (ACTIVE_USER_CN, ACTIVE_DN)
  29. OUT_USER_CN = "out guy"
  30. OUT_USER_DN = "cn=%s,%s" % (OUT_USER_CN, SCOPE_OUT_DN)
  31. STAGE_GROUP_CN = "stage group"
  32. STAGE_GROUP_DN = "cn=%s,%s" % (STAGE_GROUP_CN, STAGE_DN)
  33. ACTIVE_GROUP_CN = "active group"
  34. ACTIVE_GROUP_DN = "cn=%s,%s" % (ACTIVE_GROUP_CN, ACTIVE_DN)
  35. OUT_GROUP_CN = "out group"
  36. OUT_GROUP_DN = "cn=%s,%s" % (OUT_GROUP_CN, SCOPE_OUT_DN)
  37. logging.getLogger(__name__).setLevel(logging.DEBUG)
  38. log = logging.getLogger(__name__)
  39. def _header(topology_st, label):
  40. topology_st.standalone.log.info("\n\n###############################################")
  41. topology_st.standalone.log.info("#######")
  42. topology_st.standalone.log.info("####### %s" % label)
  43. topology_st.standalone.log.info("#######")
  44. topology_st.standalone.log.info("###############################################")
  45. def _add_user(topology_st, type='active'):
  46. if type == 'active':
  47. topology_st.standalone.add_s(Entry((ACTIVE_USER_DN, {
  48. 'objectclass': "top person inetuser".split(),
  49. 'sn': ACTIVE_USER_CN,
  50. 'cn': ACTIVE_USER_CN})))
  51. elif type == 'stage':
  52. topology_st.standalone.add_s(Entry((STAGE_USER_DN, {
  53. 'objectclass': "top person inetuser".split(),
  54. 'sn': STAGE_USER_CN,
  55. 'cn': STAGE_USER_CN})))
  56. else:
  57. topology_st.standalone.add_s(Entry((OUT_USER_DN, {
  58. 'objectclass': "top person inetuser".split(),
  59. 'sn': OUT_USER_CN,
  60. 'cn': OUT_USER_CN})))
  61. def _find_memberof(topology_st, user_dn=None, group_dn=None, find_result=True):
  62. assert (topology_st)
  63. assert (user_dn)
  64. assert (group_dn)
  65. ent = topology_st.standalone.getEntry(user_dn, ldap.SCOPE_BASE, "(objectclass=*)", ['memberof'])
  66. found = False
  67. if ent.hasAttr('memberof'):
  68. for val in ent.getValues('memberof'):
  69. topology_st.standalone.log.info("!!!!!!! %s: memberof->%s" % (user_dn, val))
  70. if val == group_dn:
  71. found = True
  72. break
  73. if find_result:
  74. assert (found)
  75. else:
  76. assert (not found)
  77. def _find_member(topology_st, user_dn=None, group_dn=None, find_result=True):
  78. assert (topology_st)
  79. assert (user_dn)
  80. assert (group_dn)
  81. ent = topology_st.standalone.getEntry(group_dn, ldap.SCOPE_BASE, "(objectclass=*)", ['member'])
  82. found = False
  83. if ent.hasAttr('member'):
  84. for val in ent.getValues('member'):
  85. topology_st.standalone.log.info("!!!!!!! %s: member ->%s" % (group_dn, val))
  86. if val == user_dn:
  87. found = True
  88. break
  89. if find_result:
  90. assert (found)
  91. else:
  92. assert (not found)
  93. def _modrdn_entry(topology_st=None, entry_dn=None, new_rdn=None, del_old=0, new_superior=None):
  94. assert topology_st != None
  95. assert entry_dn != None
  96. assert new_rdn != None
  97. topology_st.standalone.log.info("\n\n######################### MODRDN %s ######################\n" % new_rdn)
  98. if new_superior:
  99. topology_st.standalone.rename_s(entry_dn, new_rdn, newsuperior=new_superior, delold=del_old)
  100. else:
  101. topology_st.standalone.rename_s(entry_dn, new_rdn, delold=del_old)
  102. def _check_memberof(topology_st=None, action=None, user_dn=None, group_dn=None, find_result=None):
  103. assert (topology_st)
  104. assert (user_dn)
  105. assert (group_dn)
  106. if action == ldap.MOD_ADD:
  107. txt = 'add'
  108. elif action == ldap.MOD_DELETE:
  109. txt = 'delete'
  110. else:
  111. txt = 'replace'
  112. topology_st.standalone.log.info('\n%s entry %s' % (txt, user_dn))
  113. topology_st.standalone.log.info('to group %s' % group_dn)
  114. topology_st.standalone.modify_s(group_dn, [(action, 'member', user_dn)])
  115. time.sleep(1)
  116. _find_memberof(topology_st, user_dn=user_dn, group_dn=group_dn, find_result=find_result)
  117. def test_ticket47829_init(topology_st):
  118. topology_st.standalone.add_s(Entry((SCOPE_IN_DN, {
  119. 'objectclass': "top nscontainer".split(),
  120. 'cn': SCOPE_IN_DN})))
  121. topology_st.standalone.add_s(Entry((SCOPE_OUT_DN, {
  122. 'objectclass': "top nscontainer".split(),
  123. 'cn': SCOPE_OUT_DN})))
  124. topology_st.standalone.add_s(Entry((PROVISIONING_DN, {
  125. 'objectclass': "top nscontainer".split(),
  126. 'cn': PROVISIONING_CN})))
  127. topology_st.standalone.add_s(Entry((ACTIVE_DN, {
  128. 'objectclass': "top nscontainer".split(),
  129. 'cn': ACTIVE_CN})))
  130. topology_st.standalone.add_s(Entry((STAGE_DN, {
  131. 'objectclass': "top nscontainer".split(),
  132. 'cn': STAGE_DN})))
  133. topology_st.standalone.add_s(Entry((DELETE_DN, {
  134. 'objectclass': "top nscontainer".split(),
  135. 'cn': DELETE_CN})))
  136. # add groups
  137. topology_st.standalone.add_s(Entry((ACTIVE_GROUP_DN, {
  138. 'objectclass': "top groupOfNames".split(),
  139. 'cn': ACTIVE_GROUP_CN})))
  140. topology_st.standalone.add_s(Entry((STAGE_GROUP_DN, {
  141. 'objectclass': "top groupOfNames".split(),
  142. 'cn': STAGE_GROUP_CN})))
  143. topology_st.standalone.add_s(Entry((OUT_GROUP_DN, {
  144. 'objectclass': "top groupOfNames".split(),
  145. 'cn': OUT_GROUP_CN})))
  146. # add users
  147. _add_user(topology_st, 'active')
  148. _add_user(topology_st, 'stage')
  149. _add_user(topology_st, 'out')
  150. # enable memberof of with scope account
  151. topology_st.standalone.plugins.enable(name=PLUGIN_MEMBER_OF)
  152. dn = "cn=%s,%s" % (PLUGIN_MEMBER_OF, DN_PLUGIN)
  153. topology_st.standalone.modify_s(dn, [(ldap.MOD_REPLACE, 'memberOfEntryScope', ACTIVE_DN)])
  154. topology_st.standalone.restart(timeout=10)
  155. def test_ticket47829_mod_stage_user_modrdn_stage_user_1(topology_st):
  156. _header(topology_st, 'add an Stage user to a Active group. Then move Stage user to Stage')
  157. old_stage_user_dn = STAGE_USER_DN
  158. old_stage_user_rdn = "cn=%s" % STAGE_USER_CN
  159. new_stage_user_rdn = "cn=x%s" % STAGE_USER_CN
  160. new_stage_user_dn = "%s,%s" % (new_stage_user_rdn, STAGE_DN)
  161. # add Stage user to active group
  162. _check_memberof(topology_st, action=ldap.MOD_ADD, user_dn=old_stage_user_dn, group_dn=ACTIVE_GROUP_DN,
  163. find_result=False)
  164. _find_member(topology_st, user_dn=old_stage_user_dn, group_dn=ACTIVE_GROUP_DN, find_result=True)
  165. # move the Stage entry to Stage, expect no 'member' and 'memberof'
  166. _modrdn_entry(topology_st, entry_dn=old_stage_user_dn, new_rdn=new_stage_user_rdn, new_superior=STAGE_DN)
  167. _find_memberof(topology_st, user_dn=new_stage_user_dn, group_dn=ACTIVE_GROUP_DN, find_result=False)
  168. _find_member(topology_st, user_dn=new_stage_user_dn, group_dn=ACTIVE_GROUP_DN, find_result=False)
  169. if __name__ == '__main__':
  170. # Run isolated
  171. # -s for DEBUG mode
  172. CURRENT_FILE = os.path.realpath(__file__)
  173. pytest.main("-s %s" % CURRENT_FILE)