dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina/*
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina Authors:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina Pavel Březina <pbrezina@redhat.com>
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina Copyright (C) 2016 Red Hat
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina This program is free software; you can redistribute it and/or modify
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina it under the terms of the GNU General Public License as published by
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina the Free Software Foundation; either version 3 of the License, or
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina (at your option) any later version.
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina This program is distributed in the hope that it will be useful,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina GNU General Public License for more details.
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina You should have received a copy of the GNU General Public License
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina*/
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include <talloc.h>
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include <tevent.h>
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include <security/pam_appl.h>
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include <security/pam_modules.h>
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include "sbus/sssd_dbus.h"
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include "providers/data_provider/dp_private.h"
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include "providers/data_provider/dp_iface.h"
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include "providers/backend.h"
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include "util/util.h"
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastatic void dp_pam_reply(struct sbus_request *sbus_req,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *request_name,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct pam_data *pd)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DBusMessage *reply;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dbus_bool_t dbret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DP_REQ_DEBUG(SSSDBG_TRACE_LIBS, request_name,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina "Sending result [%d][%s]", pd->pam_status, pd->domain);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina reply = dbus_message_new_method_return(sbus_req->message);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (reply == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DP_REQ_DEBUG(SSSDBG_TRACE_LIBS, request_name,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina "Unable to acquire reply message");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dbret = dp_pack_pam_response(reply, pd);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (!dbret) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DP_REQ_DEBUG(SSSDBG_TRACE_LIBS, request_name,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina "Unable to generate reply message");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dbus_message_unref(reply);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina sbus_request_finish(sbus_req, reply);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dbus_message_unref(reply);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastatic errno_t pam_data_create(TALLOC_CTX *mem_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct sbus_request *sbus_req,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct be_ctx *be_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct pam_data **_pd)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DBusError dbus_error;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct pam_data *pd;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina bool bret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dbus_error_init(&dbus_error);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina bret = dp_unpack_pam_request(sbus_req->message, mem_ctx, &pd, &dbus_error);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (bret == false) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Failed to parse message!\n");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return EINVAL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina pd->pam_status = PAM_SYSTEM_ERR;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (pd->domain == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina pd->domain = talloc_strdup(pd, be_ctx->domain->name);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (pd->domain == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina talloc_free(pd);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return ENOMEM;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina *_pd = pd;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return EOK;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastatic void choose_target(struct data_provider *provider,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct pam_data *pd,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina enum dp_targets *_target,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina enum dp_methods *_method,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char **_req_name)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina enum dp_targets target;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina enum dp_methods method;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *name;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina switch (pd->cmd) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case SSS_PAM_AUTHENTICATE:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina target = DPT_AUTH;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina method = DPM_AUTH_HANDLER;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina name = "PAM Authenticate";
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case SSS_PAM_PREAUTH:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina target = DPT_AUTH;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina method = DPM_AUTH_HANDLER;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina name = "PAM Preauth";
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case SSS_PAM_ACCT_MGMT:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina target = DPT_ACCESS;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina method = DPM_ACCESS_HANDLER;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina name = "PAM Account";
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case SSS_PAM_CHAUTHTOK_PRELIM:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina target = DPT_CHPASS;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina method = DPM_AUTH_HANDLER;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina name = "PAM Chpass 1st";
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case SSS_PAM_CHAUTHTOK:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina target = DPT_CHPASS;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina method = DPM_AUTH_HANDLER;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina name = "PAM Chpass 2nd";
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case SSS_PAM_OPEN_SESSION:
f982039c75ec064894deb676ae53ee57de868590Fabiano Fidêncio name = "PAM Open Session";
f982039c75ec064894deb676ae53ee57de868590Fabiano Fidêncio if (dp_method_enabled(provider, DPT_SESSION, DPM_SESSION_HANDLER)) {
f982039c75ec064894deb676ae53ee57de868590Fabiano Fidêncio target = DPT_SESSION;
f982039c75ec064894deb676ae53ee57de868590Fabiano Fidêncio method = DPM_SESSION_HANDLER;
f982039c75ec064894deb676ae53ee57de868590Fabiano Fidêncio break;
f982039c75ec064894deb676ae53ee57de868590Fabiano Fidêncio }
f982039c75ec064894deb676ae53ee57de868590Fabiano Fidêncio
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina target = DP_TARGET_SENTINEL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina method = DP_METHOD_SENTINEL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina pd->pam_status = PAM_SUCCESS;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case SSS_PAM_SETCRED:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina target = DP_TARGET_SENTINEL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina method = DP_METHOD_SENTINEL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina name = "PAM Set Credentials";
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina pd->pam_status = PAM_SUCCESS;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case SSS_PAM_CLOSE_SESSION:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina target = DP_TARGET_SENTINEL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina method = DP_METHOD_SENTINEL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina name = "PAM Close Session";
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina pd->pam_status = PAM_SUCCESS;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina default:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_TRACE_LIBS, "Unsupported PAM command [%d].\n",
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina pd->cmd);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina target = DP_TARGET_SENTINEL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina method = DP_METHOD_SENTINEL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina name = "PAM Unsupported";
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina pd->pam_status = PAM_MODULE_UNKNOWN;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina break;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina /* Check that target is configured. */
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (target != DP_TARGET_SENTINEL
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina && !dp_target_enabled(provider, NULL, target)) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina target = DP_TARGET_SENTINEL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina method = DP_METHOD_SENTINEL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina pd->pam_status = PAM_MODULE_UNKNOWN;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina *_target = target;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina *_method = method;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina *_req_name = name;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastruct dp_pam_handler_state {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct data_provider *provider;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_client *dp_cli;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct sbus_request *sbus_req;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *request_name;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina};
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinavoid dp_pam_handler_step_done(struct tevent_req *req);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinavoid dp_pam_handler_selinux_done(struct tevent_req *req);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinaerrno_t dp_pam_handler(struct sbus_request *sbus_req, void *sbus_data)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_pam_handler_state *state;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct data_provider *provider;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct pam_data *pd = NULL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_client *dp_cli;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina enum dp_targets target;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina enum dp_methods method;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *req_name;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct tevent_req *req;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina errno_t ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_cli = talloc_get_type(sbus_data, struct dp_client);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina provider = dp_client_provider(dp_cli);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina state = talloc_zero(sbus_req, struct dp_pam_handler_state);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (state == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ENOMEM;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto done;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = pam_data_create(state, sbus_req, provider->be_ctx, &pd);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ret != EOK) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina state->provider = provider;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina state->dp_cli = dp_cli;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina state->sbus_req = sbus_req;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_CONF_SETTINGS, "Got request with the following data\n");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG_PAM_DATA(SSSDBG_CONF_SETTINGS, pd);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina choose_target(provider, pd, &target, &method, &req_name);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (target == DP_TARGET_SENTINEL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina /* Just send the result. Pam data are freed with this call. */
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_pam_reply(sbus_req, req_name, pd);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return EOK;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina req = dp_req_send(state, provider, dp_cli, pd->domain, req_name,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina target, method, 0, pd, &state->request_name);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (req == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ENOMEM;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto done;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina tevent_req_set_callback(req, dp_pam_handler_step_done, state);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinadone:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ret != EOK) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina talloc_free(pd);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastatic bool should_invoke_selinux(struct data_provider *provider,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct pam_data *pd)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (!dp_method_enabled(provider, DPT_SELINUX, DPM_SELINUX_HANDLER)) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return false;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (pd->cmd == SSS_PAM_ACCT_MGMT && pd->pam_status == PAM_SUCCESS) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return true;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return false;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinavoid dp_pam_handler_step_done(struct tevent_req *req)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_pam_handler_state *state;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct pam_data *pd;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina errno_t ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina state = tevent_req_callback_data(req, struct dp_pam_handler_state);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = dp_req_recv(state, req, struct pam_data *, &pd);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina talloc_zfree(req);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ret != EOK) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_req_reply_error(state->sbus_req, state->request_name, ret);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (!should_invoke_selinux(state->provider, pd)) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina /* State and request related data are freed with sbus_req. */
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_pam_reply(state->sbus_req, state->request_name, pd);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina req = dp_req_send(state, state->provider, state->dp_cli, pd->domain,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina "PAM SELinux", DPT_SELINUX, DPM_SELINUX_HANDLER,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina 0, pd, NULL);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (req == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DP_REQ_DEBUG(SSSDBG_CRIT_FAILURE, state->request_name,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina "Unable to process SELinux, killing request...");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina talloc_free(state->sbus_req);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina tevent_req_set_callback(req, dp_pam_handler_selinux_done, state);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinavoid dp_pam_handler_selinux_done(struct tevent_req *req)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_pam_handler_state *state;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct pam_data *pd;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina errno_t ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina state = tevent_req_callback_data(req, struct dp_pam_handler_state);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = dp_req_recv(state, req, struct pam_data *, &pd);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina talloc_zfree(req);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ret != EOK) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_req_reply_error(state->sbus_req, state->request_name, ret);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina /* State and request related data are freed with sbus_req. */
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_pam_reply(state->sbus_req, state->request_name, pd);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březinaerrno_t dp_access_control_refresh_rules_handler(struct sbus_request *sbus_req,
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina void *dp_cli)
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina{
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina const char *key;
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina key = "RefreshRules";
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina dp_req_with_reply(dp_cli, NULL, "Refresh Access Control Rules", key,
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina sbus_req, DPT_ACCESS, DPM_REFRESH_ACCESS_RULES, 0, NULL,
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina dp_req_reply_default, void *);
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina return EOK;
e737cdfa225e0d455c0e574bcb82c2cc16a17d9dPavel Březina}