b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik/*
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik Authors:
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina Pavel Březina <pbrezina@redhat.com>
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina Copyright (C) 2015 Red Hat
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik This program is free software; you can redistribute it and/or modify
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik it under the terms of the GNU General Public License as published by
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik the Free Software Foundation; either version 3 of the License, or
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik (at your option) any later version.
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik This program is distributed in the hope that it will be useful,
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik but WITHOUT ANY WARRANTY; without even the implied warranty of
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik GNU General Public License for more details.
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik You should have received a copy of the GNU General Public License
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik along with this program. If not, see <http://www.gnu.org/licenses/>.
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik*/
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina#include "providers/ipa/ipa_opts.h"
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik#include "providers/ipa/ipa_common.h"
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik#include "providers/ldap/sdap_sudo.h"
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina#include "providers/ipa/ipa_sudo.h"
a2057618f30a3c64bdffb35a2ef3c2ba148c8a03Pavel Březina#include "db/sysdb_sudo.h"
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastruct ipa_sudo_handler_state {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina uint32_t type;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_reply_std reply;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina};
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastatic void ipa_sudo_handler_done(struct tevent_req *subreq);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastatic struct tevent_req *
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinaipa_sudo_handler_send(TALLOC_CTX *mem_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct ipa_sudo_ctx *sudo_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_sudo_data *data,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_req_params *params)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct ipa_sudo_handler_state *state;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct tevent_req *subreq;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct tevent_req *req;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina errno_t ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina req = tevent_req_create(mem_ctx, &state, struct ipa_sudo_handler_state);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (req == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return NULL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina state->type = data->type;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina switch (data->type) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case BE_REQ_SUDO_FULL:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Issuing a full refresh of sudo rules\n");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina subreq = ipa_sudo_full_refresh_send(state, params->ev, sudo_ctx);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case BE_REQ_SUDO_RULES:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Issuing a refresh of specific sudo rules\n");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina subreq = ipa_sudo_rules_refresh_send(state, params->ev, sudo_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina data->rules);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina default:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid request type: %d\n", data->type);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = EINVAL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto immediately;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (subreq == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to send request: %d\n", data->type);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ENOMEM;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto immediately;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina tevent_req_set_callback(subreq, ipa_sudo_handler_done, req);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return req;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinaimmediately:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_reply_std_set(&state->reply, DP_ERR_DECIDE, ret, NULL);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina /* TODO For backward compatibility we always return EOK to DP now. */
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina tevent_req_done(req);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina tevent_req_post(req, params->ev);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return req;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastatic void ipa_sudo_handler_done(struct tevent_req *subreq)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct ipa_sudo_handler_state *state;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct tevent_req *req;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina int dp_error;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina bool deleted;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina errno_t ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina state = tevent_req_data(req, struct ipa_sudo_handler_state);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina switch (state->type) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case BE_REQ_SUDO_FULL:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ipa_sudo_full_refresh_recv(subreq, &dp_error);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina talloc_zfree(subreq);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case BE_REQ_SUDO_RULES:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ipa_sudo_rules_refresh_recv(subreq, &dp_error, &deleted);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina talloc_zfree(subreq);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ret == EOK && deleted == true) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ENOENT;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina default:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid request type: %d\n", state->type);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_error = DP_ERR_FATAL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ERR_INTERNAL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina /* TODO For backward compatibility we always return EOK to DP now. */
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_reply_std_set(&state->reply, dp_error, ret, NULL);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina tevent_req_done(req);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastatic errno_t
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinaipa_sudo_handler_recv(TALLOC_CTX *mem_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct tevent_req *req,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_reply_std *data)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct ipa_sudo_handler_state *state = NULL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina state = tevent_req_data(req, struct ipa_sudo_handler_state);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina *data = state->reply;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return EOK;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březinaenum sudo_schema {
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina SUDO_SCHEMA_IPA,
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina SUDO_SCHEMA_LDAP
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina};
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březinastatic errno_t
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březinaipa_sudo_choose_schema(struct dp_option *ipa_opts,
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina struct dp_option *sdap_opts,
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina enum sudo_schema *_schema)
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina{
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina TALLOC_CTX *tmp_ctx;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina char *ipa_search_base;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina char *search_base;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina char *basedn;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina errno_t ret;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina tmp_ctx = talloc_new(NULL);
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina if (tmp_ctx == NULL) {
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina return ENOMEM;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina }
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina ret = domain_to_basedn(tmp_ctx, dp_opt_get_string(ipa_opts,
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina IPA_KRB5_REALM), &basedn);
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina if (ret != EOK) {
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to obtain basedn\n");
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina goto done;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina }
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina ipa_search_base = talloc_asprintf(tmp_ctx, "cn=sudo,%s", basedn);
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina if (ipa_search_base == NULL) {
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina ret = ENOMEM;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina goto done;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina }
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina search_base = dp_opt_get_string(sdap_opts, SDAP_SUDO_SEARCH_BASE);
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina if (search_base == NULL) {
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina ret = dp_opt_set_string(sdap_opts, SDAP_SUDO_SEARCH_BASE,
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina ipa_search_base);
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina if (ret != EOK) {
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina goto done;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina }
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Option %s set to %s\n",
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina sdap_opts[SDAP_SUDO_SEARCH_BASE].opt_name, ipa_search_base);
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina search_base = ipa_search_base;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina }
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina /* Use IPA schema only if search base is cn=sudo,$dc. */
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina if (strcmp(ipa_search_base, search_base) == 0) {
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina *_schema = SUDO_SCHEMA_IPA;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina } else {
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina *_schema = SUDO_SCHEMA_LDAP;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina }
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina ret = EOK;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březinadone:
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina talloc_free(tmp_ctx);
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina return ret;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina}
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březinastatic int
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinaipa_sudo_init_ipa_schema(TALLOC_CTX *mem_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct be_ctx *be_ctx,
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina struct ipa_id_ctx *id_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_method *dp_methods)
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina{
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina struct ipa_sudo_ctx *sudo_ctx;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina errno_t ret;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina sudo_ctx = talloc_zero(be_ctx, struct ipa_sudo_ctx);
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina if (sudo_ctx == NULL) {
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina return ENOMEM;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina }
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina sudo_ctx->id_ctx = id_ctx->sdap_id_ctx;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina sudo_ctx->ipa_opts = id_ctx->ipa_options;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina sudo_ctx->sdap_opts = id_ctx->sdap_id_ctx->opts;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina ret = sdap_get_map(sudo_ctx, be_ctx->cdb, be_ctx->conf_path,
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina ipa_sudorule_map, IPA_OPTS_SUDORULE,
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina &sudo_ctx->sudorule_map);
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina if (ret != EOK) {
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse attribute map "
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina goto done;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina }
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina ret = sdap_get_map(sudo_ctx, be_ctx->cdb, be_ctx->conf_path,
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina ipa_sudocmdgroup_map, IPA_OPTS_SUDOCMDGROUP,
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina &sudo_ctx->sudocmdgroup_map);
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina if (ret != EOK) {
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse attribute map "
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina goto done;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina }
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina ret = sdap_get_map(sudo_ctx, be_ctx->cdb, be_ctx->conf_path,
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina ipa_sudocmd_map, IPA_OPTS_SUDOCMD,
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina &sudo_ctx->sudocmd_map);
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina if (ret != EOK) {
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse attribute map "
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina goto done;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina }
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina ret = sdap_parse_search_base(sudo_ctx, sudo_ctx->sdap_opts->basic,
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina SDAP_SUDO_SEARCH_BASE,
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina &sudo_ctx->sudo_sb);
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina if (ret != EOK) {
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina DEBUG(SSSDBG_OP_FAILURE, "Could not parse sudo search base\n");
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina return ret;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina }
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_ptask_setup(be_ctx, sudo_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to setup periodic tasks "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_set_method(dp_methods, DPM_SUDO_HANDLER,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ipa_sudo_handler_send, ipa_sudo_handler_recv, sudo_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct ipa_sudo_ctx, struct dp_sudo_data, struct dp_reply_std);
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina ret = EOK;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březinadone:
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina if (ret != EOK) {
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina talloc_free(sudo_ctx);
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina }
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina return ret;
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina}
4ddd5591c50e27dffa55f03fbce0dcc85cd50a8bPavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinaint ipa_sudo_init(TALLOC_CTX *mem_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct be_ctx *be_ctx,
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik struct ipa_id_ctx *id_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_method *dp_methods)
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik{
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina enum sudo_schema schema;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina errno_t ret;
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina DEBUG(SSSDBG_TRACE_INTERNAL, "Initializing IPA sudo back end\n");
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina ret = ipa_sudo_choose_schema(id_ctx->ipa_options->basic,
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina id_ctx->ipa_options->id->basic,
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina &schema);
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik if (ret != EOK) {
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to choose sudo schema [%d]: %s\n",
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina ret, sss_strerror(ret));
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik return ret;
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik }
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina switch (schema) {
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina case SUDO_SCHEMA_IPA:
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Using IPA schema for sudo\n");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ipa_sudo_init_ipa_schema(mem_ctx, be_ctx, id_ctx, dp_methods);
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina break;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina case SUDO_SCHEMA_LDAP:
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Using LDAP schema for sudo\n");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = sdap_sudo_init(mem_ctx, be_ctx, id_ctx->sdap_id_ctx, dp_methods);
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina break;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina }
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina if (ret != EOK) {
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to initialize sudo provider"
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina return ret;
0f04241fc90f134af0272eb0999e75fb6749b595Pavel Březina }
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik return EOK;
b24e4bec819b29f1ec8e77083d4e7610c5dd9c77Lukas Slebodnik}