From 6863b79954da8b75028fd9e801f9c8375989cc31 Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgallagh@redhat.com>
Date: Thu, 7 Jan 2010 11:49:21 -0500
Subject: [PATCH 3/3] Add mandatory flag to SSSD config schema

Also add list_mandatory_options() to both SSSDService and
SSSDDomain objects.

There is a new list_options_with_mandatory() function that will
return a longer tuple than list_options(), including the mandatory
flag directly.
---
 server/config/SSSDConfig.py                  |  159 +++++++++++++++++++++++---
 server/config/SSSDConfigTest.py              |  151 ++++++++++++++++++++++--
 server/config/etc/sssd.api.conf              |   70 ++++++------
 server/config/etc/sssd.api.d/sssd-ipa.conf   |  134 +++++++++++-----------
 server/config/etc/sssd.api.d/sssd-krb5.conf  |   16 ++--
 server/config/etc/sssd.api.d/sssd-ldap.conf  |  118 ++++++++++----------
 server/config/etc/sssd.api.d/sssd-local.conf |    4 +-
 server/config/etc/sssd.api.d/sssd-proxy.conf |    4 +-
 8 files changed, 453 insertions(+), 203 deletions(-)

diff --git a/server/config/SSSDConfig.py b/server/config/SSSDConfig.py
index d31fbe2..5aeb615 100644
--- a/server/config/SSSDConfig.py
+++ b/server/config/SSSDConfig.py
@@ -209,7 +209,8 @@ class SSSDConfigSchema(SSSDChangeConf):
         # Indexes
         PRIMARY_TYPE = 0
         SUBTYPE = 1
-        DEFAULT = 2
+        MANDATORY = 2
+        DEFAULT = 3
 
         # Parse values
         parsed_options = {}
@@ -220,24 +221,27 @@ class SSSDConfigSchema(SSSDChangeConf):
 
             primarytype = self.type_lookup[split_option[PRIMARY_TYPE]]
             subtype = self.type_lookup[split_option[SUBTYPE]]
+            mandatory = self.bool_lookup[split_option[MANDATORY]]
 
             if option_strings.has_key(option['name']):
                 desc = option_strings[option['name']]
             else:
                 desc = None
 
-            if optionlen == 2:
+            if optionlen == 3:
                 # This option has no defaults
                 parsed_options[option['name']] = \
                     (primarytype,
                      subtype,
+                     mandatory,
                      desc,
                      None)
-            elif optionlen == 3:
+            elif optionlen == 4:
                 if type(split_option[DEFAULT]) == primarytype:
                     parsed_options[option['name']] = \
                         (primarytype,
                          subtype,
+                         mandatory,
                          desc,
                          split_option[DEFAULT])
                 elif primarytype == list:
@@ -245,6 +249,7 @@ class SSSDConfigSchema(SSSDChangeConf):
                         parsed_options[option['name']] = \
                             (primarytype,
                              subtype,
+                             mandatory,
                              desc,
                              [split_option[DEFAULT]])
                     else:
@@ -254,12 +259,14 @@ class SSSDConfigSchema(SSSDChangeConf):
                                 parsed_options[option['name']] = \
                                     (primarytype,
                                      subtype,
+                                     mandatory,
                                      desc,
                                      [self.bool_lookup[split_option[DEFAULT].lower()]])
                             else:
                                 parsed_options[option['name']] = \
                                     (primarytype,
                                      subtype,
+                                     mandatory,
                                      desc,
                                      [subtype(split_option[DEFAULT])])
                         except ValueError, KeyError:
@@ -271,18 +278,20 @@ class SSSDConfigSchema(SSSDChangeConf):
                                 parsed_options[option['name']] = \
                                     (primarytype,
                                      subtype,
+                                     mandatory,
                                      desc,
                                      self.bool_lookup[split_option[DEFAULT].lower()])
                         else:
                             parsed_options[option['name']] = \
                                 (primarytype,
                                  subtype,
+                                 mandatory,
                                  desc,
                                  primarytype(split_option[DEFAULT]))
                     except ValueError, KeyError:
                         raise ParsingError
 
-            elif optionlen > 3:
+            elif optionlen > 4:
                 if (primarytype != list):
                     raise ParsingError
                 fixed_options = []
