URL: https://github.com/SSSD/sssd/pull/658
Author: mrniranjan
 Title: #658: pytest: Test case for sudo: search with lower cased name for case 
insensitive domains
Action: opened

PR body:
"""

"""

To pull the PR as Git branch:
git remote add ghsssd https://github.com/SSSD/sssd
git fetch ghsssd pull/658/head:pr658
git checkout pr658
From 086de91d192534af72e8b9f77fec2d7b685b21c3 Mon Sep 17 00:00:00 2001
From: "Niranjan M.R" <mrniran...@redhat.com>
Date: Thu, 20 Sep 2018 12:22:18 +0530
Subject: [PATCH 1/4] pytest/library: Add function to create organizational
 Unit

Minor fix of removing space in DN when creating self signed CA

Signed-off-by: Niranjan M.R <mrniran...@redhat.com>
---
 src/tests/python/sssd/testlib/common/utils.py | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/tests/python/sssd/testlib/common/utils.py b/src/tests/python/sssd/testlib/common/utils.py
index 5f3596c68..3d89ad399 100644
--- a/src/tests/python/sssd/testlib/common/utils.py
+++ b/src/tests/python/sssd/testlib/common/utils.py
@@ -590,6 +590,20 @@ def posix_group(self, org_unit, basedn, group_attr, memberUid=False):
         if ret != 'Success':
             raise LdapException('Unable to add group to ldap')
 
+    def org_unit(self, org_unit, basedn):
+        """ Add Organizational Unit
+            :param str ou: Organizational unit name
+            :param str basedn: Base dn ('dc=example,dc=test')
+            :Exception: Raise LdapException if unable to organizational
+        """
+        attr = {
+            'objectClass': [b'top', b'organizationalUnit'],
+            'ou': org_unit.encode('utf-8')}
+        org_dn = 'ou=%s,%s' % (org_unit, basedn)
+        (ret, _) = self.add_entry(attr, org_dn)
+        if ret != 'Success':
+            raise LdapException('Unable to add organizational unit to ldap')
+
     def enable_autofs_schema(self, basedn):
         """ Enable autofs schema
 
@@ -728,7 +742,7 @@ def createselfsignedcerts(self,
                               serverlist,
                               ca_dn=None,
                               passphrase='Secret123',
-                              canickname='Example CA'):
+                              canickname='ExampleCA'):
         """
         Creates a NSS DB in /tmp/nssDirxxxx where self signed Root CA
         and Server Certs are created
