d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/*
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Authors:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Pavel Březina <pbrezina@redhat.com>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Copyright (C) 2016 Red Hat
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina This program is free software; you can redistribute it and/or modify
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina it under the terms of the GNU General Public License as published by
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina the Free Software Foundation; either version 3 of the License, or
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina (at your option) any later version.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina This program is distributed in the hope that it will be useful,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina GNU General Public License for more details.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina You should have received a copy of the GNU General Public License
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina*/
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <security/pam_modules.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <talloc.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "config.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/data_provider/dp.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/backend.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "util/util.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_access_permit_handler_state {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct pam_data *pd;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct tevent_req *
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadp_access_permit_handler_send(TALLOC_CTX *mem_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *data,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct pam_data *pd,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_req_params *params)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_access_permit_handler_state *state;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_req *req;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina req = tevent_req_create(mem_ctx, &state,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_access_permit_handler_state);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (req == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina state->pd = pd;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_TRACE_ALL, "Access permit, returning PAM_SUCCESS.\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina state->pd->pam_status = PAM_SUCCESS;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina tevent_req_done(req);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina tevent_req_post(req, params->ev);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return req;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaerrno_t
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadp_access_permit_handler_recv(TALLOC_CTX *mem_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_req *req,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct pam_data **_data)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_access_permit_handler_state *state = NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina state = tevent_req_data(req, struct dp_access_permit_handler_state);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *_data = talloc_steal(mem_ctx, state->pd);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return EOK;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_access_deny_handler_state {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct pam_data *pd;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct tevent_req *
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadp_access_deny_handler_send(TALLOC_CTX *mem_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *data,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct pam_data *pd,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_req_params *params)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_access_deny_handler_state *state;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_req *req;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina req = tevent_req_create(mem_ctx, &state,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_access_deny_handler_state);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (req == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina state->pd = pd;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_TRACE_ALL, "Access deny, returning PAM_PERM_DENIED.\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina state->pd->pam_status = PAM_PERM_DENIED;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina tevent_req_done(req);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina tevent_req_post(req, params->ev);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return req;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaerrno_t
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadp_access_deny_handler_recv(TALLOC_CTX *mem_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_req *req,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct pam_data **_data)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_access_deny_handler_state *state = NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina state = tevent_req_data(req, struct dp_access_deny_handler_state);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *_data = talloc_steal(mem_ctx, state->pd);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return EOK;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}