@@ -301,6 +310,7 @@ class SSSDConfigSchema(SSSDChangeConf):
                 parsed_options[option['name']] = \
                     (primarytype,
                      subtype,
+                     mandatory,
                      desc,
                      fixed_options)
             else:
@@ -323,9 +333,9 @@ class SSSDConfigSchema(SSSDChangeConf):
             raise NoSectionError(section)
 
         schema_options = self.get_options(section)
-        defaults = dict([(x,schema_options[x][3])
+        defaults = dict([(x,schema_options[x][4])
                          for x in schema_options.keys()
-                         if schema_options[x][3] != None])
+                         if schema_options[x][4] != None])
 
         return defaults
 
@@ -462,22 +472,23 @@ class SSSDService(SSSDConfigObject):
             self.options['config_file_version'] = 2
             self.hidden_options.append('config_file_version')
 
-    def list_options(self):
+    def list_options_with_mandatory(self):
         """
-        List all options that apply to this service
+        List options for the service, including the mandatory flag.
 
         === Returns ===
         A dictionary of configurable options. This dictionary is keyed on the
         option name with a tuple of the variable type, subtype ('None' if the
-        type is not  a collection type), the translated option description, and
-        the default value (or 'None') as the value.
+        type is not  a collection type), whether it is mandatory, the
+        translated option description, and the default value (or 'None') as
+        the value.
 
         Example:
-        { 'services' :
-          (list, str, u'SSSD Services to start', ['nss', 'pam']) }
+        { 'enumerate' :
+          (bool, None, False, u'Enable enumerating all users/groups', True) }
 
         === Errors ===
-        No Errors
+        No errors
         """
         options = {}
 
@@ -490,6 +501,61 @@ class SSSDService(SSSDConfigObject):
 
         return options
 
+    def list_options(self):
+        """
+        List all options that apply to this service
+
+        === Returns ===
+        A dictionary of configurable options. This dictionary is keyed on the
+        option name with a tuple of the variable type, subtype ('None' if the
+        type is not  a collection type), the translated option description, and
+        the default value (or 'None') as the value.
+
+        Example:
+        { 'services' :
+          (list, str, u'SSSD Services to start', ['nss', 'pam']) }
+
+        === Errors ===
+        No Errors
+        """
+        options = self.list_options_with_mandatory()
+
+        # Filter out the mandatory field to maintain compatibility
+        # with older versions of the API
+        filtered_options = {}
+        for key in options.keys():
+            filtered_options[key] = (options[key][0], options[key][1], options[key][3], options[key][4])
+
+        return filtered_options
+
+    def list_mandatory_options(self):
+        """
+        List all mandatory options that apply to this service
+
+        === Returns ===
+        A dictionary of configurable options. This dictionary is keyed on the
+        option name with a tuple of the variable type, subtype ('None' if the
+        type is not  a collection type), the translated option description, and
+        the default value (or 'None') as the value.
+
+        Example:
+        { 'services' :
+          (list, str, u'SSSD Services to start', ['nss', 'pam']) }
+
+        === Errors ===
+        No Errors
+        """
+        options = self.list_options_with_mandatory()
+
+        # Filter out the mandatory field to maintain compatibility
+        # with older versions of the API
+        filtered_options = {}
+        for key in options.keys():
+            if options[key][2]:
+                filtered_options[key] = (options[key][0], options[key][1], options[key][3], options[key][4])
+
+        return filtered_options
+
     def set_option(self, optionname, value):
         """
         Set a service option to the specified value (or values)
@@ -633,19 +699,21 @@ class SSSDDomain(SSSDConfigObject):
         """
         self.active = bool(active)
 
