From 1773fdad2730f3f910782781fa286f402ce36cca Mon Sep 17 00:00:00 2001 From: Lukas Slebodnik Date: Sep 22 2016 19:38:33 +0000 Subject: SSSDConfig: Do not fail with nonexisting domains/services dict.keys() returns iterator in python3 and not list Chaging data in dictionary while using iterator fails with "RuntimeError: dictionary changed size during iteration" https://fedorahosted.org/sssd/ticket/3107 Reviewed-by: Michal Židek --- diff --git a/Makefile.am b/Makefile.am index 17c5f26..4385268 100644 --- a/Makefile.am +++ b/Makefile.am @@ -422,6 +422,7 @@ dist_noinst_DATA = \ src/config/testconfigs/sssd-badversion.conf \ src/config/testconfigs/sssd-invalid.conf \ src/config/testconfigs/sssd-invalid-badbool.conf \ + src/config/testconfigs/sssd-nonexisting-services-domains.conf \ src/config/etc/sssd.api.d/crash_test_dummy \ contrib/ci/README.md \ contrib/ci/configure.sh \ diff --git a/src/config/SSSDConfig/__init__.py.in b/src/config/SSSDConfig/__init__.py.in index 0acb751..e616ce3 100644 --- a/src/config/SSSDConfig/__init__.py.in +++ b/src/config/SSSDConfig/__init__.py.in @@ -1511,7 +1511,7 @@ class SSSDConfig(SSSDChangeConf): # Remove any entries in this list that don't # correspond to an active service, for integrity configured_services = self.list_services() - for srv in service_dict.keys(): + for srv in list(service_dict): if srv not in configured_services: del service_dict[srv] @@ -1794,7 +1794,7 @@ class SSSDConfig(SSSDChangeConf): # Remove any entries in this list that don't # correspond to an active domain, for integrity configured_domains = self.list_domains() - for dom in domain_dict.keys(): + for dom in list(domain_dict): if dom not in configured_domains: del domain_dict[dom] diff --git a/src/config/SSSDConfigTest.py b/src/config/SSSDConfigTest.py index 8a64a25..006a034 100755 --- a/src/config/SSSDConfigTest.py +++ b/src/config/SSSDConfigTest.py @@ -1683,6 +1683,39 @@ class SSSDConfigTestSSSDConfig(unittest.TestCase): "Domain [%s] unexpectedly found" % domain) + def testListWithInvalidDomain(self): + sssdconfig = SSSDConfig.SSSDConfig(srcdir + "/etc/sssd.api.conf", + srcdir + "/etc/sssd.api.d") + + # Negative Test - Not Initialized + self.assertRaises(SSSDConfig.NotInitializedError, + sssdconfig.list_domains) + + # Positive Test + sssdconfig.import_config( + srcdir + '/testconfigs/sssd-nonexisting-services-domains.conf' + ) + + domains = sssdconfig.list_active_domains() + self.assertTrue("active" in domains and len(domains) == 1, + "domain 'active' not found among active domains") + + domains = sssdconfig.list_inactive_domains() + self.assertTrue("inactive" in domains and len(domains) == 1, + "domain 'inactive' not found among inactive domains") + + services = sssdconfig.list_active_services() + self.assertTrue("nss" in services and len(services) == 1, + "service 'nss' not found among active services") + + services = sssdconfig.list_inactive_services() + self.assertTrue(len(services) == 2, + "unexpected count of inactive services") + for service in ("sssd", "pam"): + self.assertTrue(service in services, + "service '%s' not found among inactive services" + % service) + def testGetDomain(self): sssdconfig = SSSDConfig.SSSDConfig(srcdir + "/etc/sssd.api.conf", srcdir + "/etc/sssd.api.d") diff --git a/src/config/testconfigs/sssd-nonexisting-services-domains.conf b/src/config/testconfigs/sssd-nonexisting-services-domains.conf new file mode 100644 index 0000000..d1e2480 --- /dev/null +++ b/src/config/testconfigs/sssd-nonexisting-services-domains.conf @@ -0,0 +1,13 @@ +[domain/active] + +[domain/inactive] + +[sssd] +domains = nonexistent, active +services = nonexistent, nss + +[nss] +debug_level = 1 + +[pam] +debug_level = 2