9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio/*
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio Authors:
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio Fabiano Fidêncio <fidencio@redhat.com>
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio Copyright (C) 2017 Red Hat
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio This program is free software; you can redistribute it and/or modify
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio it under the terms of the GNU General Public License as published by
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio the Free Software Foundation; either version 3 of the License, or
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio (at your option) any later version.
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio This program is distributed in the hope that it will be useful,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio but WITHOUT ANY WARRANTY; without even the implied warranty of
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio GNU General Public License for more details.
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio You should have received a copy of the GNU General Public License
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio along with this program. If not, see <http://www.gnu.org/licenses/>.
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio*/
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio#include "config.h"
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio#include <popt.h>
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio#include <stdio.h>
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio#include <ini_configobj.h>
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio#include "util/util.h"
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio#include "confdb/confdb.h"
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidênciostatic errno_t check_socket_activated_responder(const char *responder)
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio{
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio errno_t ret;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio struct ini_cfgfile *file_ctx = NULL;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio struct ini_cfgobj *ini_config = NULL;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio struct ini_cfgobj *modified_ini_config = NULL;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio struct value_obj *vobj = NULL;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio struct access_check snip_check;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio const char *services;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio const char *patterns[] = { "^[^\\.].*\\.conf$", NULL };
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio const char *sections[] = { "sssd", NULL };
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio const char *str;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio TALLOC_CTX *tmp_ctx;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio tmp_ctx = talloc_new(NULL);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (tmp_ctx == NULL) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio return ENOMEM;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = ini_config_create(&ini_config);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (ret != 0) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "ini_config_create() failed [%d][%s]\n",
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret, sss_strerror(ret));
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = ini_config_file_open(SSSD_CONFIG_FILE, 0, &file_ctx);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (ret != 0) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "ini_config_file_open() failed [%d][%s]\n",
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret, sss_strerror(ret));
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio /* Using the same flags used by sss_ini_get_config(), which is used to
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio * load the config file ... */
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = ini_config_parse(file_ctx,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio INI_STOP_ON_ANY,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio INI_MV1S_OVERWRITE,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio INI_PARSE_NOWRAP,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ini_config);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (ret != 0) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "ini_config_parse() failed [%d][%s]\n",
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret, sss_strerror(ret));
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio /* And also check the snippets ... */
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio snip_check.flags = INI_ACCESS_CHECK_MODE |
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio INI_ACCESS_CHECK_UID |
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio INI_ACCESS_CHECK_GID;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio snip_check.uid = 0; /* owned by root */
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio snip_check.gid = 0; /* owned by root */
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio snip_check.mode = S_IRUSR; /* r**------ */
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio snip_check.mask = ALLPERMS & ~(S_IWUSR | S_IXUSR);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = ini_config_augment(ini_config,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio CONFDB_DEFAULT_CONFIG_DIR,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio patterns,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio sections,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio &snip_check,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio INI_STOP_ON_ANY,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio INI_MV1S_OVERWRITE,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio INI_PARSE_NOWRAP,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio INI_MV2S_OVERWRITE,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio &modified_ini_config,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio NULL,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio NULL);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (ret != EOK) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "ini_config_augment failed [%d][%s]\n",
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret, sss_strerror(ret));
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (modified_ini_config != NULL) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ini_config_destroy(ini_config);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ini_config = modified_ini_config;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = ini_get_config_valueobj("sssd", "services", ini_config,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio INI_GET_FIRST_VALUE, &vobj);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (ret != EOK) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio "ini_get_config_valueobj() failed [%d][%s]\n",
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret, sss_strerror(ret));
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio /* In case there's no services' line at all, just return EOK. */
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (vobj == NULL) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = EOK;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio services = ini_get_string_config_value(vobj, &ret);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (ret != EOK) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio "ini_get_string_config_value() failed [%d][%s]\n",
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret, sss_strerror(ret));
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio str = strstr(services, responder);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (str != NULL) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = EEXIST;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = EOK;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidênciodone:
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ini_config_file_destroy(file_ctx);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ini_config_destroy(ini_config);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio talloc_free(tmp_ctx);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio return ret;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio}
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncioint main(int argc, const char *argv[])
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio{
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio int ret;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio int opt;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio poptContext pc;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio char *responder = NULL;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio struct poptOption long_options[] = {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio POPT_AUTOHELP
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio {"responders", 'r', POPT_ARG_STRING, &responder, 0,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio _("The name of the responder to be checked"), NULL},
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio POPT_TABLEEND
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio };
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio pc = poptGetContext(argv[0], argc, argv, long_options, 0);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio while ((opt = poptGetNextOpt(pc)) != -1) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio switch (opt) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio default:
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio fprintf(stderr, "\nInvalid option %s: %s\n\n",
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio poptBadOption(pc, 0), poptStrerror(opt));
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio poptPrintUsage(pc, stderr, 0);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = 1;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (responder == NULL) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio poptPrintUsage(pc, stderr, 0);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = 1;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = check_socket_activated_responder(responder);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio if (ret != EOK) {
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio DEBUG(SSSDBG_DEFAULT,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio "Misconfiguration found for the %s responder.\n"
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio "The %s responder has been configured to be socket-activated "
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio "but it's still mentioned in the services' line in %s.\n"
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio "Please, consider either adjusting your services' line in %s "
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio "or disabling the %s's socket by calling:\n"
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio "\"systemctl disable sssd-%s.socket\"",
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio responder, responder, SSSD_CONFIG_FILE, SSSD_CONFIG_FILE,
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio responder, responder);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio goto done;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio }
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio ret = EOK;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidênciodone:
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio poptFreeContext(pc);
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio return ret;
9c0c83eecf963416effee67dab55711234373fdeFabiano Fidêncio}