@@ -737,7 +751,7 @@ def createselfsignedcerts(self,
         :param str Server_DN: Distinguished Name for Server Cert
         """
         if ca_dn is None:
-            ca_dn = 'CN=Example CA,O=Example,L=Raleigh,C=US'
+            ca_dn = 'CN=ExampleCA,O=Example,L=Raleigh,C=US'
         nss_passphrase = passphrase
         pin_filename = 'pin.txt'
         nss_dir = self.create_nssdb()

From aba5caf14f10dce7e85e919f34ce837a6e88f693 Mon Sep 17 00:00:00 2001
From: "Niranjan M.R" <mrniran...@redhat.com>
Date: Thu, 20 Sep 2018 12:24:26 +0530
Subject: [PATCH 2/4] pytest/testlib: Fix related to removing kerberos database

Stop krb5kdc and kadmin services. Earlier we were
not stopping kadmin services. The current code use
loop to stop the services.

Signed-off-by: Niranjan M.R <mrniran...@redhat.com>
---
 .../python/sssd/testlib/common/libkrb5.py     | 23 ++++++++-----------
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/src/tests/python/sssd/testlib/common/libkrb5.py b/src/tests/python/sssd/testlib/common/libkrb5.py
index 2fa833109..4d167efc7 100644
--- a/src/tests/python/sssd/testlib/common/libkrb5.py
+++ b/src/tests/python/sssd/testlib/common/libkrb5.py
@@ -198,20 +198,15 @@ def destroy_krb5server(self):
             :Exception: subprocess.CalledProcessError
         """
         # stop the Kerberos server
-        try:
-            self.multihost.run_command(['systemctl', 'stop', 'krb5kdc'])
-        except subprocess.CalledProcessError:
-            raise
-        else:
-            self.multihost.log.info("stopped krb5kdc service")
-
-        # stop kadmin service
-        try:
-            self.multihost.run_command(['systemctl', 'stop', 'krb5kdc'])
-        except subprocess.CalledProcessError:
-            raise
-        else:
-            self.multihost.log.info("stopped kadmin service")
+        services = ['krb5kdc', 'kadmin']
+        for service in services:
+            stop_cmd = 'systemctl stop %s' % service
+            try:
+                self.multihost.run_command(stop_cmd)
+            except subprocess.CalledProcessError:
+                raise
+            else:
+                self.multihost.log.info("stopped %s service ")
 
         # destroy Kerberos database
         try:

From 1269cc768716ff533c72950b075780faac4ee433 Mon Sep 17 00:00:00 2001
From: "Niranjan M.R" <mrniran...@redhat.com>
Date: Thu, 20 Sep 2018 12:27:02 +0530
Subject: [PATCH 3/4] pytest/testlib: Remove Spaces in CA DN.

Signed-off-by: Niranjan M.R <mrniran...@redhat.com>
---
 src/tests/python/sssd/testlib/common/libdirsrv.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/tests/python/sssd/testlib/common/libdirsrv.py b/src/tests/python/sssd/testlib/common/libdirsrv.py
index 5c3927f7e..43d73d7c1 100644
--- a/src/tests/python/sssd/testlib/common/libdirsrv.py
+++ b/src/tests/python/sssd/testlib/common/libdirsrv.py
@@ -208,7 +208,7 @@ def setup_certs(self, ssl_dir):
         for pkcs_file in pkcs12_file:
             if not self._import_certs(pkcs_file, pwfile):
                 raise DirSrvException("importing certificates failed")
-        set_trust_cmd = 'certutil -M -d %s -n "Example CA"'\
+        set_trust_cmd = 'certutil -M -d %s -n "ExampleCA"'\
                         ' -t "CTu,u,u" -f %s' % (self.dsinst_path, pwfile)
         self.multihost.run_command(create_cert_dir)
         self.multihost.run_command(set_trust_cmd)

From 1cf9a950c82566699e69ce910a4e12eb6676e129 Mon Sep 17 00:00:00 2001
From: "Niranjan M.R" <mrniran...@redhat.com>
Date: Thu, 20 Sep 2018 15:48:34 +0530
Subject: [PATCH 4/4] pytest: Add test for sudo: search with lower cased name
 for case insensitive domains

1. Add test case for sudo: search with lower
   cased name for case insensitive domains

2. Minor fixes to package installation

3. Remove Host kerberos keytab while teardown

4. Add fixtures:
    disable case_sensitive
    enable sudo service
    add suders: sss in nsswitch.conf

Signed-off-by: Niranjan M.R <mrniran...@redhat.com>
---
 src/tests/multihost/basic/conftest.py   | 115 +++++++++++++++++++++++-
 src/tests/multihost/basic/test_basic.py |  26 ++++++
 2 files changed, 140 insertions(+), 1 deletion(-)

diff --git a/src/tests/multihost/basic/conftest.py b/src/tests/multihost/basic/conftest.py
index 221928848..45a60806b 100644
--- a/src/tests/multihost/basic/conftest.py
+++ b/src/tests/multihost/basic/conftest.py
@@ -42,7 +42,7 @@ def package_install(session_multihost):
     if 'Fedora' in distro:
         cmd = 'dnf install -y %s' % (pkg_list)
     elif '8.' in distro.split()[5]:
-        cmd = 'dnf module -y install idm:4 389-ds:1.4'
+        cmd = 'dnf module -y install 389-ds:1.4'
     session_multihost.master[0].run_command(cmd)
 
 
@@ -89,6 +89,8 @@ def setup_kerberos(session_multihost, request):
     def remove_kerberos():
         """ Remove kerberos instance """
         krb.destroy_krb5server()
+        remove_keytab = 'rm -f /etc/krb5.keytab'
+        session_multihost.master[0].run_command(remove_keytab)
     request.addfinalizer(remove_kerberos)
 
 
@@ -173,6 +175,117 @@ def disable_kcm():
     request.addfinalizer(disable_kcm)
 
 
+@pytest.fixture
+def create_casesensitive_posix_user(session_multihost):
+    """ Create a case sensitive posix user """
+    ldap_uri = 'ldap://%s' % (session_multihost.master[0].sys_hostname)
+    krb = krb5srv(session_multihost.master[0], 'EXAMPLE.TEST')
+    ds_rootdn = 'cn=Directory Manager'
+    ds_rootpw = 'Secret123'
+    ldap_inst = LdapOperations(ldap_uri, ds_rootdn, ds_rootpw)
+    username = 'CAPSUSER-1'
+    user_info = {'cn': username,
+                 'uid': username,
+                 'uidNumber': '24583100',
+                 'gidNumber': '14564100'}
+    ldap_inst.posix_user("ou=People", "dc=example,dc=test", user_info)
+    krb.add_principal('CAPSUSER-1', 'user', 'Secret123')
+
+
+@pytest.fixture
+def set_case_sensitive_false(session_multihost):
+    """ Set case_sensitive to false in sssd domain section """
+    session_multihost.master[0].transport.get_file('/etc/sssd/sssd.conf',
+                                                   '/tmp/sssd.conf')
+    sssdconfig = ConfigParser.SafeConfigParser()
+    sssdconfig.read('/tmp/sssd.conf')
+    domain_section = "%s/%s" % ('domain', 'EXAMPLE.TEST')
+    if domain_section in sssdconfig.sections():
+        sssdconfig.set(domain_section, 'case_sensitive', 'false')
+        with open('/tmp/sssd.conf', "w") as sssconf:
+            sssdconfig.write(sssconf)
+    session_multihost.master[0].transport.put_file('/tmp/sssd.conf',
+                                                   '/etc/sssd/sssd.conf')
+    session_multihost.master[0].service_sssd('restart')
+
+
+@pytest.fixture
+def enable_sudo_service(session_multihost):
+    """ Enable sudo services in sssd.conf """
+    session_multihost.master[0].transport.get_file('/etc/sssd/sssd.conf',
+                                                   '/tmp/sssd.conf')
+    sssdconfig = ConfigParser.SafeConfigParser()
+    sssdconfig.read('/tmp/sssd.conf')
+    sssdconfig.remove_option('sssd', 'services')
+    sssdconfig.set('sssd', 'services', 'nss, pam, ifp, sudo')
+    with open('/tmp/sssd.conf', "w") as sssconf:
+        sssdconfig.write(sssconf)
+    session_multihost.master[0].transport.put_file('/tmp/sssd.conf',
+                                                   '/etc/sssd/sssd.conf')
+    session_multihost.master[0].service_sssd('restart')
+
+
+@pytest.fixture
+def create_sudorule(session_multihost, create_casesensitive_posix_user):
+    """ Create posix user and groups """
+    # pylint: disable=unused-argument
+    _pytest_fixture = [create_casesensitive_posix_user]
+    ldap_uri = 'ldap://%s' % (session_multihost.master[0].sys_hostname)
+    ds_rootdn = 'cn=Directory Manager'
+    ds_rootpw = 'Secret123'
+    ldap_inst = LdapOperations(ldap_uri, ds_rootdn, ds_rootpw)
+    ldap_inst.org_unit('sudoers', 'dc=example,dc=test')
+    capsrule_dn1 = 'cn=lessrule,ou=sudoers,dc=example,dc=test'
+    capsrule_dn2 = 'cn=morerule,ou=sudoers,dc=example,dc=test'
+    sudo_attr1 = {
+        'objectClass': [b'top', b'sudoRole'],
+        'cn': 'lessrule'.encode('utf-8'),
+        'sudoHost': 'ALL'.encode('utf-8'),
+        'sudoCommand': '/usr/bin/less'.encode('utf-8'),
+        'sudoUser': 'capsuser-1'.encode('utf-8'),
+        'sudoOption': '!requiretty'.encode('utf-8')}
+    sudo_attr2 = {
+        'objectClass': [b'top', b'sudoRole'],
+        'cn': 'morerule'.encode('utf-8'),
+        'sudoHost': 'ALL'.encode('utf-8'),
+        'sudoCommand': '/usr/bin/more'.encode('utf-8'),
+        'sudoUser': 'CAPSUSER-1'.encode('utf-8'),
+        'sudoOption': '!requiretty'.encode('utf-8')}
+    no_passwd = [(ldap.MOD_ADD, 'sudoOption', '!authenticate'.encode('utf-8'))]
+    try:
+        (_, _) = ldap_inst.add_entry(sudo_attr1, capsrule_dn1)
+    except LdapException:
+        pytest.fail("Failed to add %s rule in ldap" % (capsrule_dn1))
+    try:
+        (_, _) = ldap_inst.add_entry(sudo_attr2, capsrule_dn2)
+    except LdapException:
+        pytest.fail("Failed to add %s rule in ldap" % (capsrule_dn2))
+    else:
+        (_, _) = ldap_inst.modify_ldap(capsrule_dn1, no_passwd)
+        (_, _) = ldap_inst.modify_ldap(capsrule_dn2, no_passwd)
+
+
+@pytest.fixture
+def enable_sss_sudo_nsswitch(session_multihost, tmpdir, request):
+    """Enable sss backend for sudoers in nsswitch.conf """
+    conf = '/etc/nsswitch.conf'
+    local_conf = tmpdir.mkdir("tmpdir").join('nsswitch.conf')
+    backup_cmd = "cp -f /etc/nsswitch.conf /etc/nsswitch.conf.backup"
+    session_multihost.master[0].run_command(backup_cmd)
+    content = '\nsudoers: sss\n'
+    session_multihost.master[0].transport.get_file(conf, str(local_conf))
+
+    local_conf.write(content, mode='a')
+    session_multihost.master[0].transport.put_file(str(local_conf),
+                                                   '/etc/nsswitch.conf')
+
+    def restore_nsswitch():
+        """ Restore nsswitch.conf """
+        restore_cmd = 'cp -f /etc/nsswitch.conf.backup /etc/nsswitch.conf'
+        session_multihost.master[0].run_command(restore_cmd)
+    request.addfinalizer(restore_nsswitch)
+
+
 @pytest.fixture(scope='class', autouse=True)
 def create_posix_usersgroups(session_multihost):
     """ Create posix user and groups """
diff --git a/src/tests/multihost/basic/test_basic.py b/src/tests/multihost/basic/test_basic.py
index 568288d0c..ee6b5f62b 100644
--- a/src/tests/multihost/basic/test_basic.py
+++ b/src/tests/multihost/basic/test_basic.py
@@ -117,3 +117,29 @@ def test_ssh_login_kcm(self, multihost, enable_kcm):
         else:
             assert True
             ssh.close()
+
+    def test_case_senitivity_sudo_responder(self, multihost,
+                                            create_sudorule,
+                                            enable_sss_sudo_nsswitch,
+                                            set_case_sensitive_false,
+                                            enable_sudo_service):
+        """ Verify case sensitivity in sudo responder """
+        # pylint: disable=unused-argument
+        _pytest_fixtures = [create_sudorule, enable_sss_sudo_nsswitch,
+                            set_case_sensitive_false, enable_sudo_service]
+        try:
+            ssh = SSHClient(multihost.master[0].sys_hostname,
+                            username='capsuser-1', password='Secret123')
+        except paramiko.ssh_exception.AuthenticationException:
+            pytest.fail("%s failed to login" % 'capsuser-1')
+        else:
+            (stdout, _, exit_status) = ssh.execute_cmd('sudo -l')
+            result = []
+            assert exit_status == 0
+            for line in stdout.readlines():
+                if 'NOPASSWD' in line:
+                    line.strip()
+                    result.append(line.strip('(root) NOPASSWD: '))
+            assert '/usr/bin/less\n' in result
+            assert '/usr/bin/more\n' in result
+            ssh.close()
_______________________________________________
sssd-devel mailing list -- sssd-devel@lists.fedorahosted.org
To unsubscribe send an email to sssd-devel-le...@lists.fedorahosted.org
Fedora Code of Conduct: https://getfedora.org/code-of-conduct.html
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedorahosted.org/archives/list/sssd-devel@lists.fedorahosted.org

Reply via email to