pamsrv.c revision 6c9fe712447b4b868c9fe3e1d91df174485d0ada
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/*
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync SSSD
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync PAM Responder
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync Copyright (C) Simo Sorce <ssorce@redhat.com> 2009
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync Copyright (C) Sumit Bose <sbose@redhat.com> 2009
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync This program is free software; you can redistribute it and/or modify
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync it under the terms of the GNU General Public License as published by
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync the Free Software Foundation; either version 3 of the License, or
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync (at your option) any later version.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync This program is distributed in the hope that it will be useful,
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync but WITHOUT ANY WARRANTY; without even the implied warranty of
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync GNU General Public License for more details.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync You should have received a copy of the GNU General Public License
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync along with this program. If not, see <http://www.gnu.org/licenses/>.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync*/
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <stdio.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <unistd.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <fcntl.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <sys/types.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <sys/stat.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <sys/socket.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <sys/un.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <string.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <sys/time.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <errno.h>
4d3f12a2094df73f5e04b71d3b7623aa0130285cvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include "popt.h"
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include "util/util.h"
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include "db/sysdb.h"
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include "confdb/confdb.h"
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include "dbus/dbus.h"
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include "sbus/sssd_dbus.h"
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include "responder/common/responder_packet.h"
8f2d4fea58e2d827a8269d0c96d307217b5ab14dvboxsync#include "providers/data_provider.h"
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include "monitor/monitor_interfaces.h"
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync#include "sbus/sbus_client.h"
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync#include "responder/pam/pamsrv.h"
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync#define SSS_PAM_SBUS_SERVICE_VERSION 0x0001
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync#define SSS_PAM_SBUS_SERVICE_NAME "pam"
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsyncstatic int service_reload(DBusMessage *message, struct sbus_connection *conn);
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsyncstruct sbus_method monitor_pam_methods[] = {
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync { MON_CLI_METHOD_PING, monitor_common_pong },
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync { MON_CLI_METHOD_RELOAD, service_reload },
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync { NULL, NULL }
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync};
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncstruct sbus_interface monitor_pam_interface = {
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync MONITOR_INTERFACE,
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync MONITOR_PATH,
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync SBUS_DEFAULT_VTABLE,
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync monitor_pam_methods,
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync NULL
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync};
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsyncstatic int service_reload(DBusMessage *message, struct sbus_connection *conn) {
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync /* Monitor calls this function when we need to reload
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync * our configuration information. Perform whatever steps
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync * are needed to update the configuration objects.
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync */
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync /* Send an empty reply to acknowledge receipt */
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync return monitor_common_pong(message, conn);
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync}
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsyncstatic struct sbus_method pam_dp_methods[] = {
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync { NULL, NULL }
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync};
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsyncstruct sbus_interface pam_dp_interface = {
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync DP_INTERFACE,
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync DP_PATH,
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync SBUS_DEFAULT_VTABLE,
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync pam_dp_methods,
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync NULL
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync};
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsyncstatic void pam_dp_reconnect_init(struct sbus_connection *conn, int status, void *pvt)
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync{
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync struct be_conn *be_conn = talloc_get_type(pvt, struct be_conn);
f6f1d32779a2a6a1a4579c3bf6ff3aa0c37f0823vboxsync int ret;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync /* Did we reconnect successfully? */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync if (status == SBUS_RECONNECT_SUCCESS) {
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync DEBUG(1, ("Reconnected to the Data Provider.\n"));
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync /* Identify ourselves to the data provider */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync ret = dp_common_send_id(be_conn->conn,
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync DATA_PROVIDER_VERSION,
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync "PAM", be_conn->domain->name);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync /* all fine */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync if (ret == EOK) return;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync }
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync /* Handle failure */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync DEBUG(0, ("Could not reconnect to %s provider.\n",
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync be_conn->domain->name));
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync /* FIXME: kill the frontend and let the monitor restart it ? */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync /* pam_shutdown(rctx); */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync}
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncstatic errno_t pam_get_config(struct pam_ctx *pctx,
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync struct resp_ctx *rctx,
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync struct confdb_ctx *cdb)
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync{
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync int ret = EOK;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync ret = confdb_get_int(cdb, pctx, CONFDB_PAM_CONF_ENTRY,
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync CONFDB_PAM_CRED_TIMEOUT, 0,
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync &pctx->cred_expiration);
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync return ret;
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync}
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsyncstatic int pam_process_init(TALLOC_CTX *mem_ctx,
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync struct tevent_context *ev,
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync struct confdb_ctx *cdb)
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync{
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync struct sss_cmd_table *pam_cmds;
54d2d2606d7c83a456819cd038a73e0f9a600ca4vboxsync struct be_conn *iter;
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync struct pam_ctx *pctx;
43af8389304c77c3d4db525de8907cb74207c380vboxsync int ret, max_retries;
1e9c7d1236e5efe007e5984e75dad70243214559vboxsync
1e9c7d1236e5efe007e5984e75dad70243214559vboxsync pctx = talloc_zero(mem_ctx, struct pam_ctx);
1e9c7d1236e5efe007e5984e75dad70243214559vboxsync if (!pctx) {
43af8389304c77c3d4db525de8907cb74207c380vboxsync return ENOMEM;
43af8389304c77c3d4db525de8907cb74207c380vboxsync }
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync pam_cmds = get_pam_cmds();
43af8389304c77c3d4db525de8907cb74207c380vboxsync ret = sss_process_init(pctx, ev, cdb,
43af8389304c77c3d4db525de8907cb74207c380vboxsync pam_cmds,
43af8389304c77c3d4db525de8907cb74207c380vboxsync SSS_PAM_SOCKET_NAME,
43af8389304c77c3d4db525de8907cb74207c380vboxsync SSS_PAM_PRIV_SOCKET_NAME,
43af8389304c77c3d4db525de8907cb74207c380vboxsync CONFDB_PAM_CONF_ENTRY,
43af8389304c77c3d4db525de8907cb74207c380vboxsync SSS_PAM_SBUS_SERVICE_NAME,
43af8389304c77c3d4db525de8907cb74207c380vboxsync SSS_PAM_SBUS_SERVICE_VERSION,
43af8389304c77c3d4db525de8907cb74207c380vboxsync &monitor_pam_interface,
43af8389304c77c3d4db525de8907cb74207c380vboxsync "PAM", &pam_dp_interface,
43af8389304c77c3d4db525de8907cb74207c380vboxsync &pctx->rctx);
43af8389304c77c3d4db525de8907cb74207c380vboxsync if (ret != EOK) {
43af8389304c77c3d4db525de8907cb74207c380vboxsync return ret;
43af8389304c77c3d4db525de8907cb74207c380vboxsync }
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync pctx->rctx->pvt_ctx = pctx;
43af8389304c77c3d4db525de8907cb74207c380vboxsync ret = pam_get_config(pctx, pctx->rctx, pctx->rctx->cdb);
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync /* Enable automatic reconnection to the Data Provider */
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync /* FIXME: "retries" is too generic, either get it from a global config
43af8389304c77c3d4db525de8907cb74207c380vboxsync * or specify these retries are about the sbus connections to DP */
43af8389304c77c3d4db525de8907cb74207c380vboxsync ret = confdb_get_int(pctx->rctx->cdb, pctx->rctx, CONFDB_PAM_CONF_ENTRY,
6edb8daa1da166b649f73256c47d63c9403ba27cvboxsync CONFDB_SERVICE_RECON_RETRIES, 3, &max_retries);
6edb8daa1da166b649f73256c47d63c9403ba27cvboxsync if (ret != EOK) {
43af8389304c77c3d4db525de8907cb74207c380vboxsync DEBUG(0, ("Failed to set up automatic reconnection\n"));
43af8389304c77c3d4db525de8907cb74207c380vboxsync return ret;
43af8389304c77c3d4db525de8907cb74207c380vboxsync }
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync for (iter = pctx->rctx->be_conns; iter; iter = iter->next) {
43af8389304c77c3d4db525de8907cb74207c380vboxsync sbus_reconnect_init(iter->conn, max_retries,
43af8389304c77c3d4db525de8907cb74207c380vboxsync pam_dp_reconnect_init, iter);
43af8389304c77c3d4db525de8907cb74207c380vboxsync }
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync return EOK;
1e9c7d1236e5efe007e5984e75dad70243214559vboxsync}
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsyncint main(int argc, const char *argv[])
43af8389304c77c3d4db525de8907cb74207c380vboxsync{
43af8389304c77c3d4db525de8907cb74207c380vboxsync int opt;
43af8389304c77c3d4db525de8907cb74207c380vboxsync poptContext pc;
43af8389304c77c3d4db525de8907cb74207c380vboxsync struct main_context *main_ctx;
43af8389304c77c3d4db525de8907cb74207c380vboxsync int ret;
1e9c7d1236e5efe007e5984e75dad70243214559vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync struct poptOption long_options[] = {
43af8389304c77c3d4db525de8907cb74207c380vboxsync POPT_AUTOHELP
43af8389304c77c3d4db525de8907cb74207c380vboxsync SSSD_MAIN_OPTS
43af8389304c77c3d4db525de8907cb74207c380vboxsync { NULL }
43af8389304c77c3d4db525de8907cb74207c380vboxsync };
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync pc = poptGetContext(argv[0], argc, argv, long_options, 0);
1e9c7d1236e5efe007e5984e75dad70243214559vboxsync while((opt = poptGetNextOpt(pc)) != -1) {
43af8389304c77c3d4db525de8907cb74207c380vboxsync switch(opt) {
43af8389304c77c3d4db525de8907cb74207c380vboxsync default:
43af8389304c77c3d4db525de8907cb74207c380vboxsync fprintf(stderr, "\nInvalid option %s: %s\n\n",
43af8389304c77c3d4db525de8907cb74207c380vboxsync poptBadOption(pc, 0), poptStrerror(opt));
43af8389304c77c3d4db525de8907cb74207c380vboxsync poptPrintUsage(pc, stderr, 0);
43af8389304c77c3d4db525de8907cb74207c380vboxsync return 1;
43af8389304c77c3d4db525de8907cb74207c380vboxsync }
1e9c7d1236e5efe007e5984e75dad70243214559vboxsync }
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync poptFreeContext(pc);
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync /* set up things like debug, signals, daemonization, etc... */
43af8389304c77c3d4db525de8907cb74207c380vboxsync debug_log_file = "sssd_pam";
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync ret = server_setup("sssd[pam]", 0, CONFDB_PAM_CONF_ENTRY, &main_ctx);
1e9c7d1236e5efe007e5984e75dad70243214559vboxsync if (ret != EOK) return 2;
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync ret = die_if_parent_died();
43af8389304c77c3d4db525de8907cb74207c380vboxsync if (ret != EOK) {
43af8389304c77c3d4db525de8907cb74207c380vboxsync /* This is not fatal, don't return */
43af8389304c77c3d4db525de8907cb74207c380vboxsync DEBUG(2, ("Could not set up to exit when parent process does\n"));
43af8389304c77c3d4db525de8907cb74207c380vboxsync }
43af8389304c77c3d4db525de8907cb74207c380vboxsync
1e9c7d1236e5efe007e5984e75dad70243214559vboxsync ret = pam_process_init(main_ctx,
1e9c7d1236e5efe007e5984e75dad70243214559vboxsync main_ctx->event_ctx,
43af8389304c77c3d4db525de8907cb74207c380vboxsync main_ctx->confdb_ctx);
43af8389304c77c3d4db525de8907cb74207c380vboxsync if (ret != EOK) return 3;
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync /* loop on main */
43af8389304c77c3d4db525de8907cb74207c380vboxsync server_loop(main_ctx);
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync return 0;
1e9c7d1236e5efe007e5984e75dad70243214559vboxsync}
43af8389304c77c3d4db525de8907cb74207c380vboxsync
43af8389304c77c3d4db525de8907cb74207c380vboxsync