dp_targets.c revision e98d085b529e0ae5e07a717ce3b30f3943be0ee0
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Pavel Březina <pbrezina@redhat.com>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Copyright (C) 2016 Red Hat
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster This program is free software; you can redistribute it and/or modify
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster it under the terms of the GNU General Public License as published by
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster the Free Software Foundation; either version 3 of the License, or
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (at your option) any later version.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster This program is distributed in the hope that it will be useful,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster but WITHOUT ANY WARRANTY; without even the implied warranty of
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster GNU General Public License for more details.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster You should have received a copy of the GNU General Public License
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster along with this program. If not, see <http://www.gnu.org/licenses/>.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterbool _dp_target_enabled(struct data_provider *provider,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (provider == NULL || provider->targets == NULL) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
03796c5de88f33fc11651a032f0889c6c37d08f5Peter Major while ((type = va_arg(ap, enum dp_targets)) != DP_TARGET_SENTINEL) {
03796c5de88f33fc11651a032f0889c6c37d08f5Peter Major if (target == NULL || target->module_name == NULL) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DEBUG(SSSDBG_MINOR_FAILURE, "Uninitialized target %s\n",
03796c5de88f33fc11651a032f0889c6c37d08f5Peter Major if (strcmp(target->module_name, module_name) == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstruct dp_module *dp_target_module(struct data_provider *provider,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (provider == NULL || provider->targets == NULL) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (target >= DP_TARGET_SENTINEL || provider->targets[target] == NULL) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostervoid *dp_get_module_data(struct dp_module *dp_module)
03796c5de88f33fc11651a032f0889c6c37d08f5Peter Major return dp_module == NULL ? NULL : dp_module->module_data;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterconst char *dp_target_to_string(enum dp_targets target)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return "id";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return "auth";
03796c5de88f33fc11651a032f0889c6c37d08f5Peter Major return "access";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return "chpass";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return "sudo";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return "autofs";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return "selinux";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return "hostid";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return "subdomains";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterbool dp_target_initialized(struct dp_target **targets, enum dp_targets type)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (targets == NULL || targets[type] == NULL) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic const char *dp_target_module_name(struct dp_target **targets,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic const char *dp_target_default_module(struct dp_target **targets,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return "permit";
07856bf23b706ef4e3654388d9ca26a720e0ad6aPeter Major return dp_target_module_name(targets, DPT_AUTH);
07856bf23b706ef4e3654388d9ca26a720e0ad6aPeter Majorstatic errno_t dp_target_run_constructor(struct dp_target *target,
07856bf23b706ef4e3654388d9ca26a720e0ad6aPeter Major fn_name = talloc_asprintf(target, DP_TARGET_INIT_FN,
07856bf23b706ef4e3654388d9ca26a720e0ad6aPeter Major DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf() failed\n");
07856bf23b706ef4e3654388d9ca26a720e0ad6aPeter Major fn = (dp_target_init_fn)dlsym(target->module->libhandle, fn_name);
03796c5de88f33fc11651a032f0889c6c37d08f5Peter Major DEBUG(SSSDBG_TRACE_FUNC, "Executing target [%s] constructor\n",
03796c5de88f33fc11651a032f0889c6c37d08f5Peter Major ret = fn(target, be_ctx, target->module->module_data, target->methods);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DEBUG(SSSDBG_FATAL_FAILURE, "Target [%s] constructor failed "
03796c5de88f33fc11651a032f0889c6c37d08f5Peter Major "[%d]: %s\n", target->name, ret, sss_strerror(ret));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (error == NULL || !target->explicitly_configured) {
03796c5de88f33fc11651a032f0889c6c37d08f5Peter Major /* Not found. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* Error. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DEBUG(SSSDBG_FATAL_FAILURE, "Unable to load target [%s] "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic errno_t dp_target_special(struct be_ctx *be_ctx,
03796c5de88f33fc11651a032f0889c6c37d08f5Peter Major if (strcasecmp(module_name, DP_NO_PROVIDER) == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DEBUG(SSSDBG_TRACE_FUNC, "Target [%s] is explicitly disabled.\n",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (strcmp(module_name, DP_ACCESS_PERMIT) == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster dp_set_method(target->methods, DPM_ACCESS_HANDLER,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster dp_access_permit_handler_send, dp_access_permit_handler_recv, NULL,
return EOK;
return EOK;
return EAGAIN;
goto done;
goto done;
goto done;
goto done;
goto done;
done:
return ret;
const char *conf_path,
bool *_is_default)
const char *name;
const char *default_module;
char *module;
char *option;
return NULL;
return NULL;
return NULL;
*_is_default = false;
return module;
*_is_default = true;
const char *conf_path,
const char *name;
bool is_default;
char *module;
goto done;
done:
return ret;
goto done;
goto done;
done:
return ret;
goto done;
goto done;
done:
return ret;