-    def list_options(self):
+    def list_options_with_mandatory(self):
         """
-        List options available for the currently-configured providers.
+        List options for the currently-configured providers, including the
+        mandatory flag
 
         === Returns ===
         A dictionary of configurable options. This dictionary is keyed on the
         option name with a tuple of the variable type, subtype ('None' if the
-        type is not  a collection type), the translated option description, and
-        the default value (or 'None') as the value.
+        type is not  a collection type), whether it is mandatory, the
+        translated option description, and the default value (or 'None') as
+        the value.
 
         Example:
         { 'enumerate' :
-          (bool, None, u'Enable enumerating all users/groups', True) }
+          (bool, None, False, u'Enable enumerating all users/groups', True) }
 
         === Errors ===
         No errors
@@ -667,6 +735,61 @@ class SSSDDomain(SSSDConfigObject):
             options.update(schema_options)
         return options
 
+    def list_options(self):
+        """
+        List options available for the currently-configured providers.
+
+        === Returns ===
+        A dictionary of configurable options. This dictionary is keyed on the
+        option name with a tuple of the variable type, subtype ('None' if the
+        type is not  a collection type), the translated option description, and
+        the default value (or 'None') as the value.
+
+        Example:
+        { 'enumerate' :
+          (bool, None, u'Enable enumerating all users/groups', True) }
+
+        === Errors ===
+        No errors
+        """
+        options = self.list_options_with_mandatory()
+
+        # Filter out the mandatory field to maintain compatibility
+        # with older versions of the API
+        filtered_options = {}
+        for key in options.keys():
+            filtered_options[key] = (options[key][0], options[key][1], options[key][3], options[key][4])
+
+        return filtered_options
+
+    def list_mandatory_options(self):
+        """
+        List mandatory options for the currently-configured providers.
+
+        === Returns ===
+        A dictionary of configurable options. This dictionary is keyed on the
+        option name with a tuple of the variable type, subtype ('None' if the
+        type is not  a collection type), the translated option description, and
+        the default value (or 'None') as the value.
+
+        Example:
+        { 'enumerate' :
+          (bool, None, u'Enable enumerating all users/groups', True) }
+
+        === Errors ===
+        No errors
+        """
+        options = self.list_options_with_mandatory()
+
+        # Filter out the mandatory field to maintain compatibility
+        # with older versions of the API
+        filtered_options = {}
+        for key in options.keys():
+            if options[key][2]:
+                filtered_options[key] = (options[key][0], options[key][1], options[key][3], options[key][4])
+
+        return filtered_options
+
     def list_provider_options(self, provider, provider_type=None):
         """
         If provider_type is specified, list all options applicable to that
diff --git a/server/config/SSSDConfigTest.py b/server/config/SSSDConfigTest.py
index 1e79342..086dd58 100755
--- a/server/config/SSSDConfigTest.py
+++ b/server/config/SSSDConfigTest.py
@@ -241,10 +241,44 @@ class SSSDConfigTestSSSDService(unittest.TestCase):
                         "list_options is requiring a %s" %
                         options['reconnection_retries'][1])
 
-        self.assertTrue(options['reconnection_retries'][0] == int,
-                        "reconnection_retries should default to 2. " +
-                        "list_options specifies %d" %
-                        options['reconnection_retries'][3])
+        self.assertTrue(options['reconnection_retries'][3] == None,
+                        "reconnection_retries should have no default")
+
+        self.assertTrue(type(options['services']) == tuple,
+                        "Option values should be a tuple")
+
+        self.assertTrue(options['services'][0] == list,
+                        "services should require an list. " +
+                        "list_options is requiring a %s" %
+                        options['services'][0])
+
+        self.assertTrue(options['services'][1] == str,
+                        "services should require a subtype of str. " +
+                        "list_options is requiring a %s" %
+                        options['services'][1])
+
+    def testListMandatoryOptions(self):
+        service = SSSDConfig.SSSDService('sssd', self.schema)
+
+        options = service.list_mandatory_options()
+        control_list = [
+            'services',
+            'domains']
+
+        self.assertTrue(type(options) == dict,
+                        "Options should be a dictionary")
+
+        # Ensure that all of the expected defaults are there
+        for option in control_list:
+            self.assertTrue(option in options.keys(),
+                            "Option [%s] missing" %
+                            option)
+
+        # Ensure that there aren't any unexpected options listed
+        for option in options.keys():
+            self.assertTrue(option in control_list,
+                            'Option [%s] unexpectedly found' %
+                            option)
 
         self.assertTrue(type(options['services']) == tuple,
                         "Option values should be a tuple")
@@ -299,9 +333,7 @@ class SSSDConfigTestSSSDService(unittest.TestCase):
         options = service.get_all_options()
         control_list = [
             'config_file_version',
-            'services',
-            'debug_level',
-            'reconnection_retries']
+            'services']
 
         self.assertTrue(type(options) == dict,
                         "Options should be a dictionary")
