From b94b578fac8f94d42fd6fb691438d2dbe5248309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C5=BDidek?= Date: Wed, 31 May 2017 14:21:02 +0200 Subject: [PATCH 149/152] VALIDATORS: Detect inherit_from in normal domain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch adds new sssd specific validator. In the future we can add more checks in it, but currently it only checks if the option inherit_from is used on normal domain and reports error if it is. Resolves: https://pagure.io/SSSD/sssd/issue/3356 Reviewed-by: Lukáš Slebodník --- src/config/cfg_rules.ini | 3 ++ src/tests/cmocka/test_config_check.c | 22 +++++++++++++++ src/util/sss_ini.c | 53 +++++++++++++++++++++++++++++++++++- 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/config/cfg_rules.ini b/src/config/cfg_rules.ini index 2c8c0cb98ed039c374c827775798f61369c1521e..744446478e5d5489cd86d8e15ce8e178cf5e3a91 100644 --- a/src/config/cfg_rules.ini +++ b/src/config/cfg_rules.ini @@ -711,3 +711,6 @@ option = ad_server option = ad_backup_server option = ad_site option = use_fully_qualified_names + +[rule/sssd_checks] +validator = sssd_checks diff --git a/src/tests/cmocka/test_config_check.c b/src/tests/cmocka/test_config_check.c index 8fc0b01f3ef3fe03152efd979a3e96c21ba567cc..bab3226c004fb9495471af7c7d3f6861552d8a86 100644 --- a/src/tests/cmocka/test_config_check.c +++ b/src/tests/cmocka/test_config_check.c @@ -217,6 +217,27 @@ void config_check_test_good_sections(void **state) config_check_test_common(cfg_str, 0, expected_errors); } +void config_check_test_inherit_from_in_normal_dom(void **state) +{ + char cfg_str[] = "[domain/A.test]\n" + "inherit_from = domain\n"; + const char *expected_errors[] = { + "[rule/sssd_checks]: Attribute 'inherit_from' is not allowed in " + "section 'domain/A.test'. Check for typos.", + }; + + config_check_test_common(cfg_str, 1, expected_errors); +} + +void config_check_test_inherit_from_in_app_dom(void **state) +{ + char cfg_str[] = "[application/A.test]\n" + "inherit_from = domain\n"; + const char *expected_errors[] = { NULL }; + + config_check_test_common(cfg_str, 0, expected_errors); +} + int main(int argc, const char *argv[]) { poptContext pc; @@ -235,6 +256,7 @@ int main(int argc, const char *argv[]) cmocka_unit_test(config_check_test_bad_pac_option_name), cmocka_unit_test(config_check_test_bad_ifp_option_name), cmocka_unit_test(config_check_test_good_sections), + cmocka_unit_test(config_check_test_inherit_from_in_normal_dom), }; /* Set debug level to invalid value so we can decide if -d 0 was used. */ diff --git a/src/util/sss_ini.c b/src/util/sss_ini.c index e56006c05555d6e0c5e726e83771abce5a72b139..175a4cfaba7ea964aee174e928d5e3c1e81de638 100644 --- a/src/util/sss_ini.c +++ b/src/util/sss_ini.c @@ -561,12 +561,63 @@ error: } #ifdef HAVE_LIBINI_CONFIG_V1_3 +/* Here we can put custom SSSD specific checks that can not be implemented + * using libini validators */ +static int custom_sssd_checks(const char *rule_name, + struct ini_cfgobj *rules_obj, + struct ini_cfgobj *config_obj, + struct ini_errobj *errobj, + void **data) +{ + char **cfg_sections = NULL; + int num_cfg_sections; + struct value_obj *vo = NULL; + char dom_prefix[] = "domain/"; + int ret; + + /* Get all sections in configuration */ + cfg_sections = ini_get_section_list(config_obj, &num_cfg_sections, &ret); + if (ret != EOK) { + goto done; + } + + /* Check if a normal domain section (not application domains) has option + * inherit_from and report error if it does */ + for (int i = 0; i < num_cfg_sections; i++) { + if (strncmp(dom_prefix, cfg_sections[i], strlen(dom_prefix)) == 0) { + ret = ini_get_config_valueobj(cfg_sections[i], + "inherit_from", + config_obj, + INI_GET_NEXT_VALUE, + &vo); + if (vo != NULL) { + ret = ini_errobj_add_msg(errobj, + "Attribute 'inherit_from' is not " + "allowed in section '%s'. Check for " + "typos.", + cfg_sections[i]); + if (ret != EOK) { + goto done; + } + } + } + } + + ret = EOK; +done: + ini_free_section_list(cfg_sections); + return EOK; +} + static int sss_ini_call_validators_errobj(struct sss_ini_initdata *data, const char *rules_path, struct ini_errobj *errobj) { int ret; struct ini_cfgobj *rules_cfgobj = NULL; + struct ini_validator custom_sssd = { "sssd_checks", custom_sssd_checks, + NULL }; + struct ini_validator *sss_validators[] = { &custom_sssd, NULL }; ret = ini_rules_read_from_file(rules_path, &rules_cfgobj); if (ret != EOK) { @@ -575,7 +626,7 @@ static int sss_ini_call_validators_errobj(struct sss_ini_initdata *data, goto done; } - ret = ini_rules_check(rules_cfgobj, data->sssd_config, NULL, errobj); + ret = ini_rules_check(rules_cfgobj, data->sssd_config, sss_validators, errobj); if (ret != EOK) { DEBUG(SSSDBG_FATAL_FAILURE, "ini_rules_check failed %d [%s]\n", ret, strerror(ret)); -- 2.9.4