From 32593df1c4ac1b8237fa09a0fdafa0a09cf67eaf Mon Sep 17 00:00:00 2001
From: Anuj Borah <aborah@redhat.com>
Date: Jun 24 2020 07:44:40 +0000
Subject: Issue:51142 - Port manage Entry TET suit to python 3 part 1


Bug Description: Port manage Entry TET suit to python 3 part 1

Relates: https://pagure.io/389-ds-base/issue/51142

Author: aborah

Reviewed by: Viktor Ashirov

---

diff --git a/dirsrvtests/tests/suites/plugins/managed_entry_test.py b/dirsrvtests/tests/suites/plugins/managed_entry_test.py
new file mode 100644
index 0000000..4299509
--- /dev/null
+++ b/dirsrvtests/tests/suites/plugins/managed_entry_test.py
@@ -0,0 +1,257 @@
+# --- BEGIN COPYRIGHT BLOCK ---
+# Copyright (C) 2020 Red Hat, Inc.
+# All rights reserved.
+#
+# License: GPL (version 3 or any later version).
+# See LICENSE for details.
+# --- END COPYRIGHT BLOCK ---
+#
+import pytest
+import time
+from lib389.topologies import topology_st as topo
+from lib389.idm.user import UserAccount, UserAccounts
+from lib389.idm.account import Account, Accounts
+from lib389._constants import DEFAULT_SUFFIX
+from lib389.idm.group import Groups
+from lib389.config import Config
+from lib389.idm.organizationalunit import OrganizationalUnits, OrganizationalUnit
+from lib389.plugins import MEPTemplates, MEPConfigs, ManagedEntriesPlugin, MEPTemplate
+from lib389.idm.nscontainer import nsContainers
+from lib389.tasks import Entry
+import ldap
+
+pytestmark = pytest.mark.tier1
+
+
+@pytest.fixture(scope="module")
+def _create_inital(topo):
+    """
+    Will create entries for this module
+    """
+    meps = MEPTemplates(topo.standalone, DEFAULT_SUFFIX)
+    mep_template1 = meps.create(
+        properties={'cn': 'UPG Template', 'mepRDNAttr': 'cn', 'mepStaticAttr': 'objectclass: posixGroup',
+                    'mepMappedAttr': 'cn: $uid|gidNumber: $gidNumber|description: User private group for $uid'.split(
+                        '|')})
+    conf_mep = MEPConfigs(topo.standalone)
+    conf_mep.create(properties={'cn': 'UPG Definition1', 'originScope': f'cn=Users,{DEFAULT_SUFFIX}',
+                                             'originFilter': 'objectclass=posixaccount',
+                                             'managedBase': f'cn=Groups,{DEFAULT_SUFFIX}',
+                                             'managedTemplate': mep_template1.dn})
+    container = nsContainers(topo.standalone, DEFAULT_SUFFIX)
+    for cn in ['Users', 'Groups']:
+        container.create(properties={'cn': cn})
+
+
+def test_binddn_tracking(topo, _create_inital):
+    """Test Managed Entries basic functionality
+
+    :id: ea2ddfd4-aaec-11ea-8416-8c16451d917b
+    :setup: Standalone Instance
+    :steps:
+        1. Set nsslapd-plugin-binddn-tracking attribute under cn=config
+        2. Add user
+        3. Managed Entry Plugin runs against managed entries upon any update without validating
+        4. verify creation of User Private Group with its time stamp value
+        5. Modify the SN attribute which is not mapped with managed entry
+        6. run ModRDN operation and check the User Private group
+        7. Check the time stamp of UPG should be changed now
+        8. Check the creatorsname should be user dn and internalCreatorsname should be plugin name
+        9. Check if a managed group entry was created
+    :expected results:
+        1. Success
+        2. Success
+        3. Success
+        4. Success
+        5. Success
+        6. Success
+        7. Success
+        8. Success
+        9. Success
+    """
+    config = Config(topo.standalone)
+    # set nsslapd-plugin-binddn-tracking attribute under cn=config
+    config.replace('nsslapd-plugin-binddn-tracking', 'on')
+    # Add user
+    user = UserAccounts(topo.standalone, f'cn=Users,{DEFAULT_SUFFIX}', rdn=None).create_test_user()
+    assert user.get_attr_val_utf8('mepManagedEntry') == f'cn=test_user_1000,cn=Groups,{DEFAULT_SUFFIX}'
+    entry = Account(topo.standalone, f'cn=test_user_1000,cn=Groups,{DEFAULT_SUFFIX}')
+    # Managed Entry Plugin runs against managed entries upon any update without validating
+    # verify creation of User Private Group with its time stamp value
+    stamp1 = entry.get_attr_val_utf8('modifyTimestamp')
+    user.replace('sn', 'NewSN_modified')
+    stamp2 = entry.get_attr_val_utf8('modifyTimestamp')
+    # Modify the SN attribute which is not mapped with managed entry
+    # Check the time stamp of UPG should not be changed
+    assert stamp1 == stamp2
+    time.sleep(1)
+    # run ModRDN operation and check the User Private group
+    user.rename(new_rdn='uid=UserNewRDN', newsuperior='cn=Users,dc=example,dc=com')
+    assert user.get_attr_val_utf8('mepManagedEntry') == f'cn=UserNewRDN,cn=Groups,{DEFAULT_SUFFIX}'
+    entry = Account(topo.standalone, f'cn=UserNewRDN,cn=Groups,{DEFAULT_SUFFIX}')
+    stamp3 = entry.get_attr_val_utf8('modifyTimestamp')
+    # Check the time stamp of UPG should be changed now
+    assert stamp2 != stamp3
+    time.sleep(1)
+    user.replace('gidNumber', '1')
+    stamp4 = entry.get_attr_val_utf8('modifyTimestamp')
+    assert stamp4 != stamp3
+    # Check the creatorsname should be user dn and internalCreatorsname should be plugin name
+    assert entry.get_attr_val_utf8('creatorsname') == 'cn=directory manager'
+    assert entry.get_attr_val_utf8('internalCreatorsname') == 'cn=Managed Entries,cn=plugins,cn=config'
+    assert entry.get_attr_val_utf8('modifiersname') == 'cn=directory manager'
+    user.delete()
+    config.replace('nsslapd-plugin-binddn-tracking', 'off')
+
+
+class WithObjectClass(Account):
+    def __init__(self, instance, dn=None):
+        super(WithObjectClass, self).__init__(instance, dn)
+        self._rdn_attribute = 'uid'
+        self._create_objectclasses = ['top', 'person', 'inetorgperson']
+
+
+def test_mentry01(topo, _create_inital):
+    """Test Managed Entries basic functionality
+
+    :id: 9b87493b-0493-46f9-8364-6099d0e5d806
+    :setup: Standalone Instance
+    :steps:
+        1. Check the plug-in status
+        2. Add Template and definition entry
+        3. Add our org units
+        4. Add users with PosixAccount ObjectClass and verify creation of User Private Group
+        5. Disable the plug-in and check the status
+        6. Enable the plug-in and check the status the plug-in is disabled and creation of UPG should fail
+        7. Add users with PosixAccount ObjectClass and verify creation of User Private Group
+        8. Add users, run ModRDN operation and check the User Private group
+        9. Add users, run LDAPMODIFY to change the gidNumber and check the User Private group
+        10. Checking whether creation of User Private group fails for existing group entry
+        11. Checking whether adding of posixAccount objectClass to existing user creates UPG
+        12. Running ModRDN operation and checking the user private groups mepManagedBy attribute
+        13. Deleting mepManagedBy attribute and running ModRDN operation to check if it creates a new UPG
+        14. Change the RDN of template entry, DSA Unwilling to perform error expected
+        15. Change the RDN of cn=Users to cn=TestUsers and check UPG are deleted
+    :expected results:
+        1. Success
+        2. Success
+        3. Success
+        4. Success
+        5. Success
+        6. Success
+        7. Success
+        8. Success
+        9. Success
+        10. Success
+        11. Success
+        12. Success
+        13. Success
+        14. Fail(Unwilling to perform )
+        15. Success
+    """
+    # Check the plug-in status
+    mana = ManagedEntriesPlugin(topo.standalone)
+    assert mana.status()
+    # Add Template and definition entry
+    org1 = OrganizationalUnits(topo.standalone, DEFAULT_SUFFIX).create(properties={'ou': 'Users'})
+    org2 = OrganizationalUnit(topo.standalone, f'ou=Groups,{DEFAULT_SUFFIX}')
+    meps = MEPTemplates(topo.standalone, DEFAULT_SUFFIX)
+    mep_template1 = meps.create(properties={
+        'cn': 'UPG Template1',
+        'mepRDNAttr': 'cn',
+        'mepStaticAttr': 'objectclass: posixGroup',
+        'mepMappedAttr': 'cn: $uid|gidNumber: $gidNumber|description: User private group for $uid'.split('|')})
+    conf_mep = MEPConfigs(topo.standalone)
+    mep_config = conf_mep.create(properties={
+        'cn': 'UPG Definition2',
+        'originScope': org1.dn,
+        'originFilter': 'objectclass=posixaccount',
+        'managedBase': org2.dn,
+        'managedTemplate': mep_template1.dn})
+    # Add users with PosixAccount ObjectClass and verify creation of User Private Group
+    user = UserAccounts(topo.standalone, f'ou=Users,{DEFAULT_SUFFIX}', rdn=None).create_test_user()
+    assert user.get_attr_val_utf8('mepManagedEntry') == f'cn=test_user_1000,ou=Groups,{DEFAULT_SUFFIX}'
+    # Disable the plug-in and check the status
+    mana.disable()
+    user.delete()
+    topo.standalone.restart()
+    # Add users with PosixAccount ObjectClass when the plug-in is disabled and creation of UPG should fail
+    user = UserAccounts(topo.standalone, f'ou=Users,{DEFAULT_SUFFIX}', rdn=None).create_test_user()
+    assert not user.get_attr_val_utf8('mepManagedEntry')
+    # Enable the plug-in and check the status
+    mana.enable()
+    user.delete()
+    topo.standalone.restart()
+    # Add users with PosixAccount ObjectClass and verify creation of User Private Group
+    user = UserAccounts(topo.standalone, f'ou=Users,{DEFAULT_SUFFIX}', rdn=None).create_test_user()
+    assert user.get_attr_val_utf8('mepManagedEntry') == f'cn=test_user_1000,ou=Groups,{DEFAULT_SUFFIX}'
+    # Add users, run ModRDN operation and check the User Private group
+    # Add users, run LDAPMODIFY to change the gidNumber and check the User Private group
+    user.rename(new_rdn='uid=UserNewRDN', newsuperior='ou=Users,dc=example,dc=com')
+    assert user.get_attr_val_utf8('mepManagedEntry') == f'cn=UserNewRDN,ou=Groups,{DEFAULT_SUFFIX}'
+    user.replace('gidNumber', '20209')
+    entry = Account(topo.standalone, f'cn=UserNewRDN,ou=Groups,{DEFAULT_SUFFIX}')
+    assert entry.get_attr_val_utf8('gidNumber') == '20209'
+    user.replace_many(('sn', 'new_modified_sn'), ('gidNumber', '31309'))
+    assert entry.get_attr_val_utf8('gidNumber') == '31309'
+    user.delete()
+    # Checking whether creation of User Private group fails for existing group entry
+    grp = Groups(topo.standalone, f'ou=Groups,{DEFAULT_SUFFIX}', rdn=None).create(properties={'cn': 'MENTRY_14'})
+    user = UserAccounts(topo.standalone, f'ou=Users,{DEFAULT_SUFFIX}', rdn=None).create_test_user()
+    with pytest.raises(ldap.NO_SUCH_OBJECT):
+        entry.status()
+    user.delete()
+    # Checking whether adding of posixAccount objectClass to existing user creates UPG
+    # Add Users without posixAccount objectClass
+    users = WithObjectClass(topo.standalone, f'uid=test_test, ou=Users,{DEFAULT_SUFFIX}')
+    user_properties1 = {'uid': 'test_test', 'cn': 'test', 'sn': 'test', 'mail': 'sasa@sasa.com', 'telephoneNumber': '123'}
+    user = users.create(properties=user_properties1)
+    assert not user.get_attr_val_utf8('mepManagedEntry')
+    # Add posixAccount objectClass
+    user.replace_many(('objectclass', ['top', 'person', 'inetorgperson', 'posixAccount']),
+                      ('homeDirectory', '/home/ok'),
+                      ('uidNumber', '61603'), ('gidNumber', '61603'))
+    assert not user.get_attr_val_utf8('mepManagedEntry')
+    user = UserAccounts(topo.standalone, f'ou=Users,{DEFAULT_SUFFIX}', rdn=None).create_test_user()
+    entry = Account(topo.standalone, 'cn=test_user_1000,ou=Groups,dc=example,dc=com')
+    # Add inetuser objectClass
+    user.replace_many(
+        ('objectclass', ['top', 'account', 'posixaccount', 'inetOrgPerson',
+                         'organizationalPerson', 'nsMemberOf', 'nsAccount',
+                         'person', 'mepOriginEntry', 'inetuser']),
+        ('memberOf', entry.dn))
+    assert entry.status()
+    user.delete()
+    user = UserAccounts(topo.standalone, f'ou=Users,{DEFAULT_SUFFIX}', rdn=None).create_test_user()
+    entry = Account(topo.standalone, 'cn=test_user_1000,ou=Groups,dc=example,dc=com')
+    # Add groupofNames objectClass
+    user.replace_many(
+        ('objectclass', ['top', 'account', 'posixaccount', 'inetOrgPerson',
+                         'organizationalPerson', 'nsMemberOf', 'nsAccount',
+                         'person', 'mepOriginEntry', 'groupofNames']),
+        ('memberOf', user.dn))
+    assert entry.status()
+    # Running ModRDN operation and checking the user private groups mepManagedBy attribute
+    user.replace('mepManagedEntry', f'uid=CheckModRDN,ou=Users,{DEFAULT_SUFFIX}')
+    user.rename(new_rdn='uid=UserNewRDN', newsuperior='ou=Users,dc=example,dc=com')
+    assert user.get_attr_val_utf8('mepManagedEntry') == f'uid=CheckModRDN,ou=Users,{DEFAULT_SUFFIX}'
+    # Deleting mepManagedBy attribute and running ModRDN operation to check if it creates a new UPG
+    user.remove('mepManagedEntry', f'uid=CheckModRDN,ou=Users,{DEFAULT_SUFFIX}')
+    user.rename(new_rdn='uid=UserNewRDN1', newsuperior='ou=Users,dc=example,dc=com')
+    assert user.get_attr_val_utf8('mepManagedEntry') == f'cn=UserNewRDN1,ou=Groups,{DEFAULT_SUFFIX}'
+    # Change the RDN of template entry, DSA Unwilling to perform error expected
+    mep = MEPTemplate(topo.standalone, f'cn=UPG Template,{DEFAULT_SUFFIX}')
+    with pytest.raises(ldap.UNWILLING_TO_PERFORM):
+        mep.rename(new_rdn='cn=UPG Template2', newsuperior='dc=example,dc=com')
+    # Change the RDN of cn=Users to cn=TestUsers and check UPG are deleted
+    before = user.get_attr_val_utf8('mepManagedEntry')
+    user.rename(new_rdn='uid=Anuj', newsuperior='ou=Users,dc=example,dc=com')
+    assert user.get_attr_val_utf8('mepManagedEntry') != before
+
+
+if __name__ == '__main__':
+    # Run isolated
+    # -s for DEBUG mode
+    CURRENT_FILE = os.path.realpath(__file__)
+    pytest.main("-s %s" % CURRENT_FILE)
+