@@ -322,8 +354,8 @@ class SSSDConfigTestSSSDService(unittest.TestCase):
         service = SSSDConfig.SSSDService('sssd', self.schema)
 
         # Positive test - Remove an option that exists
-        self.assertEqual(service.get_option('debug_level'), 0)
-        service.remove_option('debug_level')
+        self.assertEqual(service.get_option('services'), ['nss', 'pam'])
+        service.remove_option('services')
         self.assertRaises(SSSDConfig.NoOptionError, service.get_option, 'debug_level')
 
         # Positive test - Remove an option that doesn't exist
@@ -489,6 +521,103 @@ class SSSDConfigTestSSSDDomain(unittest.TestCase):
                             'Option [%s] unexpectedly found' %
                             option)
 
+    def testListMandatoryOptions(self):
+        domain = SSSDConfig.SSSDDomain('sssd', self.schema)
+
+        # First test default options
+        options = domain.list_mandatory_options()
+        control_list = [
+            'cache_credentials',
+            'min_id',
+            'id_provider',
+            'auth_provider',
+            'access_provider',
+            'chpass_provider']
+
+        self.assertTrue(type(options) == dict,
+                        "Options should be a dictionary")
+
+        # Ensure that all of the expected defaults are there
+        for option in control_list:
+            self.assertTrue(option in options.keys(),
+                            "Option [%s] missing" %
+                            option)
+
+        # Ensure that there aren't any unexpected options listed
+        for option in options.keys():
+            self.assertTrue(option in control_list,
+                            'Option [%s] unexpectedly found' %
+                            option)
+
+        # Add a provider and verify that the new options appear
+        domain.add_provider('local', 'id')
+        control_list.extend(
+            ['default_shell',
+             'base_directory'])
+
+        options = domain.list_mandatory_options()
+
+        self.assertTrue(type(options) == dict,
+                        "Options should be a dictionary")
+
+        # Ensure that all of the expected defaults are there
+        for option in control_list:
+            self.assertTrue(option in options.keys(),
+                            "Option [%s] missing" %
+                            option)
+
+        # Ensure that there aren't any unexpected options listed
+        for option in options.keys():
+            self.assertTrue(option in control_list,
+                            'Option [%s] unexpectedly found' %
+                            option)
+
+        # Add a provider that has global options and verify that
+        # The new options appear.
+        domain.add_provider('krb5', 'auth')
+
+        backup_list = control_list[:]
+        control_list.extend(
+            ['krb5_kdcip',
+             'krb5_realm'])
+
+        options = domain.list_mandatory_options()
+
+        self.assertTrue(type(options) == dict,
+                        "Options should be a dictionary")
+
+        # Ensure that all of the expected defaults are there
+        for option in control_list:
+            self.assertTrue(option in options.keys(),
+                            "Option [%s] missing" %
+                            option)
+
+        # Ensure that there aren't any unexpected options listed
+        for option in options.keys():
+            self.assertTrue(option in control_list,
+                            'Option [%s] unexpectedly found' %
+                            option)
+
+        # Remove the auth domain and verify that the options
+        # revert to the backup_list
+        domain.remove_provider('auth')
+        options = domain.list_mandatory_options()
+
+        self.assertTrue(type(options) == dict,
+                        "Options should be a dictionary")
+
+        # Ensure that all of the expected defaults are there
+        for option in backup_list:
+            self.assertTrue(option in options.keys(),
+                            "Option [%s] missing" %
+                            option)
+
+        # Ensure that there aren't any unexpected options listed
+        for option in options.keys():
+            self.assertTrue(option in backup_list,
+                            'Option [%s] unexpectedly found' %
+                            option)
+
     def testListProviders(self):
         domain = SSSDConfig.SSSDDomain('sssd', self.schema)
 
