dp_targets.c revision d3dee2a07f1a8ee9ae6f94e149ced754ef76c248
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher/*
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher Authors:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher Pavel Březina <pbrezina@redhat.com>
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher Copyright (C) 2016 Red Hat
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher This program is free software; you can redistribute it and/or modify
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher it under the terms of the GNU General Public License as published by
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher the Free Software Foundation; either version 3 of the License, or
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher (at your option) any later version.
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher This program is distributed in the hope that it will be useful,
ea929f1b022fc2cb77dec89b0e12accef983ec85Jakub Hrozek but WITHOUT ANY WARRANTY; without even the implied warranty of
bf9abef629707167d39fcc92ec9c18a6244b27b8Jakub Hrozek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bf9abef629707167d39fcc92ec9c18a6244b27b8Jakub Hrozek GNU General Public License for more details.
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher You should have received a copy of the GNU General Public License
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher along with this program. If not, see <http://www.gnu.org/licenses/>.
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher*/
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
7a14e8f66c0e932fe2954d792614a3b61d444bd1Jakub Hrozek#include <talloc.h>
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher#include <dlfcn.h>
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher#include "config.h"
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher#include "providers/data_provider/dp.h"
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek#include "providers/data_provider/dp_private.h"
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek#include "providers/data_provider/dp_builtin.h"
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek#include "providers/backend.h"
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek#include "util/util.h"
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher#define DP_TARGET_INIT_FN "sssm_%s_%s_init"
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher#define DP_PROVIDER_OPT "%s_provider"
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher#define DP_ACCESS_PERMIT "permit"
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher#define DP_ACCESS_DENY "deny"
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher#define DP_NO_PROVIDER "none"
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagherbool _dp_target_enabled(struct data_provider *provider,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher const char *module_name,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ...)
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher{
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher struct dp_target *target;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher enum dp_targets type;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher va_list ap;
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek bool bret;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (provider == NULL || provider->targets == NULL) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return false;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher bret = false;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher va_start(ap, module_name);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher while ((type = va_arg(ap, enum dp_targets)) != DP_TARGET_SENTINEL) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher target = provider->targets[type];
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (target == NULL || target->module_name == NULL) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DEBUG(SSSDBG_MINOR_FAILURE, "Uninitialized target %s\n",
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher dp_target_to_string(type));
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher continue;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (module_name == NULL) {
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher bret = true;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher goto done;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (strcmp(target->module_name, module_name) == 0) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher bret = true;
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek goto done;
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek }
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek }
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozekdone:
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher va_end(ap);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return bret;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher}
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagherstruct dp_module *dp_target_module(struct data_provider *provider,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher enum dp_targets target)
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher{
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (provider == NULL || provider->targets == NULL) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (target >= DP_TARGET_SENTINEL || provider->targets[target] == NULL) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return provider->targets[target]->module;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher}
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek
ea929f1b022fc2cb77dec89b0e12accef983ec85Jakub Hrozekconst char *dp_target_to_string(enum dp_targets target)
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher{
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher switch (target) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher case DPT_ID:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return "id";
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher case DPT_AUTH:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return "auth";
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher case DPT_ACCESS:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return "access";
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher case DPT_CHPASS:
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher return "chpass";
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher case DPT_SUDO:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return "sudo";
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher case DPT_AUTOFS:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return "autofs";
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher case DPT_SELINUX:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return "selinux";
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher case DPT_HOSTID:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return "hostid";
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher case DPT_SUBDOMAINS:
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher return "subdomains";
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher case DP_TARGET_SENTINEL:
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher return NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher}
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagherbool dp_target_initialized(struct dp_target **targets, enum dp_targets type)
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher{
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (targets == NULL || targets[type] == NULL) {
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher return false;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return targets[type]->initialized;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher}
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagherstatic bool dp_target_sudo_enabled(struct be_ctx *be_ctx)
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher{
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher TALLOC_CTX *tmp_ctx;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher char **services;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher char *module;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher bool responder_enabled;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher bool enable;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher errno_t ret;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher int i;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher /* Do not disable it in case of error. */
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher enable = true;
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher tmp_ctx = talloc_new(NULL);
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (tmp_ctx == NULL) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return enable;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = confdb_get_string_as_list(be_ctx->cdb, tmp_ctx,
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher CONFDB_MONITOR_CONF_ENTRY,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher CONFDB_MONITOR_ACTIVE_SERVICES, &services);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (ret != EOK) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DEBUG(SSSDBG_FATAL_FAILURE, "Unable to read from confdb [%d]: %s\n",
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek ret, sss_strerror(ret));
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher goto done;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher responder_enabled = false;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher for (i = 0; services[i] != NULL; i++) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (strcmp(services[i], "sudo") == 0) {
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher responder_enabled = true;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher break;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = confdb_get_string(be_ctx->cdb, tmp_ctx, be_ctx->conf_path,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher CONFDB_DOMAIN_SUDO_PROVIDER, NULL, &module);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (ret != EOK) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DEBUG(SSSDBG_FATAL_FAILURE, "Unable to read from confdb [%d]: %s\n",
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret, sss_strerror(ret));
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher goto done;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher }
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (!responder_enabled) {
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (module == NULL) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, "SUDO is not listed in services, "
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher "disabling SUDO module.\n");
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher enable = false;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher goto done;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher } else if (strcmp(module, DP_NO_PROVIDER) != 0) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DEBUG(SSSDBG_MINOR_FAILURE, "SUDO provider is set, but it is not "
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher "listed in active services. SUDO support will not work!\n");
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher enable = true;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher goto done;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher }
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher }
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher enable = true;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagherdone:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher talloc_free(tmp_ctx);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return enable;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher}
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagherstatic const char *dp_target_module_name(struct dp_target **targets,
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher enum dp_targets type)
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher{
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (targets[type] == NULL) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return targets[type]->module_name;
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher}
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagherstatic const char *dp_target_default_module(struct dp_target **targets,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher enum dp_targets target)
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher{
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher switch (target) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher case DPT_ID:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher case DPT_ACCESS:
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher return "permit";
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher case DPT_CHPASS:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return dp_target_module_name(targets, DPT_AUTH);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher case DP_TARGET_SENTINEL:
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher return NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher default:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return dp_target_module_name(targets, DPT_ID);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher}
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagherstatic errno_t dp_target_run_constructor(struct dp_target *target,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher struct be_ctx *be_ctx)
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher{
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher char *fn_name = NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher dp_target_init_fn fn;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher char *error;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher errno_t ret;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher fn_name = talloc_asprintf(target, DP_TARGET_INIT_FN,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher target->module->name, target->name);
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (fn_name == NULL) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf() failed\n");
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return ENOMEM;
ea929f1b022fc2cb77dec89b0e12accef983ec85Jakub Hrozek }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher dlerror(); /* clear any error */
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher fn = (dp_target_init_fn)dlsym(target->module->libhandle, fn_name);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (fn != NULL) {
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, "Executing target [%s] constructor\n",
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher target->name);
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = fn(target, be_ctx, target->module->module_data, target->methods);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (ret != EOK) {
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher DEBUG(SSSDBG_FATAL_FAILURE, "Target [%s] constructor failed "
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher "[%d]: %s\n", target->name, ret, sss_strerror(ret));
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher goto done;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher } else {
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher error = dlerror();
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (error == NULL || !target->explicitly_configured) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher /* Not found. */
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = ELIBBAD;
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher goto done;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher } else {
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher /* Error. */
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DEBUG(SSSDBG_FATAL_FAILURE, "Unable to load target [%s] "
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher "constructor: %s\n", target->name, error);
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher ret = ELIBBAD;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher goto done;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher target->initialized = true;
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher ret = EOK;
056302a92862fda16351d7192600746746f38e5dStephen Gallagher
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagherdone:
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher talloc_free(fn_name);
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher return ret;
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher}
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
bf9abef629707167d39fcc92ec9c18a6244b27b8Jakub Hrozekstatic errno_t dp_target_special(struct be_ctx *be_ctx,
bf9abef629707167d39fcc92ec9c18a6244b27b8Jakub Hrozek struct dp_target *target,
bf9abef629707167d39fcc92ec9c18a6244b27b8Jakub Hrozek const char *module_name)
bf9abef629707167d39fcc92ec9c18a6244b27b8Jakub Hrozek{
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (strcasecmp(module_name, DP_NO_PROVIDER) == 0) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, "Target [%s] is explicitly disabled.\n",
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher target->name);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher target->initialized = false;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher target->module = NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return EOK;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (target->target == DPT_ACCESS) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (strcmp(module_name, DP_ACCESS_PERMIT) == 0) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher dp_set_method(target->methods, DPM_ACCESS_HANDLER,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher dp_access_permit_handler_send, dp_access_permit_handler_recv, NULL,
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher void, struct pam_data, struct pam_data *);
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher target->module = NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher target->initialized = true;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return EOK;
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (strcmp(module_name, DP_ACCESS_DENY) == 0) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher dp_set_method(target->methods, DPM_ACCESS_HANDLER,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher dp_access_deny_handler_send, dp_access_deny_handler_recv, NULL,
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher void, struct pam_data, struct pam_data *);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher target->module = NULL;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher target->initialized = true;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return EOK;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (target->target == DPT_SUDO) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (dp_target_sudo_enabled(be_ctx)) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return EAGAIN;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher } else {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher target->module = NULL;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher target->initialized = false;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher return EOK;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher
ea929f1b022fc2cb77dec89b0e12accef983ec85Jakub Hrozek return EAGAIN;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher}
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagherstatic errno_t dp_target_init(struct be_ctx *be_ctx,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher struct data_provider *provider,
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher struct dp_module **modules,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher struct dp_target *target)
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher{
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher errno_t ret;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, "Initializing target [%s] with module [%s]\n",
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher target->name, target->module_name);
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher /* We have already name, module name and target set. We just load
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher * the module and initialize it. */
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher target->methods = talloc_zero_array(target, struct dp_method,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DP_METHOD_SENTINEL + 1);
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher if (target->methods == NULL) {
ea929f1b022fc2cb77dec89b0e12accef983ec85Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero_array() failed\n");
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = ENOMEM;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher goto done;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher /* Handle special cases that do not require opening a module. */
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = dp_target_special(be_ctx, target, target->module_name);
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher if (ret == EOK || ret != EAGAIN) {
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher goto done;
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher /* Load module first. Memory context is modules, not target here. */
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher target->module = dp_load_module(modules, be_ctx, provider, modules,
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher target->module_name);
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher if (target->module == NULL) {
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher DEBUG(SSSDBG_FATAL_FAILURE, "Unable to load module %s\n",
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher target->module_name);
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher ret = ELIBBAD;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher goto done;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher /* Run constructor. */
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher ret = dp_target_run_constructor(target, be_ctx);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (!target->explicitly_configured && (ret == ELIBBAD || ret == ENOTSUP)) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher /* Target not found but it wasn't explicitly
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher * configured so we shall just continue. */
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, "Target [%s] is not supported by "
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher "module [%s].\n", target->name, target->module_name);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = EOK;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher goto done;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher } else if (ret != EOK) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher goto done;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher }
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher ret = EOK;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagherdone:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (ret != EOK) {
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher talloc_free(target->methods);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return ret;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher}
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagherstatic char *dp_get_module_name(TALLOC_CTX *mem_ctx,
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher struct confdb_ctx *confdb_ctx,
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher const char *conf_path,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher struct dp_target **targets,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher enum dp_targets type,
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher bool *_is_default)
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher{
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher const char *name;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher const char *default_module;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher char *module;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher char *option;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher errno_t ret;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher name = dp_target_to_string(type);
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher if (name == NULL) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher option = talloc_asprintf(mem_ctx, DP_PROVIDER_OPT, name);
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (option == NULL) {
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf() failed\n");
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = confdb_get_string(confdb_ctx, mem_ctx, conf_path,
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher option, NULL, &module);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher talloc_free(option);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (ret != EOK) {
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, "Unable to read provider value "
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher "[%d]: %s\n", ret, sss_strerror(ret));
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return NULL;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (module != NULL) {
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher *_is_default = false;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return module;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher *_is_default = true;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher default_module = dp_target_default_module(targets, type);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return talloc_strdup(mem_ctx, default_module);
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher}
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagherstatic errno_t dp_load_configuration(struct confdb_ctx *cdb,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher const char *conf_path,
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher struct dp_target **targets)
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher{
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher enum dp_targets type;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher const char *name;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher bool is_default;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher char *module;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher errno_t ret;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher for (type = 0; type < DP_TARGET_SENTINEL; type++) {
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher name = dp_target_to_string(type);
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher if (name == NULL) {
486237ee009f1d84fc4c85665dce80ade76f7079Stephen Gallagher ret = ERR_INTERNAL;
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher goto done;
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher }
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher module = dp_get_module_name(NULL, cdb, conf_path, targets,
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher type, &is_default);
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher if (module == NULL) {
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher DEBUG(SSSDBG_CONF_SETTINGS, "No provider is specified for"
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher " [%s]\n", name);
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher continue;
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher } else {
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher DEBUG(SSSDBG_CONF_SETTINGS, "Using [%s] provider for [%s]\n",
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher module, name);
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek }
7a14e8f66c0e932fe2954d792614a3b61d444bd1Jakub Hrozek
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher targets[type]->explicitly_configured = is_default == false;
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher targets[type]->name = name;
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher targets[type]->target = type;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher targets[type]->module_name = talloc_steal(targets[type], module);
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = EOK;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagherdone:
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return ret;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher}
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagherstatic errno_t dp_load_targets(struct be_ctx *be_ctx,
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher struct data_provider *provider,
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher struct dp_target **targets,
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher struct dp_module **modules)
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher{
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher enum dp_targets type;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher errno_t ret;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher /* We load the configuration first and store module name to each target.
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher * This way we ensure that we have this information available during
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher * module initialization. */
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = dp_load_configuration(be_ctx->cdb, be_ctx->conf_path, targets);
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher if (ret != EOK) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, "Unable to load DP configuration "
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher "[%d]: %s\n", ret, sss_strerror(ret));
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher goto done;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher for (type = 0; type < DP_TARGET_SENTINEL; type++) {
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher ret = dp_target_init(be_ctx, provider, modules, targets[type]);
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher if (ret != EOK) {
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, "Unable to load target [%s] "
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher "[%d]: %s.\n", targets[type]->name, ret, sss_strerror(ret));
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = ERR_INTERNAL;
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher goto done;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = EOK;
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagherdone:
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher return ret;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher}
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallaghererrno_t dp_init_targets(TALLOC_CTX *mem_ctx,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher struct be_ctx *be_ctx,
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher struct data_provider *provider,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher struct dp_module **modules)
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher{
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher struct dp_target **targets;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher enum dp_targets type;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher errno_t ret;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher /* Even though we know the exact number of targets we will allocate
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher * them all dynamically so we can have correct talloc hierarchy where
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher * all private data are attached to the target they belong to. */
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher targets = talloc_zero_array(mem_ctx, struct dp_target *,
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher DP_TARGET_SENTINEL + 1);
ea929f1b022fc2cb77dec89b0e12accef983ec85Jakub Hrozek if (targets == NULL) {
ea929f1b022fc2cb77dec89b0e12accef983ec85Jakub Hrozek ret = ENOMEM;
ea929f1b022fc2cb77dec89b0e12accef983ec85Jakub Hrozek goto done;
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher for (type = 0; type != DP_TARGET_SENTINEL; type++) {
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher targets[type] = talloc_zero(targets, struct dp_target);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher if (targets[type] == NULL) {
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher ret = ENOMEM;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher goto done;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher /* We want this to be already available. */
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher provider->targets = targets;
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher ret = dp_load_targets(be_ctx, provider, targets, modules);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
ea929f1b022fc2cb77dec89b0e12accef983ec85Jakub Hrozekdone:
7a14e8f66c0e932fe2954d792614a3b61d444bd1Jakub Hrozek if (ret != EOK) {
7a14e8f66c0e932fe2954d792614a3b61d444bd1Jakub Hrozek provider->targets = NULL;
64a424ec1b268427822c646f7781e26e56c197f6Jakub Hrozek talloc_free(targets);
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher }
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher return ret;
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher}
dd3ba5c5b7d2a9d109963ae9e6c94fff34872221Stephen Gallagher