responder_common.c revision 1d4293f36695daab5909b9eaa670e8e23db548aa
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek/*
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek SSSD
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek Common Responder methods
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek Copyright (C) Simo Sorce <ssorce@redhat.com> 2008
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek This program is free software; you can redistribute it and/or modify
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek it under the terms of the GNU General Public License as published by
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek the Free Software Foundation; either version 3 of the License, or
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek (at your option) any later version.
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek This program is distributed in the hope that it will be useful,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek but WITHOUT ANY WARRANTY; without even the implied warranty of
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek GNU General Public License for more details.
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek You should have received a copy of the GNU General Public License
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek along with this program. If not, see <http://www.gnu.org/licenses/>.
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek*/
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include "config.h"
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include <stdio.h>
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include <unistd.h>
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include <fcntl.h>
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include <sys/types.h>
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include <sys/stat.h>
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include <sys/socket.h>
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include <sys/un.h>
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include <string.h>
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include <sys/time.h>
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include <errno.h>
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include <popt.h>
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include "util/util.h"
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include "util/strtonum.h"
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include "db/sysdb.h"
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include "confdb/confdb.h"
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include "dbus/dbus.h"
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include "sbus/sssd_dbus.h"
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include "responder/common/responder.h"
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include "responder/common/responder_packet.h"
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include "providers/data_provider.h"
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include "monitor/monitor_interfaces.h"
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#include "sbus/sbus_client.h"
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic errno_t set_nonblocking(int fd)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int v;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int ferr;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek errno_t error;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Get the current flags for this file descriptor */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek v = fcntl(fd, F_GETFL, 0);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek errno = 0;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Set the non-blocking flag on this fd */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ferr = fcntl(fd, F_SETFL, v | O_NONBLOCK);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ferr < 0) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek error = errno;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Unable to set fd non-blocking: [%d][%s]\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek error, strerror(error)));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return error;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return EOK;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic errno_t set_close_on_exec(int fd)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int v;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int ferr;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek errno_t error;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Get the current flags for this file descriptor */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek v = fcntl(fd, F_GETFD, 0);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek errno = 0;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Set the close-on-exec flags on this fd */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ferr = fcntl(fd, F_SETFD, v | FD_CLOEXEC);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ferr < 0) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek error = errno;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Unable to set fd close-on-exec: [%d][%s]\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek error, strerror(error)));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return error;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return EOK;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic int client_destructor(struct cli_ctx *ctx)
2cba1c86f48db866fc72738a32eecbbdcdf3dbdbJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek errno_t ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if ((ctx->cfd > 0) && close(ctx->cfd) < 0) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = errno;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Failed to close fd [%d]: [%s]\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ctx->cfd, strerror(ret)));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_TRACE_INTERNAL,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Terminated client [%p][%d]\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ctx, ctx->cfd));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return 0;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic errno_t get_client_cred(struct cli_ctx *cctx)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->client_euid = -1;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->client_egid = -1;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->client_pid = -1;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#ifdef HAVE_UCRED
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct ucred client_cred;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek socklen_t client_cred_len = sizeof(client_cred);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = getsockopt(cctx->cfd, SOL_SOCKET, SO_PEERCRED, &client_cred,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek &client_cred_len);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = errno;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(1, ("getsock failed [%d][%s].\n", ret, strerror(ret)));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (client_cred_len != sizeof(struct ucred)) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(1, ("getsockopt returned unexpected message size.\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ENOMSG;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->client_euid = client_cred.uid;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek cctx->client_egid = client_cred.gid;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->client_pid = client_cred.pid;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(9, ("Client creds: euid[%d] egid[%d] pid[%d].\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->client_euid, cctx->client_egid, cctx->client_pid));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#endif
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return EOK;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekerrno_t check_allowed_uids(uid_t uid, size_t allowed_uids_count,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek uid_t *allowed_uids)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek size_t c;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (allowed_uids == NULL) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return EINVAL;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek for (c = 0; c < allowed_uids_count; c++) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (uid == allowed_uids[c]) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return EOK;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return EACCES;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekerrno_t csv_string_to_uid_array(TALLOC_CTX *mem_ctx, const char *cvs_string,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek bool allow_sss_loop,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek size_t *_uid_count, uid_t **_uids)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek size_t c;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek char **list = NULL;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int list_size;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek uid_t *uids = NULL;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek char *endptr;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct passwd *pwd;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = split_on_separator(mem_ctx, cvs_string, ',', true, false,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek &list, &list_size);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("split_on_separator failed [%d][%s].\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret, strerror(ret)));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto done;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek uids = talloc_array(mem_ctx, uint32_t, list_size);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (uids == NULL) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("talloc_array failed.\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = ENOMEM;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto done;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (allow_sss_loop) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = unsetenv("_SSS_LOOPS");
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Failed to unset _SSS_LOOPS, getpwnam "
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek "might not find sssd users.\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek for (c = 0; c < list_size; c++) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek errno = 0;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (*list[c] == '\0') {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Empty list item.\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = EINVAL;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto done;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek uids[c] = strtouint32(list[c], &endptr, 10);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (errno != 0 || *endptr != '\0') {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = errno;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret == ERANGE) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("List item [%s] is out of range.\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek list[c]));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto done;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek errno = 0;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek pwd = getpwnam(list[c]);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (pwd == NULL) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("List item [%s] is neither a valid "
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek "UID nor a user name which cloud be "
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek "resolved by getpwnam().\n", list[c]));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = EINVAL;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto done;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek uids[c] = pwd->pw_uid;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek }
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek *_uid_count = list_size;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek *_uids = uids;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = EOK;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekdone:
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if(setenv("_SSS_LOOPS", "NO", 0) != 0) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Failed to set _SSS_LOOPS.\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(list);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(uids);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic void client_send(struct cli_ctx *cctx)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = sss_packet_send(cctx->creq->out, cctx->cfd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret == EAGAIN) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* not all data was sent, loop again */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Failed to send data, aborting client!\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* ok all sent */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek TEVENT_FD_NOT_WRITEABLE(cctx->cfde);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek TEVENT_FD_READABLE(cctx->cfde);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx->creq);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->creq = NULL;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic int client_cmd_execute(struct cli_ctx *cctx, struct sss_cmd_table *sss_cmds)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek enum sss_cli_command cmd;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cmd = sss_packet_get_cmd(cctx->creq->in);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return sss_cmd_execute(cctx, cmd, sss_cmds);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic void client_recv(struct cli_ctx *cctx)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!cctx->creq) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->creq = talloc_zero(cctx, struct cli_request);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!cctx->creq) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Failed to alloc request, aborting client!\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!cctx->creq->in) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = sss_packet_new(cctx->creq, SSS_PACKET_MAX_RECV_SIZE,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek 0, &cctx->creq->in);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Failed to alloc request, aborting client!\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = sss_packet_recv(cctx->creq->in, cctx->cfd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek switch (ret) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek case EOK:
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* do not read anymore */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek TEVENT_FD_NOT_READABLE(cctx->cfde);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* execute command */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = client_cmd_execute(cctx, cctx->rctx->sss_cmds);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Failed to execute request, aborting client!\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* past this point cctx can be freed at any time by callbacks
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek * in case of error, do not use it */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek case EAGAIN:
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* need to read still some data, loop again */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek break;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek case EINVAL:
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(6, ("Invalid data from client, closing connection!\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek break;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek case ENODATA:
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(5, ("Client disconnected!\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek break;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek default:
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(6, ("Failed to read request, aborting client!\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic errno_t reset_idle_timer(struct cli_ctx *cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic void client_fd_handler(struct tevent_context *ev,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct tevent_fd *fde,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek uint16_t flags, void *ptr)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek errno_t ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct cli_ctx *cctx = talloc_get_type(ptr, struct cli_ctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Always reset the idle timer on any activity */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = reset_idle_timer(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Could not create idle timer for client. "
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek "This connection may not auto-terminate\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Non-fatal, continue */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (flags & TEVENT_FD_READ) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek client_recv(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (flags & TEVENT_FD_WRITE) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek client_send(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstruct accept_fd_ctx {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct resp_ctx *rctx;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek bool is_private;
5f93f452e4a80d6b0243eaf3c583d0caf9981ca0Jakub Hrozek};
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic void idle_handler(struct tevent_context *ev,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct tevent_timer *te,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct timeval current_time,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek void *data);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
5f93f452e4a80d6b0243eaf3c583d0caf9981ca0Jakub Hrozekstatic void accept_fd_handler(struct tevent_context *ev,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct tevent_fd *fde,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek uint16_t flags, void *ptr)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* accept and attach new event handler */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct accept_fd_ctx *accept_ctx =
3c60433641ce2e86b9b04778c8f8652ef0d097e4Stef Walter talloc_get_type(ptr, struct accept_fd_ctx);
3c60433641ce2e86b9b04778c8f8652ef0d097e4Stef Walter struct resp_ctx *rctx = accept_ctx->rctx;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct cli_ctx *cctx;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek socklen_t len;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct stat stat_buf;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int fd = accept_ctx->is_private ? rctx->priv_lfd : rctx->lfd;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int client_fd;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (accept_ctx->is_private) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = stat(rctx->priv_sock_name, &stat_buf);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret == -1) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(1, ("stat on privileged pipe failed: [%d][%s].\n", errno,
6fdde3913a11cd6148627696fa8717c34e8460fcJan Zeleny strerror(errno)));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
5f93f452e4a80d6b0243eaf3c583d0caf9981ca0Jakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if ( ! (stat_buf.st_uid == 0 && stat_buf.st_gid == 0 &&
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek (stat_buf.st_mode&(S_IFSOCK|S_IRUSR|S_IWUSR)) == stat_buf.st_mode)) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(1, ("privileged pipe has an illegal status.\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* TODO: what is the best response to this condition? Terminate? */
5f93f452e4a80d6b0243eaf3c583d0caf9981ca0Jakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx = talloc_zero(rctx, struct cli_ctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!cctx) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct sockaddr_un addr;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Out of memory trying to setup client context%s!\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek accept_ctx->is_private ? " on privileged pipe": ""));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* accept and close to signal the client we have a problem */
5f93f452e4a80d6b0243eaf3c583d0caf9981ca0Jakub Hrozek memset(&addr, 0, sizeof(addr));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek len = sizeof(addr);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek client_fd = accept(fd, (struct sockaddr *)&addr, &len);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (client_fd == -1) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek close(client_fd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek len = sizeof(cctx->addr);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->cfd = accept(fd, (struct sockaddr *)&cctx->addr, &len);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (cctx->cfd == -1) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(1, ("Accept failed [%s]\n", strerror(errno)));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->priv = accept_ctx->is_private;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = get_client_cred(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(2, ("get_client_cred failed, "
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek "client cred may not be available.\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (rctx->allowed_uids_count != 0) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (cctx->client_euid == -1) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("allowed_uids configured, " \
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek "but platform does not support " \
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek "reading peer credential from the " \
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek "socket. Access denied.\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek close(cctx->cfd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
129310e872a0a70e721ba59363e518176ef406d6Jakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = check_allowed_uids(cctx->client_euid, rctx->allowed_uids_count,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->allowed_uids);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret == EACCES) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("Access denied for uid [%d].\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->client_euid));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek } else {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("check_allowed_uids failed.\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek close(cctx->cfd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->cfde = tevent_add_fd(ev, cctx, cctx->cfd,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek TEVENT_FD_READ, client_fd_handler, cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!cctx->cfde) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek close(cctx->cfd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Failed to queue client handler%s\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek accept_ctx->is_private ? " on privileged pipe" : ""));
129310e872a0a70e721ba59363e518176ef406d6Jakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->ev = ev;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->rctx = rctx;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_set_destructor(cctx, client_destructor);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Set up the idle timer */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = reset_idle_timer(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Could not create idle timer for client. "
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek "This connection may not auto-terminate\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Non-fatal, continue */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Client connected%s!\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek accept_ctx->is_private ? " to privileged pipe" : ""));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic errno_t reset_idle_timer(struct cli_ctx *cctx)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct timeval tv =
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek tevent_timeval_current_ofs(cctx->rctx->client_idle_timeout, 0);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_zfree(cctx->idle);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx->idle = tevent_add_timer(cctx->ev, cctx, tv, idle_handler, cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!cctx->idle) return ENOMEM;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_TRACE_ALL,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Idle timer re-set for client [%p][%d]\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx, cctx->cfd));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return EOK;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic void idle_handler(struct tevent_context *ev,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct tevent_timer *te,
5f93f452e4a80d6b0243eaf3c583d0caf9981ca0Jakub Hrozek struct timeval current_time,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek void *data)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* This connection is idle. Terminate it */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct cli_ctx *cctx =
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_get_type(data, struct cli_ctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_TRACE_INTERNAL,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Terminating idle client [%p][%d]\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cctx, cctx->cfd));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* The cli_ctx destructor will handle the rest */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(cctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic int sss_dp_init(struct resp_ctx *rctx,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct sbus_interface *intf,
5f93f452e4a80d6b0243eaf3c583d0caf9981ca0Jakub Hrozek const char *cli_name,
5f93f452e4a80d6b0243eaf3c583d0caf9981ca0Jakub Hrozek struct sss_domain_info *domain)
5f93f452e4a80d6b0243eaf3c583d0caf9981ca0Jakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct be_conn *be_conn;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek be_conn = talloc_zero(rctx, struct be_conn);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!be_conn) return ENOMEM;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek be_conn->cli_name = cli_name;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek be_conn->domain = domain;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek be_conn->intf = intf;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek be_conn->rctx = rctx;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Set up SBUS connection to the monitor */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = dp_get_sbus_address(be_conn, &be_conn->sbus_address, domain->name);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Could not locate DP address.\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = sbus_client_init(rctx, rctx->ev,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek be_conn->sbus_address,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek intf, &be_conn->conn,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek NULL, rctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Failed to connect to monitor services.\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DLIST_ADD_END(rctx->be_conns, be_conn, struct be_conn *);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Identify ourselves to the DP */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = dp_common_send_id(be_conn->conn,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DATA_PROVIDER_VERSION,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek cli_name);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Failed to identify to the DP!\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
b7b50b21d2254a079b1b1c299909483d23db1512Sumit Bose return EOK;
b7b50b21d2254a079b1b1c299909483d23db1512Sumit Bose}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek/* create a unix socket and listen to it */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic int set_unix_socket(struct resp_ctx *rctx)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct sockaddr_un addr;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek errno_t ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct accept_fd_ctx *accept_ctx;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek/* for future use */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#if 0
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek char *default_pipe;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek default_pipe = talloc_asprintf(rctx, "%s/%s", PIPE_PATH,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->sss_pipe_name);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!default_pipe) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ENOMEM;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = confdb_get_string(rctx->cdb, rctx,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->confdb_socket_path, "unixSocket",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek default_pipe, &rctx->sock_name);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(default_pipe);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(default_pipe);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek default_pipe = talloc_asprintf(rctx, "%s/private/%s", PIPE_PATH,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->sss_pipe_name);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!default_pipe) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ENOMEM;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = confdb_get_string(rctx->cdb, rctx,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->confdb_socket_path, "privUnixSocket",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek default_pipe, &rctx->priv_sock_name);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(default_pipe);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(default_pipe);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek#endif
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (rctx->sock_name != NULL ) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->lfd = socket(AF_UNIX, SOCK_STREAM, 0);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (rctx->lfd == -1) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return EIO;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Set the umask so that permissions are set right on the socket.
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek * It must be readable and writable by anybody on the system. */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek umask(0111);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = set_nonblocking(rctx->lfd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto failed;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = set_close_on_exec(rctx->lfd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto failed;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek memset(&addr, 0, sizeof(addr));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek addr.sun_family = AF_UNIX;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek strncpy(addr.sun_path, rctx->sock_name, sizeof(addr.sun_path)-1);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek addr.sun_path[sizeof(addr.sun_path)-1] = '\0';
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* make sure we have no old sockets around */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek unlink(rctx->sock_name);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (bind(rctx->lfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0,("Unable to bind on socket '%s'\n", rctx->sock_name));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto failed;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (listen(rctx->lfd, 10) != 0) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0,("Unable to listen on socket '%s'\n", rctx->sock_name));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto failed;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek accept_ctx = talloc_zero(rctx, struct accept_fd_ctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if(!accept_ctx) goto failed;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek accept_ctx->rctx = rctx;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek accept_ctx->is_private = false;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->lfde = tevent_add_fd(rctx->ev, rctx, rctx->lfd,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek TEVENT_FD_READ, accept_fd_handler,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek accept_ctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!rctx->lfde) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Failed to queue handler on pipe\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto failed;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (rctx->priv_sock_name != NULL ) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* create privileged pipe */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->priv_lfd = socket(AF_UNIX, SOCK_STREAM, 0);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (rctx->priv_lfd == -1) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek close(rctx->lfd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return EIO;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek umask(0177);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = set_nonblocking(rctx->priv_lfd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto failed;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = set_close_on_exec(rctx->priv_lfd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto failed;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek memset(&addr, 0, sizeof(addr));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek addr.sun_family = AF_UNIX;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek strncpy(addr.sun_path, rctx->priv_sock_name, sizeof(addr.sun_path)-1);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek addr.sun_path[sizeof(addr.sun_path)-1] = '\0';
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek unlink(rctx->priv_sock_name);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (bind(rctx->priv_lfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0,("Unable to bind on socket '%s'\n", rctx->priv_sock_name));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto failed;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (listen(rctx->priv_lfd, 10) != 0) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0,("Unable to listen on socket '%s'\n", rctx->priv_sock_name));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto failed;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek accept_ctx = talloc_zero(rctx, struct accept_fd_ctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if(!accept_ctx) goto failed;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek accept_ctx->rctx = rctx;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek accept_ctx->is_private = true;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->priv_lfde = tevent_add_fd(rctx->ev, rctx, rctx->priv_lfd,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek TEVENT_FD_READ, accept_fd_handler,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek accept_ctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!rctx->priv_lfde) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("Failed to queue handler on privileged pipe\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto failed;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* we want default permissions on created files to be very strict,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek so set our umask to 0177 */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek umask(0177);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return EOK;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekfailed:
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* we want default permissions on created files to be very strict,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek so set our umask to 0177 */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek umask(0177);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek close(rctx->lfd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek close(rctx->priv_lfd);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return EIO;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstatic int sss_responder_ctx_destructor(void *ptr)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct resp_ctx *rctx = talloc_get_type(ptr, struct resp_ctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* mark that we are shutting down the responder, so it is propagated
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek * into underlying contexts that are freed right before rctx */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("Responder is being shut down\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->shutting_down = true;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return 0;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekint sss_process_init(TALLOC_CTX *mem_ctx,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct tevent_context *ev,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct confdb_ctx *cdb,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct sss_cmd_table sss_cmds[],
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek const char *sss_pipe_name,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek const char *sss_priv_pipe_name,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek const char *confdb_service_path,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek const char *svc_name,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek uint16_t svc_version,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct sbus_interface *monitor_intf,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek const char *cli_name,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct sbus_interface *dp_intf,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct resp_ctx **responder_ctx)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct resp_ctx *rctx;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct sss_domain_info *dom;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx = talloc_zero(mem_ctx, struct resp_ctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!rctx) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("fatal error initializing resp_ctx\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ENOMEM;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->ev = ev;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->cdb = cdb;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->sss_cmds = sss_cmds;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->sock_name = sss_pipe_name;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->priv_sock_name = sss_priv_pipe_name;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->confdb_service_path = confdb_service_path;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->shutting_down = false;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_set_destructor((TALLOC_CTX*)rctx, sss_responder_ctx_destructor);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = confdb_get_int(rctx->cdb, rctx->confdb_service_path,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek CONFDB_RESPONDER_CLI_IDLE_TIMEOUT,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek CONFDB_RESPONDER_CLI_IDLE_DEFAULT_TIMEOUT,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek &rctx->client_idle_timeout);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Cannot get the client idle timeout [%d]: %s\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret, strerror(ret)));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto fail;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Ensure that the client timeout is at least ten seconds */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (rctx->client_idle_timeout < 10) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->client_idle_timeout = 10;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = confdb_get_int(rctx->cdb, rctx->confdb_service_path,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek CONFDB_RESPONDER_GET_DOMAINS_TIMEOUT,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek GET_DOMAINS_DEFAULT_TIMEOUT, &rctx->domains_timeout);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Cannnot get the default domain timeout [%d]: %s\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret, strerror(ret)));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto fail;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (rctx->domains_timeout < 0) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_CONF_SETTINGS, ("timeout can't be set to negative value, setting default\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek rctx->domains_timeout = GET_DOMAINS_DEFAULT_TIMEOUT;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = confdb_get_domains(rctx->cdb, &rctx->domains);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("fatal error setting up domain map\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto fail;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = confdb_get_string(rctx->cdb, rctx, CONFDB_MONITOR_CONF_ENTRY,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek CONFDB_MONITOR_DEFAULT_DOMAIN, NULL,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek &rctx->default_domain);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Cannnot get the default domain [%d]: %s\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret, strerror(ret)));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto fail;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = sss_monitor_init(rctx, rctx->ev, monitor_intf,
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek svc_name, svc_version, rctx,
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek &rctx->mon_conn);
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek if (ret != EOK) {
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek DEBUG(0, ("fatal error setting up message bus\n"));
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek goto fail;
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek for (dom = rctx->domains; dom; dom = get_next_domain(dom, false)) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = sss_names_init(rctx->cdb, rctx->cdb, dom->name, &dom->names);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_FATAL_FAILURE,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("fatal error initializing regex data for domain: %s\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek dom->name));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto fail;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* skip local domain, it doesn't have a backend */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (strcasecmp(dom->provider, "local") == 0) {
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek continue;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = sss_dp_init(rctx, dp_intf, cli_name, dom);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("fatal error setting up backend connector\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto fail;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = sysdb_init(rctx, rctx->domains, false);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek SYSDB_VERSION_ERROR_DAEMON(ret);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("fatal error initializing resp_ctx\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto fail;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* after all initializations we are ready to listen on our socket */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = set_unix_socket(rctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(0, ("fatal error initializing socket\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek goto fail;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* Create DP request table */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ret = sss_hash_create(rctx, 30, &rctx->dp_request_table);
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek if (ret != EOK) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_FATAL_FAILURE,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Could not create hash table for the request queue\n"));
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek goto fail;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("Responder Initialization complete\n"));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek *responder_ctx = rctx;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek return EOK;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekfail:
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek talloc_free(rctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ret;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek}
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekint sss_dp_get_domain_conn(struct resp_ctx *rctx, const char *domain,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct be_conn **_conn)
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek{
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek struct be_conn *iter;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek if (!rctx->be_conns) return ENOENT;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek for (iter = rctx->be_conns; iter; iter = iter->next) {
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek if (strcasecmp(domain, iter->domain->name) == 0) break;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek }
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek if (!iter) return ENOENT;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek *_conn = iter;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek return EOK;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekstruct sss_domain_info *
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekresponder_get_domain(struct resp_ctx *rctx, const char *name)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct sss_domain_info *dom;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct sss_domain_info *ret_dom = NULL;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek for (dom = rctx->domains; dom; dom = get_next_domain(dom, true)) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (dom->disabled) {
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek continue;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek }
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek if (strcasecmp(dom->name, name) == 0 ||
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek (dom->flat_name != NULL &&
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek strcasecmp(dom->flat_name, name) == 0)) {
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek ret_dom = dom;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek break;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek }
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (!ret_dom) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Unknown domain [%s], checking for "
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek "possible subdomains!\n", name));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek }
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return ret_dom;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekerrno_t responder_get_domain_by_id(struct resp_ctx *rctx, const char *id,
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek struct sss_domain_info **_ret_dom)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct sss_domain_info *dom;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct sss_domain_info *ret_dom = NULL;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek size_t id_len;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek size_t dom_id_len;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek int ret;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek if (id == NULL || _ret_dom == NULL) {
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek return EINVAL;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek }
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek id_len = strlen(id);
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek for (dom = rctx->domains; dom; dom = get_next_domain(dom, true)) {
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek if (dom->disabled || dom->domain_id == NULL) {
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek continue;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek }
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek dom_id_len = strlen(dom->domain_id);
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek if ((id_len >= dom_id_len) &&
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek strncasecmp(dom->domain_id, id, dom_id_len) == 0) {
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek if (IS_SUBDOMAIN(dom) &&
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek ((time(NULL) - dom->parent->subdomains_last_checked.tv_sec) >
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek rctx->domains_timeout)) {
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("Domain entry with id [%s] " \
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek "is expired.\n", id));
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek ret = EAGAIN;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek goto done;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek }
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek ret_dom = dom;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek break;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek }
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek }
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek if (ret_dom == NULL) {
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Unknown domain id [%s], checking for "
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek "possible subdomains!\n", id));
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek ret = ENOENT;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek } else {
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek *_ret_dom = ret_dom;
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek ret = EOK;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek }
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozekdone:
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek return ret;
5dfb1257f62839eea1c31669cf3bbcb114c22183Jakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekint responder_logrotate(DBusMessage *message,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct sbus_connection *conn)
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek errno_t ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct resp_ctx *rctx = talloc_get_type(sbus_conn_get_private_data(conn),
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct resp_ctx);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek ret = monitor_common_rotate_logs(rctx->cdb, rctx->confdb_service_path);
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek if (ret != EOK) return ret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek return monitor_common_pong(message, conn);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek}
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozekvoid responder_set_fd_limit(rlim_t fd_limit)
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek{
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek struct rlimit current_limit, new_limit;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek int limret;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek /* First, let's see if we have permission to just set
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek * the value as-is.
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek */
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek new_limit.rlim_cur = fd_limit;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek new_limit.rlim_max = fd_limit;
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek limret = setrlimit(RLIMIT_NOFILE, &new_limit);
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek if (limret == 0) {
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek DEBUG(SSSDBG_CONF_SETTINGS,
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek ("Maximum file descriptors set to [%d]\n",
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek new_limit.rlim_cur));
9e80079370ff3b943832adc3c5ef430e64be0a0cJakub Hrozek return;
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek }
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek /* We couldn't set the soft and hard limits to this
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek * value. Let's see how high we CAN set it.
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek */
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek /* Determine the maximum hard limit */
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek limret = getrlimit(RLIMIT_NOFILE, &current_limit);
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek if (limret == 0) {
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek DEBUG(SSSDBG_TRACE_INTERNAL,
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek ("Current fd limit: [%d]\n",
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek current_limit.rlim_cur));
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek /* Choose the lesser of the requested and the hard limit */
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek if (current_limit.rlim_max < fd_limit) {
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek new_limit.rlim_cur = current_limit.rlim_max;
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek } else {
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek new_limit.rlim_cur = fd_limit;
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek }
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek new_limit.rlim_max = current_limit.rlim_max;
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek limret = setrlimit(RLIMIT_NOFILE, &new_limit);
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek if (limret == 0) {
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek DEBUG(SSSDBG_CONF_SETTINGS,
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek ("Maximum file descriptors set to [%d]\n",
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek new_limit.rlim_cur));
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek } else {
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek ("Could not set new fd limits. Proceeding with [%d]\n",
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek current_limit.rlim_cur));
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek }
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek } else {
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek ("Could not determine fd limits. "
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek "Proceeding with system values\n"));
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek }
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek}
c83ebdbc0629313ef6594215ed1674b9a783cfddJakub Hrozek