@@ -930,9 +1059,7 @@ class SSSDConfigTestSSSDConfig(unittest.TestCase):
 
         control_list = [
             'config_file_version',
-            'services',
-            'debug_level',
-            'reconnection_retries']
+            'services']
         for option in control_list:
             self.assertTrue(sssdconfig.has_option('sssd', option),
                             "Option [%s] missing from [sssd]" %
diff --git a/server/config/etc/sssd.api.conf b/server/config/etc/sssd.api.conf
index 0304042..f6ee812 100644
--- a/server/config/etc/sssd.api.conf
+++ b/server/config/etc/sssd.api.conf
@@ -1,57 +1,57 @@
 # Format:
-# option = type, subtype[, default]
+# option = type, subtype, mandatory[, default]
 
 [service]
 # Options available to all services
-debug_level = int, None
-debug_timestamps = bool, None
-debug_to_files = bool, None
-command = str, None
-reconnection_retries = int, None
+debug_level = int, None, false
+debug_timestamps = bool, None, false
+debug_to_files = bool, None, false
+command = str, None, false
+reconnection_retries = int, None, false
 
 [sssd]
 # Monitor service
-services = list, str, nss, pam
-domains = list, str
-timeout = int, None
-sbus_timeout = int, None
-re_expression = str, None
-full_name_format = str, None
+services = list, str, true, nss, pam
+domains = list, str, true
+timeout = int, None, false
+sbus_timeout = int, None, false
+re_expression = str, None, false
+full_name_format = str, None, false
 
 [nss]
 # Name service
-enum_cache_timeout = int, None
-entry_cache_no_wait_percentage = int, None
-entry_negative_timeout = int, None
-filter_users = list, str
-filter_groups = list, str
-filter_users_in_groups = bool, None
-pwfield = str, None
+enum_cache_timeout = int, None, false
+entry_cache_no_wait_percentage = int, None, false
+entry_negative_timeout = int, None, false
+filter_users = list, str, false
+filter_groups = list, str, false
+filter_users_in_groups = bool, None, false
+pwfield = str, None, false
 
 [pam]
 # Authentication service
-offline_credentials_expiration = int, None
+offline_credentials_expiration = int, None, false
 
 [provider]
 #Available provider types
-id_provider = str, None
-auth_provider = str, None
-access_provider = str, None
-chpass_provider = str, None
+id_provider = str, None, true
+auth_provider = str, None, true
+access_provider = str, None, true
+chpass_provider = str, None, true
 
 [domain]
 # Options available to all domains
-debug_level = int, None
-debug_timestamps = bool, None
-command = str, None
-min_id = int, None, 1000
-max_id = int, None
-timeout = int, None
-enumerate = bool, None, true
-cache_credentials = bool, None, false
-store_legacy_passwords = bool, None
-use_fully_qualified_names = bool, None
-entry_cache_timeout = int, None
+debug_level = int, None, false, 0
+debug_timestamps = bool, None, false
+command = str, None, false
+min_id = int, None, true, 1000
+max_id = int, None, false
+timeout = int, None, false
+enumerate = bool, None, false
+cache_credentials = bool, None, true, false
+store_legacy_passwords = bool, None, false
+use_fully_qualified_names = bool, None, false
+entry_cache_timeout = int, None, false
 
 # Special providers
 [provider/permit]
diff --git a/server/config/etc/sssd.api.d/sssd-ipa.conf b/server/config/etc/sssd.api.d/sssd-ipa.conf
index 7a6cd87..13a4553 100644
--- a/server/config/etc/sssd.api.d/sssd-ipa.conf
+++ b/server/config/etc/sssd.api.d/sssd-ipa.conf
@@ -1,76 +1,76 @@
 [provider/ipa]
-ipa_domain = str, None
-ipa_server = str, None
-ipa_hostname = str, None
-ldap_uri = str, None
-ldap_search_base = str, None
-ldap_schema = str, None
-ldap_default_bind_dn = str, None
-ldap_default_authtok_type = str, None
-ldap_default_authtok = str, None
-ldap_network_timeout = int, None
-ldap_opt_timeout = int, None
-ldap_offline_timeout = int, None
-ldap_tls_cacert = str, None
-ldap_tls_reqcert = str, None
-ldap_sasl_mech = str, None
-ldap_sasl_authid = str, None
-krb5_kdcip = str, None
-krb5_realm = str, None
-krb5_auth_timeout = int, None
-ldap_krb5_keytab = str, None
-ldap_krb5_init_creds = bool, None
-ldap_entry_usn = str, None
-ldap_rootdse_last_usn = str, None
+ipa_domain = str, None, true
+ipa_server = str, None, true
+ipa_hostname = str, None, true
+ldap_uri = str, None, false
+ldap_search_base = str, None, false
+ldap_schema = str, None, false
+ldap_default_bind_dn = str, None, false
+ldap_default_authtok_type = str, None, false
+ldap_default_authtok = str, None, false
+ldap_network_timeout = int, None, false
+ldap_opt_timeout = int, None, false
+ldap_offline_timeout = int, None, false
+ldap_tls_cacert = str, None, false
+ldap_tls_reqcert = str, None, false
+ldap_sasl_mech = str, None, false
+ldap_sasl_authid = str, None, false
+krb5_kdcip = str, None, false
+krb5_realm = str, None, false
+krb5_auth_timeout = int, None, false
+ldap_krb5_keytab = str, None, false
+ldap_krb5_init_creds = bool, None, false
+ldap_entry_usn = str, None, false
+ldap_rootdse_last_usn = str, None, false
 
 [provider/ipa/id]
-ldap_search_timeout = int, None
-ldap_enumeration_refresh_timeout = int, None
-ldap_purge_cache_timeout = int, None
-ldap_id_use_start_tls = bool, None
-ldap_user_search_base = str, None
-ldap_user_search_scope = str, None
-ldap_user_search_filter = str, None
-ldap_user_object_class = str, None
-ldap_user_name = str, None
-ldap_user_uid_number = str, None
-ldap_user_gid_number = str, None
-ldap_user_gecos = str, None
-ldap_user_homedir = str, None
-ldap_user_shell = str, None
-ldap_user_uuid = str, None
-ldap_user_principal = str, None
-ldap_user_fullname = str, None
-ldap_user_member_of = str, None
-ldap_user_modify_timestamp = str, None
-ldap_user_shadow_last_change = str, None
-ldap_user_shadow_min = str, None
-ldap_user_shadow_max = str, None
-ldap_user_shadow_warning = str, None
-ldap_user_shadow_inactive = str, None
-ldap_user_shadow_expire = str, None
-ldap_user_shadow_flag = str, None
-ldap_user_krb_last_pwd_change = str, None
-ldap_user_krb_password_expiration = str, None
-ldap_pwd_attribute = str, None
-ldap_group_search_base = str, None
-ldap_group_search_scope = str, None
-ldap_group_search_filter = str, None
-ldap_group_object_class = str, None
-ldap_group_name = str, None
-ldap_group_gid_number = str, None
-ldap_group_member = str, None
-ldap_group_uuid = str, None
-ldap_group_modify_timestamp = str, None
-ldap_force_upper_case_realm = bool, None
+ldap_search_timeout = int, None, false
+ldap_enumeration_refresh_timeout = int, None, false
+ldap_purge_cache_timeout = int, None, false
+ldap_id_use_start_tls = bool, None, false
+ldap_user_search_base = str, None, false
+ldap_user_search_scope = str, None, false
+ldap_user_search_filter = str, None, false
+ldap_user_object_class = str, None, false
+ldap_user_name = str, None, false
+ldap_user_uid_number = str, None, false
+ldap_user_gid_number = str, None, false
+ldap_user_gecos = str, None, false
+ldap_user_homedir = str, None, false
+ldap_user_shell = str, None, false
+ldap_user_uuid = str, None, false
+ldap_user_principal = str, None, false
+ldap_user_fullname = str, None, false
+ldap_user_member_of = str, None, false
+ldap_user_modify_timestamp = str, None, false
+ldap_user_shadow_last_change = str, None, false
+ldap_user_shadow_min = str, None, false
+ldap_user_shadow_max = str, None, false
+ldap_user_shadow_warning = str, None, false
+ldap_user_shadow_inactive = str, None, false
+ldap_user_shadow_expire = str, None, false
+ldap_user_shadow_flag = str, None, false
+ldap_user_krb_last_pwd_change = str, None, false
+ldap_user_krb_password_expiration = str, None, false
+ldap_pwd_attribute = str, None, false
+ldap_group_search_base = str, None, false
+ldap_group_search_scope = str, None, false
+ldap_group_search_filter = str, None, false
+ldap_group_object_class = str, None, false
+ldap_group_name = str, None, false
+ldap_group_gid_number = str, None, false
+ldap_group_member = str, None, false
+ldap_group_uuid = str, None, false
+ldap_group_modify_timestamp = str, None, false
+ldap_force_upper_case_realm = bool, None, false
 
 [provider/ipa/auth]
-krb5_ccachedir = str, None
-krb5_ccname_template = str, None
-krb5_keytab = str, None
-krb5_validate = bool, None
+krb5_ccachedir = str, None, false
+krb5_ccname_template = str, None, false
+krb5_keytab = str, None, false
+krb5_validate = bool, None, false
 
 [provider/ipa/access]
 
 [provider/ipa/chpass]
-krb5_changepw_principal = str, None
+krb5_changepw_principal = str, None, false
diff --git a/server/config/etc/sssd.api.d/sssd-krb5.conf b/server/config/etc/sssd.api.d/sssd-krb5.conf
index 860f8b8..85a5b14 100644
--- a/server/config/etc/sssd.api.d/sssd-krb5.conf
+++ b/server/config/etc/sssd.api.d/sssd-krb5.conf
@@ -1,15 +1,15 @@
 [provider/krb5]
-krb5_kdcip = str, None
-krb5_realm = str, None
-krb5_auth_timeout = int, None
+krb5_kdcip = str, None, true
+krb5_realm = str, None, true
+krb5_auth_timeout = int, None, false
 
 [provider/krb5/auth]
-krb5_ccachedir = str, None
-krb5_ccname_template = str, None
-krb5_keytab = str, None
-krb5_validate = bool, None
+krb5_ccachedir = str, None, false
+krb5_ccname_template = str, None, false
+krb5_keytab = str, None, false
+krb5_validate = bool, None, false
 
 [provider/krb5/access]
 
 [provider/krb5/chpass]
-krb5_changepw_principal = str, None
+krb5_changepw_principal = str, None, false
diff --git a/server/config/etc/sssd.api.d/sssd-ldap.conf b/server/config/etc/sssd.api.d/sssd-ldap.conf
index 0dc3065..ab6091b 100644
--- a/server/config/etc/sssd.api.d/sssd-ldap.conf
+++ b/server/config/etc/sssd.api.d/sssd-ldap.conf
@@ -1,67 +1,67 @@
 [provider/ldap]
-ldap_uri = str, None
-ldap_search_base = str, None
-ldap_schema = str, None, rfc2307
-ldap_default_bind_dn = str, None
-ldap_default_authtok_type = str, None
-ldap_default_authtok = str, None
-ldap_network_timeout = int, None
-ldap_opt_timeout = int, None
-ldap_offline_timeout = int, None
-ldap_tls_cacert = str, None
-ldap_tls_reqcert = str, None
-ldap_sasl_mech = str, None
-ldap_sasl_authid = str, None
-krb5_kdcip = str, None
-krb5_realm = str, None
-ldap_krb5_keytab = str, None
-ldap_krb5_init_creds = bool, None
-ldap_entry_usn = str, None
-ldap_rootdse_last_usn = str, None
+ldap_uri = str, None, true
+ldap_search_base = str, None, false
+ldap_schema = str, None, true, rfc2307
+ldap_default_bind_dn = str, None, false
+ldap_default_authtok_type = str, None, false
+ldap_default_authtok = str, None, false
+ldap_network_timeout = int, None, false
+ldap_opt_timeout = int, None, false
+ldap_offline_timeout = int, None, false
+ldap_tls_cacert = str, None, false
+ldap_tls_reqcert = str, None, false
+ldap_sasl_mech = str, None, false
+ldap_sasl_authid = str, None, false
+krb5_kdcip = str, None, false
+krb5_realm = str, None, false
+ldap_krb5_keytab = str, None, false
+ldap_krb5_init_creds = bool, None, false
+ldap_entry_usn = str, None, false
+ldap_rootdse_last_usn = str, None, false
 
 [provider/ldap/id]
-ldap_search_timeout = int, None
-ldap_enumeration_refresh_timeout = int, None
-ldap_purge_cache_timeout = int, None
-ldap_id_use_start_tls = bool, None, false
-ldap_user_search_base = str, None
-ldap_user_search_scope = str, None
-ldap_user_search_filter = str, None
-ldap_user_object_class = str, None
-ldap_user_name = str, None
-ldap_user_uid_number = str, None
-ldap_user_gid_number = str, None
-ldap_user_gecos = str, None
-ldap_user_homedir = str, None
-ldap_user_shell = str, None
-ldap_user_uuid = str, None
-ldap_user_principal = str, None
-ldap_user_fullname = str, None
-ldap_user_member_of = str, None
-ldap_user_modify_timestamp = str, None
-ldap_user_shadow_last_change = str, None
-ldap_user_shadow_min = str, None
-ldap_user_shadow_max = str, None
-ldap_user_shadow_warning = str, None
-ldap_user_shadow_inactive = str, None
-ldap_user_shadow_expire = str, None
-ldap_user_shadow_flag = str, None
-ldap_user_krb_last_pwd_change = str, None
-ldap_user_krb_password_expiration = str, None
-ldap_pwd_attribute = str, None
-ldap_group_search_base = str, None
-ldap_group_search_scope = str, None
-ldap_group_search_filter = str, None
-ldap_group_object_class = str, None
-ldap_group_name = str, None
-ldap_group_gid_number = str, None
-ldap_group_member = str, None
-ldap_group_uuid = str, None
-ldap_group_modify_timestamp = str, None
-ldap_force_upper_case_realm = bool, None
+ldap_search_timeout = int, None, false
+ldap_enumeration_refresh_timeout = int, None, false
+ldap_purge_cache_timeout = int, None, false
+ldap_id_use_start_tls = bool, None, true, false
+ldap_user_search_base = str, None, true
+ldap_user_search_scope = str, None, false
+ldap_user_search_filter = str, None, false
+ldap_user_object_class = str, None, false
+ldap_user_name = str, None, false
+ldap_user_uid_number = str, None, false
+ldap_user_gid_number = str, None, false
+ldap_user_gecos = str, None, false
+ldap_user_homedir = str, None, false
+ldap_user_shell = str, None, false
+ldap_user_uuid = str, None, false
+ldap_user_principal = str, None, false
+ldap_user_fullname = str, None, false
+ldap_user_member_of = str, None, false
+ldap_user_modify_timestamp = str, None, false
+ldap_user_shadow_last_change = str, None, false
+ldap_user_shadow_min = str, None, false
+ldap_user_shadow_max = str, None, false
+ldap_user_shadow_warning = str, None, false
+ldap_user_shadow_inactive = str, None, false
+ldap_user_shadow_expire = str, None, false
+ldap_user_shadow_flag = str, None, false
+ldap_user_krb_last_pwd_change = str, None, false
+ldap_user_krb_password_expiration = str, None, false
+ldap_pwd_attribute = str, None, false
+ldap_group_search_base = str, None, true
+ldap_group_search_scope = str, None, false
+ldap_group_search_filter = str, None, false
+ldap_group_object_class = str, None, false
+ldap_group_name = str, None, false
+ldap_group_gid_number = str, None, false
+ldap_group_member = str, None, false
+ldap_group_uuid = str, None, false
+ldap_group_modify_timestamp = str, None, false
+ldap_force_upper_case_realm = bool, None, false
 
 [provider/ldap/auth]
-ldap_pwd_policy = str, None
+ldap_pwd_policy = str, None, false
 
 [provider/ldap/chpass]
 
diff --git a/server/config/etc/sssd.api.d/sssd-local.conf b/server/config/etc/sssd.api.d/sssd-local.conf
index 44e2522..0686f08 100644
--- a/server/config/etc/sssd.api.d/sssd-local.conf
+++ b/server/config/etc/sssd.api.d/sssd-local.conf
@@ -1,8 +1,8 @@
 [provider/local]
 
 [provider/local/id]
-default_shell = str, None, /bin/bash
-base_directory = str, None, /home
+default_shell = str, None, true, /bin/bash
+base_directory = str, None, true, /home
 
 [provider/local/auth]
 
diff --git a/server/config/etc/sssd.api.d/sssd-proxy.conf b/server/config/etc/sssd.api.d/sssd-proxy.conf
index cc34eea..7ecf6b3 100644
--- a/server/config/etc/sssd.api.d/sssd-proxy.conf
+++ b/server/config/etc/sssd.api.d/sssd-proxy.conf
@@ -1,7 +1,7 @@
 [provider/proxy]
 
 [provider/proxy/id]
-proxy_lib_name = str, None
+proxy_lib_name = str, None, true
 
 [provider/proxy/auth]
-proxy_pam_target = str, None
+proxy_pam_target = str, None, true
-- 
1.6.5.2

