[SSSD] [PATCH] Cherry-pick the InfoPipe patches to sssd-1-11
Jakub Hrozek
jhrozek at redhat.com
Mon Jun 2 16:36:12 UTC 2014
Hi,
another cherry-pick mail, this time with the IFP responder. Only the
first patch had to be amended in the conf_macros.m4 and confdb.h files.
-------------- next part --------------
>From 1f5aef524fe51e572b882c744cb8b483b4aed38b Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Wed, 2 Oct 2013 14:59:35 +0200
Subject: [PATCH 1/3] IFP: Re-add the InfoPipe server
Related:
https://fedorahosted.org/sssd/ticket/2072
This commit only adds the responder and the needed plumbing. No DBus
related code is in yet.
(cherry picked from commit cb4d5b588e704114b7090678752d33512baa718e)
Conflicts:
src/conf_macros.m4
src/confdb/confdb.h
---
Makefile.am | 19 +++
configure.ac | 1 +
contrib/sssd.spec.in | 17 +++
src/conf_macros.m4 | 16 +++
src/confdb/confdb.h | 3 +
src/man/Makefile.am | 9 +-
src/man/include/seealso.xml | 6 +
src/man/sssd-ifp.5.xml | 46 +++++++
src/man/sssd.conf.5.xml | 1 +
src/monitor/monitor.c | 2 +-
src/providers/data_provider_be.c | 2 +
src/providers/dp_backend.h | 1 +
src/responder/common/responder.h | 1 +
src/responder/common/responder_sbus.h | 3 +
src/responder/ifp/ifp_private.h | 35 ++++++
src/responder/ifp/ifpsrv.c | 227 ++++++++++++++++++++++++++++++++++
src/responder/ifp/ifpsrv_cmd.c | 32 +++++
17 files changed, 419 insertions(+), 2 deletions(-)
create mode 100644 src/man/sssd-ifp.5.xml
create mode 100644 src/responder/ifp/ifp_private.h
create mode 100644 src/responder/ifp/ifpsrv.c
create mode 100644 src/responder/ifp/ifpsrv_cmd.c
diff --git a/Makefile.am b/Makefile.am
index 79ab0fda5abb2612ce69388351b1225c154404ad..7b756c670f59e30a1e0a07d12b0734faf7c14146 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -107,6 +107,10 @@ endif
if BUILD_SSH
sssdlibexec_PROGRAMS += sssd_ssh
endif
+if BUILD_IFP
+sssdlibexec_PROGRAMS += sssd_ifp
+endif
+
if BUILD_PAC_RESPONDER
sssdlibexec_PROGRAMS += sssd_pac
@@ -305,6 +309,7 @@ AM_CPPFLAGS = \
-DSSS_SUDO_SOCKET_NAME=\"$(pipepath)/sudo\" \
-DSSS_AUTOFS_SOCKET_NAME=\"$(pipepath)/autofs\" \
-DSSS_SSH_SOCKET_NAME=\"$(pipepath)/ssh\" \
+ -DSSS_IFP_SOCKET_NAME=\"$(pipepath)/ifp\" \
-DLOCALEDIR=\"$(localedir)\"
EXTRA_DIST = build/config.rpath
@@ -441,6 +446,7 @@ dist_noinst_HEADERS = \
src/responder/sudo/sudosrv_private.h \
src/responder/autofs/autofs_private.h \
src/responder/ssh/sshsrv_private.h \
+ src/responder/ifp/ifp_private.h \
src/sbus/sbus_client.h \
src/sbus/sssd_dbus.h \
src/sbus/sssd_dbus_meta.h \
@@ -772,6 +778,19 @@ sssd_pac_LDADD = \
libsss_idmap.la \
$(SSSD_INTERNAL_LTLIBS)
+if BUILD_IFP
+sssd_ifp_SOURCES = \
+ src/responder/ifp/ifpsrv.c \
+ src/responder/ifp/ifpsrv_cmd.c \
+ $(SSSD_UTIL_OBJ) \
+ $(SSSD_RESPONDER_OBJ)
+sssd_ifp_CFLAGS = \
+ $(AM_CFLAGS)
+sssd_ifp_LDADD = \
+ $(SSSD_LIBS) \
+ $(SSSD_INTERNAL_LTLIBS)
+endif
+
sssd_be_SOURCES = \
src/providers/data_provider_be.c \
src/providers/data_provider_fo.c \
diff --git a/configure.ac b/configure.ac
index 636f87b259203dd6824eae033271256562e0cf39..49f2a64b39e911803f1816cb25e02ea7dd57a39c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -124,6 +124,7 @@ WITH_SUDO
WITH_SUDO_LIB_PATH
WITH_AUTOFS
WITH_SSH
+WITH_IFP
WITH_CRYPTO
WITH_SAMBA
diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
index 92924518c9a4ea808d117dc0b8465c57f0f5bef9..61e6e33efd7ee4315bd8e930feef8c33ad1c372e 100644
--- a/contrib/sssd.spec.in
+++ b/contrib/sssd.spec.in
@@ -380,6 +380,16 @@ Requires: libsss_nss_idmap = %{version}-%{release}
The libsss_nss_idmap-python contains the bindings so that libsss_nss_idmap can
be used by Python applications.
+%package dbus
+Summary: The D-Bus responder of the SSSD
+Group: Applications/System
+License: GPLv3+
+Requires: sssd-common = %{version}-%{release}
+
+%description dbus
+Provides the D-Bus responder of the SSSD, called the InfoPipe, that allows
+the information from the SSSD to be transmitted over the system bus.
+
%prep
%setup -q -n %{name}-%{version}
@@ -538,6 +548,7 @@ rm -rf $RPM_BUILD_ROOT
%{_libexecdir}/%{servicename}/sssd_autofs
%{_libexecdir}/%{servicename}/sssd_ssh
%{_libexecdir}/%{servicename}/sssd_sudo
+%{_libexecdir}/%{servicename}/sssd_ifp
%dir %{_libdir}/%{name}
%{_libdir}/%{name}/libsss_simple.so
@@ -632,6 +643,12 @@ rm -rf $RPM_BUILD_ROOT
%{_libexecdir}/%{servicename}/proxy_child
%{_libdir}/%{name}/libsss_proxy.so
+%files dbus
+%defattr(-,root,root,-)
+%doc COPYING
+%{_libexecdir}/%{servicename}/sssd_ifp
+%{_mandir}/man5/sssd-ifp.5*
+
%files client -f sssd_client.lang
%defattr(-,root,root,-)
%doc src/sss_client/COPYING src/sss_client/COPYING.LESSER
diff --git a/src/conf_macros.m4 b/src/conf_macros.m4
index 554e303b6879eb8c7caa879b8ea2c70f8747c051..c12175f229a32cddfaa8fef7b37e0ca06a5f8d93 100644
--- a/src/conf_macros.m4
+++ b/src/conf_macros.m4
@@ -608,3 +608,19 @@ AC_DEFUN([WITH_SAMBA],
fi
AM_CONDITIONAL([BUILD_SAMBA], [test x"$with_samba" = xyes])
])
+
+AC_DEFUN([WITH_IFP],
+ [ AC_ARG_WITH([infopipe],
+ [AC_HELP_STRING([--with-infopipe],
+ [Whether to build with InfoPipe support [yes]]
+ )
+ ],
+ [with_infopipe=$withval],
+ with_infopipe=yes
+ )
+
+ if test x"$with_infopipe" = xyes; then
+ AC_DEFINE(BUILD_IFP, 1, [whether to build with InfoPipe support])
+ fi
+ AM_CONDITIONAL([BUILD_IFP], [test x"$with_infopipe" = xyes])
+ ])
diff --git a/src/confdb/confdb.h b/src/confdb/confdb.h
index c997e6e942b0fe57effc7ca602bac9f4647ffa3e..75f272eee58ae66872b6236dfd0c921b00812c14 100644
--- a/src/confdb/confdb.h
+++ b/src/confdb/confdb.h
@@ -132,6 +132,9 @@
/* Data Provider */
#define CONFDB_DP_CONF_ENTRY "config/dp"
+/* InfoPipe */
+#define CONFDB_IFP_CONF_ENTRY "config/ifp"
+
/* Domains */
#define CONFDB_DOMAIN_PATH_TMPL "config/domain/%s"
#define CONFDB_DOMAIN_BASEDN "cn=domain,cn=config"
diff --git a/src/man/Makefile.am b/src/man/Makefile.am
index ccf1c053e437b00ecc53ef61baf85e6754950628..03caef2ee55689b82769e6b624e3dda619c50a93 100644
--- a/src/man/Makefile.am
+++ b/src/man/Makefile.am
@@ -21,7 +21,10 @@ endif
if BUILD_PAC_RESPONDER
PAC_RESPONDER_CONDS = ;with_pac_responder
endif
-CONDS = with_false$(SUDO_CONDS)$(AUTOFS_CONDS)$(SSH_CONDS)$(PAC_RESPONDER_CONDS)
+if BUILD_IFP
+IFP_CONDS = ;with_ifp
+endif
+CONDS = with_false$(SUDO_CONDS)$(AUTOFS_CONDS)$(SSH_CONDS)$(PAC_RESPONDER_CONDS)$(IFP_CONDS)
#Special Rules:
@@ -52,6 +55,10 @@ if BUILD_SUDO
man_MANS += sssd-sudo.5
endif
+if BUILD_IFP
+man_MANS += sssd-ifp.5
+endif
+
SUFFIXES = .1.xml .1 .3.xml .3 .5.xml .5 .8.xml .8
.1.xml.1:
$(XMLLINT) $(XMLLINT_FLAGS) $<
diff --git a/src/man/include/seealso.xml b/src/man/include/seealso.xml
index 4f7943113e2ff50172f652bf919713092d0b985b..992e64b76102f1b8b9a693fa92f35df1bb2048e2 100644
--- a/src/man/include/seealso.xml
+++ b/src/man/include/seealso.xml
@@ -74,6 +74,12 @@
<manvolnum>8</manvolnum>
</citerefentry>,
</phrase>
+ <phrase condition="with_ifp">
+ <citerefentry>
+ <refentrytitle>sssd-ifp</refentrytitle>
+ <manvolnum>5</manvolnum>
+ </citerefentry>,
+ </phrase>
<citerefentry>
<refentrytitle>pam_sss</refentrytitle><manvolnum>8</manvolnum>
</citerefentry>.
diff --git a/src/man/sssd-ifp.5.xml b/src/man/sssd-ifp.5.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dfac252984f365582519c6ceb5e553633813c761
--- /dev/null
+++ b/src/man/sssd-ifp.5.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE reference PUBLIC "-//OASIS//DTD DocBook V4.4//EN"
+"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
+<reference>
+<title>SSSD Manual pages</title>
+<refentry>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="include/upstream.xml" />
+
+ <refmeta>
+ <refentrytitle>sssd-ifp</refentrytitle>
+ <manvolnum>5</manvolnum>
+ <refmiscinfo class="manual">File Formats and Conventions</refmiscinfo>
+ </refmeta>
+
+ <refnamediv id='name'>
+ <refname>sssd-ifp</refname>
+ <refpurpose>SSSD InfoPipe responder</refpurpose>
+ </refnamediv>
+
+ <refsect1 id='description'>
+ <title>DESCRIPTION</title>
+ <para>
+ This manual page describes the configuration of the InfoPipe responder
+ for
+ <citerefentry>
+ <refentrytitle>sssd</refentrytitle>
+ <manvolnum>8</manvolnum>
+ </citerefentry>.
+ For a detailed syntax reference, refer to the <quote>FILE FORMAT</quote> section of the
+ <citerefentry>
+ <refentrytitle>sssd.conf</refentrytitle>
+ <manvolnum>5</manvolnum>
+ </citerefentry> manual page.
+ </para>
+ <para>
+ The InfoPipe responder provides a public D-Bus interface
+ accessible over the system bus. The interface allows the user
+ to query information about remote users and groups over the
+ system bus.
+ </para>
+ </refsect1>
+
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="include/seealso.xml" />
+
+</refentry>
+</reference>
diff --git a/src/man/sssd.conf.5.xml b/src/man/sssd.conf.5.xml
index 52a1851b1355dd7277beaecc43684db70d846b88..854b5501995a9a727f0634cf5409000ac9ebc3fa 100644
--- a/src/man/sssd.conf.5.xml
+++ b/src/man/sssd.conf.5.xml
@@ -91,6 +91,7 @@
<phrase condition="with_autofs">, autofs</phrase>
<phrase condition="with_ssh">, ssh</phrase>
<phrase condition="with_pac_responder">, pac</phrase>
+ <phrase condition="with_ifp">, ifp</phrase>
</para>
</listitem>
</varlistentry>
diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c
index aaf3e56f08fff8a666f522269758634b064ada0e..4c6ab517edc94c94ce6efbca82c1512a3e55c6a4 100644
--- a/src/monitor/monitor.c
+++ b/src/monitor/monitor.c
@@ -870,7 +870,7 @@ done:
static char *check_services(char **services)
{
const char *known_services[] = { "nss", "pam", "sudo", "autofs", "ssh",
- "pac", NULL };
+ "pac", "ifp", NULL };
int i;
int ii;
diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c
index ac703b821d1f1bb84542743e5ac03ee0a7058f70..240f60318c2c3b3fd10f1cf91f43071f37c38b6d 100644
--- a/src/providers/data_provider_be.c
+++ b/src/providers/data_provider_be.c
@@ -2014,6 +2014,8 @@ static int client_registration(struct sbus_request *dbus_req, void *data)
becli->bectx->ssh_cli = becli;
} else if (strcasecmp(cli_name, "PAC") == 0) {
becli->bectx->pac_cli = becli;
+ } else if (strcasecmp(cli_name, "InfoPipe") == 0) {
+ becli->bectx->ifp_cli = becli;
} else {
DEBUG(SSSDBG_CRIT_FAILURE, "Unknown client! [%s]\n", cli_name);
}
diff --git a/src/providers/dp_backend.h b/src/providers/dp_backend.h
index ed022c2079b4ca490b86644d279703976188423e..8e3a68a5b46998c3e0bd9752a6aec28e1764ed09 100644
--- a/src/providers/dp_backend.h
+++ b/src/providers/dp_backend.h
@@ -143,6 +143,7 @@ struct be_ctx {
struct be_client *autofs_cli;
struct be_client *ssh_cli;
struct be_client *pac_cli;
+ struct be_client *ifp_cli;
struct loaded_be loaded_be[BET_MAX];
struct bet_info bet_info[BET_MAX];
diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h
index 98e363c3efcc29de3224336c2dbc069861f09b3d..ce89cfa6374e1ea4f1335a86325ba319aaf02bf6 100644
--- a/src/responder/common/responder.h
+++ b/src/responder/common/responder.h
@@ -33,6 +33,7 @@
#include "dhash.h"
#include "sbus/sssd_dbus.h"
#include "sss_client/sss_cli.h"
+#include "util/util.h"
extern hash_table_t *dp_requests;
diff --git a/src/responder/common/responder_sbus.h b/src/responder/common/responder_sbus.h
index 4927d72a750cf2827710298af638513a30154b54..ca1ce512b83954ab44c1ca7b860d8ecc20b0ccd3 100644
--- a/src/responder/common/responder_sbus.h
+++ b/src/responder/common/responder_sbus.h
@@ -37,6 +37,9 @@
#define SSS_SSH_SBUS_SERVICE_NAME "ssh"
#define SSS_SSH_SBUS_SERVICE_VERSION 0x0001
+#define SSS_IFP_SBUS_SERVICE_NAME "ifp"
+#define SSS_IFP_SBUS_SERVICE_VERSION 0x0001
+
#define PAC_SBUS_SERVICE_NAME "pac"
#define PAC_SBUS_SERVICE_VERSION 0x0001
diff --git a/src/responder/ifp/ifp_private.h b/src/responder/ifp/ifp_private.h
new file mode 100644
index 0000000000000000000000000000000000000000..32c7281ea40e3e12c3e2db9b1439bec713399fea
--- /dev/null
+++ b/src/responder/ifp/ifp_private.h
@@ -0,0 +1,35 @@
+/*
+ Authors:
+ Jakub Hrozek <jhrozek at redhat.com>
+ Stephen Gallagher <sgallagh at redhat.com>
+
+ Copyright (C) 2013 Red Hat
+
+ InfoPipe responder: A private header
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _IFPSRV_PRIVATE_H_
+#define _IFPSRV_PRIVATE_H_
+
+#include "responder/common/responder.h"
+#include "providers/data_provider.h"
+
+struct ifp_ctx {
+ struct resp_ctx *rctx;
+ struct sss_names_ctx *snctx;
+};
+
+#endif /* _IFPSRV_PRIVATE_H_ */
diff --git a/src/responder/ifp/ifpsrv.c b/src/responder/ifp/ifpsrv.c
new file mode 100644
index 0000000000000000000000000000000000000000..06434c328359bdbf9e9241252eee0392c3017bce
--- /dev/null
+++ b/src/responder/ifp/ifpsrv.c
@@ -0,0 +1,227 @@
+/*
+ Authors:
+ Jakub Hrozek <jhrozek at redhat.com>
+
+ Copyright (C) 2013 Red Hat
+
+ InfoPipe responder: the responder server
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <string.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <popt.h>
+#include <dbus/dbus.h>
+
+#include "util/util.h"
+#include "sbus/sssd_dbus.h"
+#include "monitor/monitor_interfaces.h"
+#include "confdb/confdb.h"
+#include "responder/ifp/ifp_private.h"
+#include "responder/common/responder_sbus.h"
+
+struct mon_cli_iface monitor_ifp_methods = {
+ { &mon_cli_iface_meta, 0 },
+ .ping = monitor_common_pong,
+ .resInit = monitor_common_res_init,
+ .shutDown = NULL,
+ .goOffline = NULL,
+ .resetOffline = NULL,
+ .rotateLogs = responder_logrotate,
+};
+
+static struct data_provider_iface ifp_dp_methods = {
+ { &data_provider_iface_meta, 0 },
+ .RegisterService = NULL,
+ .pamHandler = NULL,
+ .sudoHandler = NULL,
+ .autofsHandler = NULL,
+ .hostHandler = NULL,
+ .getDomains = NULL,
+ .getAccountInfo = NULL,
+};
+
+struct sss_cmd_table *get_ifp_cmds(void)
+{
+ static struct sss_cmd_table ifp_cmds[] = {
+ { SSS_GET_VERSION, sss_cmd_get_version },
+ { SSS_CLI_NULL, NULL}
+ };
+
+ return ifp_cmds;
+}
+
+static void ifp_dp_reconnect_init(struct sbus_connection *conn,
+ int status, void *pvt)
+{
+ struct be_conn *be_conn = talloc_get_type(pvt, struct be_conn);
+ int ret;
+
+ /* Did we reconnect successfully? */
+ if (status == SBUS_RECONNECT_SUCCESS) {
+ DEBUG(SSSDBG_TRACE_FUNC, "Reconnected to the Data Provider.\n");
+
+ /* Identify ourselves to the data provider */
+ ret = dp_common_send_id(be_conn->conn,
+ DATA_PROVIDER_VERSION,
+ "InfoPipe");
+ /* all fine */
+ if (ret == EOK) {
+ handle_requests_after_reconnect(be_conn->rctx);
+ return;
+ }
+ }
+
+ /* Failed to reconnect */
+ DEBUG(SSSDBG_FATAL_FAILURE, "Could not reconnect to %s provider.\n",
+ be_conn->domain->name);
+}
+
+int ifp_process_init(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct confdb_ctx *cdb)
+{
+ struct resp_ctx *rctx;
+ struct sss_cmd_table *ifp_cmds;
+ struct ifp_ctx *ifp_ctx;
+ struct be_conn *iter;
+ int ret;
+ int max_retries;
+
+ ifp_cmds = get_ifp_cmds();
+ ret = sss_process_init(mem_ctx, ev, cdb,
+ ifp_cmds,
+ SSS_IFP_SOCKET_NAME, NULL,
+ CONFDB_IFP_CONF_ENTRY,
+ SSS_IFP_SBUS_SERVICE_NAME,
+ SSS_IFP_SBUS_SERVICE_VERSION,
+ &monitor_ifp_methods,
+ "InfoPipe",
+ &ifp_dp_methods.vtable,
+ &rctx);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_FATAL_FAILURE, "sss_process_init() failed\n");
+ return ret;
+ }
+
+ ifp_ctx = talloc_zero(rctx, struct ifp_ctx);
+ if (ifp_ctx == NULL) {
+ DEBUG(SSSDBG_FATAL_FAILURE, "fatal error initializing ifp_ctx\n");
+ ret = ENOMEM;
+ goto fail;
+ }
+
+ ifp_ctx->rctx = rctx;
+ ifp_ctx->rctx->pvt_ctx = ifp_ctx;
+
+ ret = sss_names_init_from_args(ifp_ctx,
+ "(?P<name>[^@]+)@?(?P<domain>[^@]*$)",
+ "%1$s@%2$s", &ifp_ctx->snctx);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_FATAL_FAILURE, "fatal error initializing regex data\n");
+ goto fail;
+ }
+
+ /* Enable automatic reconnection to the Data Provider */
+ ret = confdb_get_int(ifp_ctx->rctx->cdb,
+ CONFDB_IFP_CONF_ENTRY,
+ CONFDB_SERVICE_RECON_RETRIES,
+ 3, &max_retries);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_FATAL_FAILURE,
+ "Failed to set up automatic reconnection\n");
+ goto fail;
+ }
+
+ for (iter = ifp_ctx->rctx->be_conns; iter; iter = iter->next) {
+ sbus_reconnect_init(iter->conn, max_retries,
+ ifp_dp_reconnect_init, iter);
+ }
+
+ ret = schedule_get_domains_task(rctx, rctx->ev, rctx);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_FATAL_FAILURE, "schedule_get_domains_tasks failed.\n");
+ goto fail;
+ }
+
+ DEBUG(SSSDBG_TRACE_FUNC, "InfoPipe Initialization complete\n");
+ return EOK;
+
+fail:
+ talloc_free(rctx);
+ return ret;
+}
+
+int main(int argc, const char *argv[])
+{
+ int opt;
+ poptContext pc;
+ struct main_context *main_ctx;
+ int ret;
+
+ struct poptOption long_options[] = {
+ POPT_AUTOHELP
+ SSSD_MAIN_OPTS
+ POPT_TABLEEND
+ };
+
+ /* Set debug level to invalid value so we can deside if -d 0 was used. */
+ debug_level = SSSDBG_INVALID;
+
+ pc = poptGetContext(argv[0], argc, argv, long_options, 0);
+ while((opt = poptGetNextOpt(pc)) != -1) {
+ switch(opt) {
+ default:
+ fprintf(stderr, "\nInvalid option %s: %s\n\n",
+ poptBadOption(pc, 0), poptStrerror(opt));
+ poptPrintUsage(pc, stderr, 0);
+ return 1;
+ }
+ }
+
+ poptFreeContext(pc);
+
+ DEBUG_INIT(debug_level);
+
+ /* set up things like debug, signals, daemonization, etc... */
+ debug_log_file = "sssd_ifp";
+
+ ret = server_setup("sssd[ifp]", 0, CONFDB_IFP_CONF_ENTRY, &main_ctx);
+ if (ret != EOK) return 2;
+
+ ret = die_if_parent_died();
+ if (ret != EOK) {
+ /* This is not fatal, don't return */
+ DEBUG(SSSDBG_MINOR_FAILURE,
+ "Could not set up to exit when parent process does\n");
+ }
+
+ ret = ifp_process_init(main_ctx,
+ main_ctx->event_ctx,
+ main_ctx->confdb_ctx);
+ if (ret != EOK) return 3;
+
+ /* loop on main */
+ server_loop(main_ctx);
+ return 0;
+}
diff --git a/src/responder/ifp/ifpsrv_cmd.c b/src/responder/ifp/ifpsrv_cmd.c
new file mode 100644
index 0000000000000000000000000000000000000000..b9641ff605dc777fb3279751b08a995d148b12e5
--- /dev/null
+++ b/src/responder/ifp/ifpsrv_cmd.c
@@ -0,0 +1,32 @@
+/*
+ Authors:
+ Jakub Hrozek <jhrozek at redhat.com>
+
+ Copyright (C) 2013 Red Hat
+
+ InfoPipe responder: the responder commands
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "responder/ifp/ifp_private.h"
+
+struct cli_protocol_version *register_cli_protocol_version(void)
+{
+ static struct cli_protocol_version ssh_cli_protocol_version[] = {
+ {0, NULL, NULL}
+ };
+
+ return ssh_cli_protocol_version;
+}
--
1.9.0
-------------- next part --------------
>From f5dc28c2f2ea3dd81cf5bc819b22ad7cf8deb2ad Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Mon, 6 Jan 2014 15:15:40 +0100
Subject: [PATCH 2/3] IFP: Connect to the system bus
Related:
https://fedorahosted.org/sssd/ticket/2072
Adds the possibility for the InfoPipe responder to connect to the system bus.
At the moment, only a dummy method "Ping" is provided. The method only
accepts a single string parameter that has to be 'ping'.
(cherry picked from commit 8214510f125879c3b1d247f2ce981ee20b5375d1)
---
Makefile.am | 9 +-
contrib/sssd.spec.in | 2 +
src/responder/ifp/ifp_iface.xml | 10 ++
src/responder/ifp/ifp_iface_generated.c | 25 +++++
src/responder/ifp/ifp_iface_generated.h | 49 +++++++++
src/responder/ifp/ifp_private.h | 14 +++
src/responder/ifp/ifpsrv.c | 110 ++++++++++++++++++++-
src/responder/ifp/ifpsrv_cmd.c | 36 +++++++
.../ifp/org.freedesktop.sssd.infopipe.conf | 22 +++++
9 files changed, 275 insertions(+), 2 deletions(-)
create mode 100644 src/responder/ifp/ifp_iface.xml
create mode 100644 src/responder/ifp/ifp_iface_generated.c
create mode 100644 src/responder/ifp/ifp_iface_generated.h
create mode 100644 src/responder/ifp/org.freedesktop.sssd.infopipe.conf
diff --git a/Makefile.am b/Makefile.am
index 7b756c670f59e30a1e0a07d12b0734faf7c14146..fe78211fccd77934aeee6488a13c13b5ae295907 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -36,6 +36,7 @@ sssdconfdir = $(sysconfdir)/sssd
sssddatadir = $(datadir)/sssd
sssdapiplugindir = $(sssddatadir)/sssd.api.d
dbusintrospectdir = $(datarootdir)/sssd/introspect
+dbuspolicydir = $(sysconfdir)/dbus-1/system.d
localedir = @localedir@
nsslibdir = @nsslibdir@
pamlibdir = @pammoddir@
@@ -660,7 +661,8 @@ include_HEADERS = \
CODEGEN_XML = \
$(srcdir)/src/tests/sbus_codegen_tests.xml \
$(srcdir)/src/monitor/monitor_iface.xml \
- $(srcdir)/src/providers/data_provider_iface.xml
+ $(srcdir)/src/providers/data_provider_iface.xml \
+ $(srcdir)/src/responder/ifp/ifp_iface.xml
SBUS_CODEGEN = src/sbus/sbus_codegen
@@ -782,6 +784,8 @@ if BUILD_IFP
sssd_ifp_SOURCES = \
src/responder/ifp/ifpsrv.c \
src/responder/ifp/ifpsrv_cmd.c \
+ src/responder/ifp/ifp_iface_generated.c \
+ src/responder/ifp/ifp_iface_generated.h \
$(SSSD_UTIL_OBJ) \
$(SSSD_RESPONDER_OBJ)
sssd_ifp_CFLAGS = \
@@ -789,6 +793,8 @@ sssd_ifp_CFLAGS = \
sssd_ifp_LDADD = \
$(SSSD_LIBS) \
$(SSSD_INTERNAL_LTLIBS)
+dist_dbuspolicy_DATA = \
+ src/responder/ifp/org.freedesktop.sssd.infopipe.conf
endif
sssd_be_SOURCES = \
@@ -2163,6 +2169,7 @@ installsssddirs::
$(DESTDIR)$(pluginpath) \
$(DESTDIR)$(libdir)/ldb \
$(DESTDIR)$(dbusintrospectdir) \
+ $(DESTDIR)$(dbuspolicydir) \
$(DESTDIR)$(pipepath)/private \
$(DESTDIR)$(sssdlibdir) \
$(DESTDIR)$(pkglibdir) \
diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
index 61e6e33efd7ee4315bd8e930feef8c33ad1c372e..916527da7640a01563cd8634032a411a78a066c6 100644
--- a/contrib/sssd.spec.in
+++ b/contrib/sssd.spec.in
@@ -648,6 +648,8 @@ rm -rf $RPM_BUILD_ROOT
%doc COPYING
%{_libexecdir}/%{servicename}/sssd_ifp
%{_mandir}/man5/sssd-ifp.5*
+# InfoPipe DBus plumbing
+%{_sysconfdir}/dbus-1/system.d/org.freedesktop.sssd.infopipe.conf
%files client -f sssd_client.lang
%defattr(-,root,root,-)
diff --git a/src/responder/ifp/ifp_iface.xml b/src/responder/ifp/ifp_iface.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e3221b577b88dc622b4a467f3ae78aa44c84927d
--- /dev/null
+++ b/src/responder/ifp/ifp_iface.xml
@@ -0,0 +1,10 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.freedesktop.sssd.infopipe">
+ <annotation value="infopipe_iface" name="org.freedesktop.DBus.GLib.CSymbol"/>
+ <method name="Ping">
+ <!-- arguments parsed manually -->
+ </method>
+ </interface>
+</node>
diff --git a/src/responder/ifp/ifp_iface_generated.c b/src/responder/ifp/ifp_iface_generated.c
new file mode 100644
index 0000000000000000000000000000000000000000..db5e0e545d8d1a956ae052be52a824ed0bf5d273
--- /dev/null
+++ b/src/responder/ifp/ifp_iface_generated.c
@@ -0,0 +1,25 @@
+/* The following definitions are auto-generated from ifp_iface.xml */
+
+#include "util/util.h"
+#include "sbus/sssd_dbus.h"
+#include "sbus/sssd_dbus_meta.h"
+#include "ifp_iface_generated.h"
+
+/* methods for org.freedesktop.sssd.infopipe */
+const struct sbus_method_meta infopipe_iface__methods[] = {
+ {
+ "Ping", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct infopipe_iface, Ping),
+ },
+ { NULL, }
+};
+
+/* interface info for org.freedesktop.sssd.infopipe */
+const struct sbus_interface_meta infopipe_iface_meta = {
+ "org.freedesktop.sssd.infopipe", /* name */
+ infopipe_iface__methods,
+ NULL, /* no signals */
+ NULL, /* no propetries */
+};
diff --git a/src/responder/ifp/ifp_iface_generated.h b/src/responder/ifp/ifp_iface_generated.h
new file mode 100644
index 0000000000000000000000000000000000000000..8db83fc115d62390560e9be94ac1480ade48296f
--- /dev/null
+++ b/src/responder/ifp/ifp_iface_generated.h
@@ -0,0 +1,49 @@
+/* The following declarations are auto-generated from ifp_iface.xml */
+
+#ifndef __IFP_IFACE_XML__
+#define __IFP_IFACE_XML__
+
+#include "sbus/sssd_dbus.h"
+
+/* ------------------------------------------------------------------------
+ * DBus Constants
+ *
+ * Various constants of interface and method names mostly for use by clients
+ */
+
+/* constants for org.freedesktop.sssd.infopipe */
+#define INFOPIPE_IFACE "org.freedesktop.sssd.infopipe"
+#define INFOPIPE_IFACE_PING "Ping"
+
+/* ------------------------------------------------------------------------
+ * DBus Vtable handler structures
+ *
+ * These structures are filled in by implementors of the different
+ * dbus interfaces to handle method calls.
+ *
+ * Handler functions of type sbus_msg_handler_fn accept raw messages,
+ * other handlers will be typed appropriately. If a handler that is
+ * set to NULL is invoked it will result in a
+ * org.freedesktop.DBus.Error.NotSupported error for the caller.
+ */
+
+/* vtable for org.freedesktop.sssd.infopipe */
+struct infopipe_iface {
+ struct sbus_vtable vtable; /* derive from sbus_vtable */
+ sbus_msg_handler_fn Ping;
+};
+
+/* ------------------------------------------------------------------------
+ * DBus Interface Metadata
+ *
+ * These structure definitions are filled in with the information about
+ * the interfaces, methods, properties and so on.
+ *
+ * The actual definitions are found in the accompanying C file next
+ * to this header.
+ */
+
+/* interface info for org.freedesktop.sssd.infopipe */
+extern const struct sbus_interface_meta infopipe_iface_meta;
+
+#endif /* __IFP_IFACE_XML__ */
diff --git a/src/responder/ifp/ifp_private.h b/src/responder/ifp/ifp_private.h
index 32c7281ea40e3e12c3e2db9b1439bec713399fea..b97cb8a7d9e55f550a3eda0e9acc034329d4ba17 100644
--- a/src/responder/ifp/ifp_private.h
+++ b/src/responder/ifp/ifp_private.h
@@ -26,10 +26,24 @@
#include "responder/common/responder.h"
#include "providers/data_provider.h"
+#include "responder/ifp/ifp_iface_generated.h"
+
+#define INFOPIPE_PATH "/org/freedesktop/sssd/infopipe"
+
+struct sysbus_ctx {
+ struct sbus_connection *conn;
+ char *introspect_xml;
+};
struct ifp_ctx {
struct resp_ctx *rctx;
struct sss_names_ctx *snctx;
+
+ struct sysbus_ctx *sysbus;
};
+/* This is a throwaway method to ease the review of the patch.
+ * It will be removed later */
+int ifp_ping(struct sbus_request *dbus_req, void *data);
+
#endif /* _IFPSRV_PRIVATE_H_ */
diff --git a/src/responder/ifp/ifpsrv.c b/src/responder/ifp/ifpsrv.c
index 06434c328359bdbf9e9241252eee0392c3017bce..accf679efe3332aa0fb57162e288ef67eaf54adb 100644
--- a/src/responder/ifp/ifpsrv.c
+++ b/src/responder/ifp/ifpsrv.c
@@ -61,6 +61,11 @@ static struct data_provider_iface ifp_dp_methods = {
.getAccountInfo = NULL,
};
+struct infopipe_iface ifp_iface = {
+ { &infopipe_iface_meta, 0 },
+ .Ping = ifp_ping,
+};
+
struct sss_cmd_table *get_ifp_cmds(void)
{
static struct sss_cmd_table ifp_cmds[] = {
@@ -97,6 +102,95 @@ static void ifp_dp_reconnect_init(struct sbus_connection *conn,
be_conn->domain->name);
}
+static errno_t
+sysbus_init(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ const char *dbus_name,
+ const char *dbus_path,
+ struct sbus_vtable *iface_vtable,
+ void *pvt,
+ struct sysbus_ctx **sysbus)
+{
+ DBusError dbus_error;
+ DBusConnection *conn = NULL;
+ struct sysbus_ctx *system_bus = NULL;
+ struct sbus_interface *sif;
+ errno_t ret;
+
+ system_bus = talloc_zero(mem_ctx, struct sysbus_ctx);
+ if (system_bus == NULL) {
+ return ENOMEM;
+ }
+
+ dbus_error_init(&dbus_error);
+
+ /* Connect to the well-known system bus */
+ conn = dbus_bus_get(DBUS_BUS_SYSTEM, &dbus_error);
+ if (conn == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Failed to connect to D-BUS system bus.\n"));
+ ret = EIO;
+ goto fail;
+ }
+ dbus_connection_set_exit_on_disconnect(conn, FALSE);
+
+ ret = dbus_bus_request_name(conn, dbus_name,
+ /* We want exclusive access */
+ DBUS_NAME_FLAG_DO_NOT_QUEUE,
+ &dbus_error);
+ if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
+ /* We were unable to register on the system bus */
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Unable to request name on the system bus.\n"));
+ ret = EIO;
+ goto fail;
+ }
+
+ DEBUG(SSSDBG_TRACE_FUNC, "Listening on %s\n", dbus_name);
+
+ /* Integrate with tevent loop */
+ ret = sbus_init_connection(system_bus, ev, conn,
+ SBUS_CONN_TYPE_SHARED,
+ &system_bus->conn);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ "Could not integrate D-BUS into mainloop.\n");
+ goto fail;
+ }
+
+ sif = sbus_new_interface(system_bus->conn,
+ dbus_path,
+ iface_vtable,
+ pvt);
+ if (sif == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ "Could not add the sbus interface\n");
+ goto fail;
+ }
+
+ ret = sbus_conn_add_interface(system_bus->conn, sif);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ "Could not add the interface\n");
+ goto fail;
+ }
+
+ *sysbus = system_bus;
+ return EOK;
+
+fail:
+ if (dbus_error_is_set(&dbus_error)) {
+ DEBUG(SSSDBG_OP_FAILURE,
+ "DBus error message: %s\n", dbus_error.message);
+ dbus_error_free(&dbus_error);
+ }
+
+ if (conn) dbus_connection_unref(conn);
+
+ talloc_free(system_bus);
+ return ret;
+}
+
int ifp_process_init(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct confdb_ctx *cdb)
@@ -158,9 +252,23 @@ int ifp_process_init(TALLOC_CTX *mem_ctx,
ifp_dp_reconnect_init, iter);
}
+ /* Connect to the D-BUS system bus and set up methods */
+ ret = sysbus_init(ifp_ctx, ifp_ctx->rctx->ev,
+ INFOPIPE_IFACE,
+ INFOPIPE_PATH,
+ &ifp_iface.vtable,
+ ifp_ctx, &ifp_ctx->sysbus);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ "Failed to connect to the system message bus\n");
+ talloc_free(ifp_ctx);
+ return EIO;
+ }
+
ret = schedule_get_domains_task(rctx, rctx->ev, rctx);
if (ret != EOK) {
- DEBUG(SSSDBG_FATAL_FAILURE, "schedule_get_domains_tasks failed.\n");
+ DEBUG(SSSDBG_FATAL_FAILURE,
+ "schedule_get_domains_tasks failed.\n");
goto fail;
}
diff --git a/src/responder/ifp/ifpsrv_cmd.c b/src/responder/ifp/ifpsrv_cmd.c
index b9641ff605dc777fb3279751b08a995d148b12e5..4f73342dd8a8e5ef34a9061634e8f10c52e59964 100644
--- a/src/responder/ifp/ifpsrv_cmd.c
+++ b/src/responder/ifp/ifpsrv_cmd.c
@@ -30,3 +30,39 @@ struct cli_protocol_version *register_cli_protocol_version(void)
return ssh_cli_protocol_version;
}
+
+/* This is a throwaway method to ease the review of the patch.
+ * It will be removed later */
+int ifp_ping(struct sbus_request *dbus_req, void *data)
+{
+ struct ifp_ctx *ifp_ctx = talloc_get_type(data, struct ifp_ctx);
+ static const char *pong = "PONG";
+ const char *request;
+ DBusError dberr;
+
+ if (ifp_ctx == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
+ return sbus_request_return_and_finish(dbus_req, DBUS_TYPE_INVALID);
+ }
+
+
+ if (!sbus_request_parse_or_finish(dbus_req,
+ DBUS_TYPE_STRING, &request,
+ DBUS_TYPE_INVALID)) {
+ return EOK; /* handled */
+ }
+
+ DEBUG(SSSDBG_CONF_SETTINGS, "Got request for [%s]\n", request);
+
+ if (strcasecmp(request, "ping") != 0) {
+ dbus_error_init(&dberr);
+ dbus_set_error_const(&dberr,
+ DBUS_ERROR_INVALID_ARGS,
+ "Ping() only accepts ping as a param\n");
+ return sbus_request_fail_and_finish(dbus_req, &dberr);
+ }
+
+ return sbus_request_return_and_finish(dbus_req,
+ DBUS_TYPE_STRING, &pong,
+ DBUS_TYPE_INVALID);
+}
diff --git a/src/responder/ifp/org.freedesktop.sssd.infopipe.conf b/src/responder/ifp/org.freedesktop.sssd.infopipe.conf
new file mode 100644
index 0000000000000000000000000000000000000000..fea847ceed6b3d0f999f4bd747cc7b16df2124a9
--- /dev/null
+++ b/src/responder/ifp/org.freedesktop.sssd.infopipe.conf
@@ -0,0 +1,22 @@
+<?xml version="1.0"?> <!--*-nxml-*-->
+<!DOCTYPE busconfig PUBLIC
+ "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+
+ <!-- This configuration file specifies the required security policies
+ for the SSSD InfoPipe to work. -->
+
+ <!-- Only root can own (provide) the SSSD service -->
+ <policy user="root">
+ <allow own="org.freedesktop.sssd.infopipe"/>
+ </policy>
+
+ <!-- Allow all methods on the interface -->
+ <!-- Right now, this will be handled by a limited ACL
+ within the InfoPipe Daemon. -->
+ <policy context="default">
+ <allow send_interface="org.freedesktop.sssd.infopipe"/>
+ </policy>
+
+</busconfig>
--
1.9.0
-------------- next part --------------
>From 828e331f446776b1511dbc06de01288af0c59140 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina at redhat.com>
Date: Fri, 28 Mar 2014 12:51:08 +0100
Subject: [PATCH 3/3] IFP: do not create client socket
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
There is no need for client socket in IFP responder,
since it uses D-Bus for communication with clients.
Resolves:
https://fedorahosted.org/sssd/ticket/2290
Reviewed-by: Pavel Březina <pbrezina at redhat.com>
(cherry picked from commit 0a6fa194bad18f417dc8542d3b8f654f898375c5)
---
Makefile.am | 1 -
src/responder/ifp/ifpsrv.c | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index fe78211fccd77934aeee6488a13c13b5ae295907..f46cc34719e08dee1977d42df6efee09bf9eea69 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -310,7 +310,6 @@ AM_CPPFLAGS = \
-DSSS_SUDO_SOCKET_NAME=\"$(pipepath)/sudo\" \
-DSSS_AUTOFS_SOCKET_NAME=\"$(pipepath)/autofs\" \
-DSSS_SSH_SOCKET_NAME=\"$(pipepath)/ssh\" \
- -DSSS_IFP_SOCKET_NAME=\"$(pipepath)/ifp\" \
-DLOCALEDIR=\"$(localedir)\"
EXTRA_DIST = build/config.rpath
diff --git a/src/responder/ifp/ifpsrv.c b/src/responder/ifp/ifpsrv.c
index accf679efe3332aa0fb57162e288ef67eaf54adb..e76f3bdb0afb997ee2bbc0122199e127da34de84 100644
--- a/src/responder/ifp/ifpsrv.c
+++ b/src/responder/ifp/ifpsrv.c
@@ -205,7 +205,7 @@ int ifp_process_init(TALLOC_CTX *mem_ctx,
ifp_cmds = get_ifp_cmds();
ret = sss_process_init(mem_ctx, ev, cdb,
ifp_cmds,
- SSS_IFP_SOCKET_NAME, NULL,
+ NULL, NULL,
CONFDB_IFP_CONF_ENTRY,
SSS_IFP_SBUS_SERVICE_NAME,
SSS_IFP_SBUS_SERVICE_VERSION,
--
1.9.0
More information about the sssd-devel
mailing list