CI: http://sssd-ci.duckdns.org/logs/job/50/01/summary.html
The failure is about missing dependencies, unrelated to these patches.
It depends on the sssctl failover patches due to changes in attaching
dbus message to a talloc context. Now it is possible to also free the
message with both dbus_message_unref() and talloc_free(). Since the
sssctl patches are already in late review process I didn't want to
change them.
From cc00161e956c998f2ae8e7b7aa42042f0a9d3b04 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrez...@redhat.com>
Date: Fri, 15 Jul 2016 14:50:41 +0200
Subject: [PATCH 1/4] sbus: allow freeing msg through dbus api when using
talloc
When a talloc-bound message was freed by removing all references
to it with dbus_message_unref we failed to free the talloc context
and thus leaking memory or unreferencing invalid message when
the parent context is freed.
This patch allows to bound dbus message to talloc in the way that
allows us to free the message by both talloc and dbus api.
---
src/sbus/sssd_dbus_utils.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/src/sbus/sssd_dbus_utils.c b/src/sbus/sssd_dbus_utils.c
index 5e08b7666d2fe57f6e5a9eaece17bb63ec2b4d28..45bdf97d041cc32920fa1b155d337542362785fd 100644
--- a/src/sbus/sssd_dbus_utils.c
+++ b/src/sbus/sssd_dbus_utils.c
@@ -25,22 +25,52 @@
struct sbus_talloc_msg {
DBusMessage *msg;
+ dbus_int32_t data_slot;
+ bool in_talloc_destructor;
};
static int sbus_talloc_msg_destructor(struct sbus_talloc_msg *talloc_msg)
{
+ talloc_msg->in_talloc_destructor = true;
+
if (talloc_msg->msg == NULL) {
return 0;
}
+ /* There may exist more references to this message but this talloc
+ * context is no longer valid. We remove dbus message data to invoke
+ * dbus destructor now. */
+ dbus_message_set_data(talloc_msg->msg, talloc_msg->data_slot, NULL, NULL);
dbus_message_unref(talloc_msg->msg);
return 0;
}
+static void sbus_msg_data_destructor(void *ctx)
+{
+ struct sbus_talloc_msg *talloc_msg;
+
+ talloc_msg = talloc_get_type(ctx, struct sbus_talloc_msg);
+
+ dbus_message_free_data_slot(&talloc_msg->data_slot);
+
+ if (!talloc_msg->in_talloc_destructor) {
+ /* References to this message dropped to zero but through
+ * dbus_message_unref(), not by calling talloc_free(). We need to free
+ * the talloc context and avoid running talloc desctuctor. */
+ talloc_set_destructor(talloc_msg, NULL);
+ talloc_free(talloc_msg);
+ }
+}
+
errno_t sbus_talloc_bound_message(TALLOC_CTX *mem_ctx, DBusMessage *msg)
{
struct sbus_talloc_msg *talloc_msg;
+ dbus_int32_t data_slot = -1;
+ DBusFreeFunction free_fn;
+ dbus_bool_t bret;
+ /* Create a talloc context that will unreference this message when
+ * the parent context is freed. */
talloc_msg = talloc(mem_ctx, struct sbus_talloc_msg);
if (talloc_msg == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, "Unable to bound D-Bus message "
@@ -48,7 +78,28 @@ errno_t sbus_talloc_bound_message(TALLOC_CTX *mem_ctx, DBusMessage *msg)
return ENOMEM;
}
+ /* Allocate a dbus message data slot that will contain point to the
+ * talloc context so we can pick up cases when the dbus message is
+ * freed through dbus api. */
+ bret = dbus_message_allocate_data_slot(&data_slot);
+ if (!bret) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "Unable to allocate data slot!\n");
+ talloc_free(talloc_msg);
+ return ENOMEM;
+ }
+
+ free_fn = sbus_msg_data_destructor;
+ bret = dbus_message_set_data(msg, data_slot, talloc_msg, free_fn);
+ if (!bret) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "Unable to set message data!\n");
+ talloc_free(talloc_msg);
+ dbus_message_free_data_slot(&data_slot);
+ return ENOMEM;
+ }
+
talloc_msg->msg = msg;
+ talloc_msg->data_slot = data_slot;
+ talloc_msg->in_talloc_destructor = false;
talloc_set_destructor(talloc_msg, sbus_talloc_msg_destructor);
--
2.1.0
From 099520cfa6c9b34febb7b644cf6fdccc1e242319 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrez...@redhat.com>
Date: Fri, 15 Jul 2016 14:20:32 +0200
Subject: [PATCH 2/4] PROXY: Do not abuse data provider interface
We want to use custom interface for proxy provider so we do not
abuse the data provider one. This way we gain more control over
it and we can remove the old interface entirely.
---
Makefile.am | 6 +-
src/providers/dp_auth_util.c | 64 ---------------
src/providers/proxy/proxy.h | 2 +
src/providers/proxy/proxy_auth.c | 8 +-
src/providers/proxy/proxy_child.c | 119 +++++++++++++++-------------
src/providers/proxy/proxy_client.c | 108 +++++++++++--------------
src/providers/proxy/proxy_iface.xml | 17 ++++
src/providers/proxy/proxy_iface_generated.c | 80 +++++++++++++++++++
src/providers/proxy/proxy_iface_generated.h | 71 +++++++++++++++++
9 files changed, 288 insertions(+), 187 deletions(-)
create mode 100644 src/providers/proxy/proxy_iface.xml
create mode 100644 src/providers/proxy/proxy_iface_generated.c
create mode 100644 src/providers/proxy/proxy_iface_generated.h
diff --git a/Makefile.am b/Makefile.am
index 720ba8287b19847f5dd06c9718bbaae8195d0d5f..75824c250468308ef52cc028004299f52e99b701 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -714,6 +714,7 @@ dist_noinst_HEADERS = \
src/providers/ad/ad_domain_info.h \
src/providers/ad/ad_subdomains.h \
src/providers/proxy/proxy.h \
+ src/providers/proxy/proxy_iface_generated.h \
src/tools/tools_util.h \
src/tools/sss_sync_ops.h \
src/resolv/async_resolv.h \
@@ -1196,6 +1197,7 @@ CODEGEN_XML = \
$(srcdir)/src/monitor/monitor_iface.xml \
$(srcdir)/src/providers/data_provider_iface.xml \
$(srcdir)/src/providers/data_provider/dp_iface.xml \
+ $(srcdir)/src/providers/proxy/proxy_iface.xml \
$(srcdir)/src/responder/ifp/ifp_iface.xml
SBUS_CODEGEN = src/sbus/sbus_codegen
@@ -3320,7 +3322,7 @@ libsss_proxy_la_SOURCES = \
src/providers/proxy/proxy_netgroup.c \
src/providers/proxy/proxy_services.c \
src/providers/proxy/proxy_auth.c \
- src/providers/data_provider_iface_generated.c \
+ src/providers/proxy/proxy_iface_generated.c \
$(NULL)
libsss_proxy_la_CFLAGS = \
$(AM_CFLAGS)
@@ -3589,7 +3591,7 @@ gpo_child_LDADD = \
proxy_child_SOURCES = \
src/providers/proxy/proxy_child.c \
- src/providers/data_provider_iface_generated.c \
+ src/providers/proxy/proxy_iface_generated.c \
$(NULL)
proxy_child_CFLAGS = \
$(AM_CFLAGS) \
diff --git a/src/providers/dp_auth_util.c b/src/providers/dp_auth_util.c
index 8c09299b12c703ed703a025d1e8cfe5df2088eb2..35d22ab5f24ba2300889256f477a9ed856b69cb9 100644
--- a/src/providers/dp_auth_util.c
+++ b/src/providers/dp_auth_util.c
@@ -321,67 +321,3 @@ bool dp_unpack_pam_response(DBusMessage *msg, struct pam_data *pd, DBusError *db
return true;
}
-
-void dp_id_callback(DBusPendingCall *pending, void *ptr)
-{
- DBusMessage *reply;
- DBusError dbus_error;
- dbus_bool_t ret;
- dbus_uint16_t dp_ver;
- int type;
-
- dbus_error_init(&dbus_error);
-
- reply = dbus_pending_call_steal_reply(pending);
- if (!reply) {
- /* reply should never be null. This function shouldn't be called
- * until reply is valid or timeout has occurred. If reply is NULL
- * here, something is seriously wrong and we should bail out.
- */
- DEBUG(SSSDBG_FATAL_FAILURE,
- "Severe error. A reply callback was called but no"
- " reply was received and no timeout occurred\n");
-
- /* FIXME: Destroy this connection ? */
- goto done;
- }
-
- type = dbus_message_get_type(reply);
- switch (type) {
- case DBUS_MESSAGE_TYPE_METHOD_RETURN:
- ret = dbus_message_get_args(reply, &dbus_error,
- DBUS_TYPE_UINT16, &dp_ver,
- DBUS_TYPE_INVALID);
- if (!ret) {
- DEBUG(SSSDBG_CRIT_FAILURE, "Failed to parse message\n");
- if (dbus_error_is_set(&dbus_error)) dbus_error_free(&dbus_error);
- /* FIXME: Destroy this connection ? */
- goto done;
- }
-
- DEBUG(SSSDBG_CONF_SETTINGS,
- "Got id ack and version (%d) from DP\n", dp_ver);
-
- break;
-
- case DBUS_MESSAGE_TYPE_ERROR:
- DEBUG(SSSDBG_FATAL_FAILURE,"The Monitor returned an error [%s]\n",
- dbus_message_get_error_name(reply));
- /* Falling through to default intentionally*/
- default:
- /*
- * Timeout or other error occurred or something
- * unexpected happened.
- * It doesn't matter which, because either way we
- * know that this connection isn't trustworthy.
- * We'll destroy it now.
- */
-
- /* FIXME: Destroy this connection ? */
- break;
- }
-
-done:
- dbus_pending_call_unref(pending);
- dbus_message_unref(reply);
-}
diff --git a/src/providers/proxy/proxy.h b/src/providers/proxy/proxy.h
index 3aa090dc8e761e6988a21c9f9fd58e4d539d5f49..3b0475d080402bf40d53843c82a6cbc412d091c8 100644
--- a/src/providers/proxy/proxy.h
+++ b/src/providers/proxy/proxy.h
@@ -42,6 +42,8 @@
#include "sss_client/nss_compat.h"
#include <dhash.h>
+#define PROXY_CHILD_PATH "/org/freedesktop/sssd/proxychild"
+
struct proxy_nss_ops {
enum nss_status (*getpwnam_r)(const char *name, struct passwd *result,
char *buffer, size_t buflen, int *errnop);
diff --git a/src/providers/proxy/proxy_auth.c b/src/providers/proxy/proxy_auth.c
index 6e7139aaa5d45631fa08f265c54b66ab97555a64..2b3510c38b1cb265e3042425c373f39e524a71eb 100644
--- a/src/providers/proxy/proxy_auth.c
+++ b/src/providers/proxy/proxy_auth.c
@@ -23,6 +23,7 @@
*/
#include "providers/proxy/proxy.h"
+#include "providers/proxy/proxy_iface_generated.h"
struct pc_init_ctx;
@@ -531,9 +532,9 @@ static struct tevent_req *proxy_pam_conv_send(TALLOC_CTX *mem_ctx,
state->pid = pid;
msg = dbus_message_new_method_call(NULL,
- DP_PATH,
- DATA_PROVIDER_IFACE,
- DATA_PROVIDER_IFACE_PAMHANDLER);
+ PROXY_CHILD_PATH,
+ IFACE_PROXY_AUTH,
+ IFACE_PROXY_AUTH_PAM);
if (msg == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, "dbus_message_new_method_call failed.\n");
talloc_zfree(req);
@@ -847,4 +848,3 @@ proxy_pam_handler_recv(TALLOC_CTX *mem_ctx,
return EOK;
}
-
diff --git a/src/providers/proxy/proxy_child.c b/src/providers/proxy/proxy_child.c
index efd304d5aafd5e53792ef96b75d8aa0c908bbe13..b492adcb3b5efefc08e6eb9e069035aeff8d34df 100644
--- a/src/providers/proxy/proxy_child.c
+++ b/src/providers/proxy/proxy_child.c
@@ -44,22 +44,10 @@
#include "confdb/confdb.h"
#include "sbus/sssd_dbus.h"
#include "providers/proxy/proxy.h"
+#include "providers/proxy/proxy_iface_generated.h"
#include "providers/backend.h"
-static int pc_pam_handler(struct sbus_request *dbus_req, void *user_data);
-
-struct data_provider_iface pc_methods = {
- { &data_provider_iface_meta, 0 },
- .RegisterService = NULL,
- .pamHandler = pc_pam_handler,
- .sudoHandler = NULL,
- .autofsHandler = NULL,
- .hostHandler = NULL,
- .getDomains = NULL,
- .getAccountInfo = NULL,
-};
-
struct pc_ctx {
struct tevent_context *ev;
struct confdb_ctx *cdb;
@@ -382,17 +370,71 @@ done:
exit(ret);
}
-int proxy_child_send_id(struct sbus_connection *conn,
- uint16_t version,
- uint32_t id);
+static void proxy_child_id_callback(DBusPendingCall *pending, void *ptr)
+{
+ DBusMessage *reply;
+ errno_t ret;
+
+ reply = dbus_pending_call_steal_reply(pending);
+ if (reply == NULL) {
+ /* reply should never be null. This function shouldn't be called
+ * until reply is valid or timeout has occurred. If reply is NULL
+ * here, something is seriously wrong and we should bail out.
+ */
+ DEBUG(SSSDBG_FATAL_FAILURE, "Severe error. A reply callback was "
+ "called but no reply was received and no timeout occurred\n");
+ goto done;
+ }
+
+ ret = sbus_parse_reply(reply);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get ID ack [%d]: %s\n",
+ ret, sss_strerror(ret));
+ }
+
+ DEBUG(SSSDBG_TRACE_FUNC, "Got id ack from proxy child\n");
+
+done:
+ dbus_pending_call_unref(pending);
+ dbus_message_unref(reply);
+}
+
+static errno_t proxy_child_send_id(struct sbus_connection *conn, uint32_t id)
+{
+ DBusMessage *msg;
+ errno_t ret;
+
+ msg = sbus_create_message(NULL, NULL, PROXY_CHILD_PATH, IFACE_PROXY_CLIENT,
+ IFACE_PROXY_CLIENT_REGISTER,
+ DBUS_TYPE_UINT32, &id);
+ if (msg == NULL) {
+ DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory?!\n");
+ return ENOMEM;
+ }
+
+ DEBUG(SSSDBG_TRACE_FUNC, "Sending ID to Proxy Backend: (%"PRIu32")\n", id);
+
+ ret = sbus_conn_send(conn, msg, 30000, proxy_child_id_callback, NULL, NULL);
+
+ dbus_message_unref(msg);
+
+ return ret;
+}
+
static int proxy_cli_init(struct pc_ctx *ctx)
{
char *sbus_address;
int ret;
+ static struct iface_proxy_auth iface_proxy_auth = {
+ { &iface_proxy_auth_meta, 0 },
+
+ .PAM = pc_pam_handler,
+ };
+
sbus_address = talloc_asprintf(ctx, "unix:path=%s/%s_%s",
- PIPE_PATH, PROXY_CHILD_PIPE,
- ctx->domain->name);
+ PIPE_PATH, PROXY_CHILD_PIPE,
+ ctx->domain->name);
if (sbus_address == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf failed.\n");
return ENOMEM;
@@ -404,13 +446,14 @@ static int proxy_cli_init(struct pc_ctx *ctx)
return ret;
}
- ret = sbus_conn_register_iface(ctx->conn, &pc_methods.vtable, DP_PATH, ctx);
+ ret = sbus_conn_register_iface(ctx->conn, &iface_proxy_auth.vtable,
+ PROXY_CHILD_PATH, ctx);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE, "Failed to export proxy.\n");
return ret;
}
- ret = proxy_child_send_id(ctx->conn, DATA_PROVIDER_VERSION, ctx->id);
+ ret = proxy_child_send_id(ctx->conn, ctx->id);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE, "dp_common_send_id failed.\n");
return ret;
@@ -419,42 +462,6 @@ static int proxy_cli_init(struct pc_ctx *ctx)
return EOK;
}
-int proxy_child_send_id(struct sbus_connection *conn,
- uint16_t version,
- uint32_t id)
-{
- DBusMessage *msg;
- dbus_bool_t ret;
- int retval;
-
- /* create the message */
- msg = dbus_message_new_method_call(NULL,
- DP_PATH,
- DATA_PROVIDER_IFACE,
- DATA_PROVIDER_IFACE_REGISTERSERVICE);
- if (msg == NULL) {
- DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory?!\n");
- return ENOMEM;
- }
-
- DEBUG(SSSDBG_FUNC_DATA, "Sending ID to Proxy Backend: (%d,%"PRIu32")\n",
- version, id);
-
- ret = dbus_message_append_args(msg,
- DBUS_TYPE_UINT16, &version,
- DBUS_TYPE_UINT32, &id,
- DBUS_TYPE_INVALID);
- if (!ret) {
- DEBUG(SSSDBG_CRIT_FAILURE, "Failed to build message\n");
- return EIO;
- }
-
- retval = sbus_conn_send(conn, msg, 30000, dp_id_callback, NULL, NULL);
-
- dbus_message_unref(msg);
- return retval;
-}
-
int proxy_child_process_init(TALLOC_CTX *mem_ctx, const char *domain,
struct tevent_context *ev, struct confdb_ctx *cdb,
const char *pam_target, uint32_t id)
diff --git a/src/providers/proxy/proxy_client.c b/src/providers/proxy/proxy_client.c
index fc1735f2a101528a1edeaf3cf9c1118e4a21e937..74957caeec5bf50b5cb959d6f5b8ec1ca9ecba37 100644
--- a/src/providers/proxy/proxy_client.c
+++ b/src/providers/proxy/proxy_client.c
@@ -22,24 +22,10 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "config.h"
-
-#include "util/sss_format.h"
+#include "util/util.h"
+#include "providers/proxy/proxy_iface_generated.h"
#include "providers/proxy/proxy.h"
-static int client_registration(struct sbus_request *dbus_req, void *data);
-
-static struct data_provider_iface proxy_methods = {
- { &data_provider_iface_meta, 0 },
- .RegisterService = client_registration,
- .pamHandler = NULL,
- .sudoHandler = NULL,
- .autofsHandler = NULL,
- .hostHandler = NULL,
- .getDomains = NULL,
- .getAccountInfo = NULL,
-};
-
struct proxy_client {
struct proxy_auth_ctx *proxy_auth_ctx;
struct sbus_connection *conn;
@@ -47,24 +33,22 @@ struct proxy_client {
bool initialized;
};
-static int client_registration(struct sbus_request *dbus_req, void *data)
+static int proxy_client_register(struct sbus_request *sbus_req,
+ void *data,
+ uint32_t cli_id)
{
- dbus_uint16_t version = DATA_PROVIDER_VERSION;
struct sbus_connection *conn;
struct proxy_client *proxy_cli;
- dbus_uint16_t cli_ver;
- uint32_t cli_id;
int hret;
hash_key_t key;
hash_value_t value;
struct tevent_req *req;
struct proxy_child_ctx *child_ctx;
struct pc_init_ctx *init_ctx;
- int ret;
- conn = dbus_req->conn;
+ conn = sbus_req->conn;
proxy_cli = talloc_get_type(data, struct proxy_client);
- if (!proxy_cli) {
+ if (proxy_cli == NULL) {
DEBUG(SSSDBG_FATAL_FAILURE, "Connection holds no valid init data\n");
return EINVAL;
}
@@ -74,14 +58,6 @@ static int client_registration(struct sbus_request *dbus_req, void *data)
"Cancel proxy client ID timeout [%p]\n", proxy_cli->timeout);
talloc_zfree(proxy_cli->timeout);
- if (!sbus_request_parse_or_finish(dbus_req,
- DBUS_TYPE_UINT16, &cli_ver,
- DBUS_TYPE_UINT32, &cli_id,
- DBUS_TYPE_INVALID)) {
- sbus_disconnect(conn);
- return EOK; /* handled */
- }
-
DEBUG(SSSDBG_FUNC_DATA, "Proxy client [%"PRIu32"] connected\n", cli_id);
/* Check the hash table */
@@ -94,20 +70,14 @@ static int client_registration(struct sbus_request *dbus_req, void *data)
return EIO;
}
- /* reply that all is ok */
- ret = sbus_request_return_and_finish(dbus_req,
- DBUS_TYPE_UINT16, &version,
- DBUS_TYPE_INVALID);
- if (ret != EOK) {
- sbus_disconnect(conn);
- return ret;
- }
+ iface_proxy_client_Register_finish(sbus_req);
hret = hash_lookup(proxy_cli->proxy_auth_ctx->request_table, &key, &value);
if (hret != HASH_SUCCESS) {
DEBUG(SSSDBG_CRIT_FAILURE,
- "Hash error [%d][%s]\n", hret, hash_error_string(hret));
+ "Hash error [%d]: %s\n", hret, hash_error_string(hret));
sbus_disconnect(conn);
+ return EIO;
}
/* Signal that the child is up and ready to receive the request */
@@ -121,7 +91,7 @@ static int client_registration(struct sbus_request *dbus_req, void *data)
* break.
*/
DEBUG(SSSDBG_CRIT_FAILURE, "Client connection from a request "
- "that's not marked as running\n");
+ "that's not marked as running\n");
return EIO;
}
@@ -133,9 +103,10 @@ static int client_registration(struct sbus_request *dbus_req, void *data)
return EOK;
}
-static void init_timeout(struct tevent_context *ev,
- struct tevent_timer *te,
- struct timeval t, void *ptr)
+static void proxy_client_timeout(struct tevent_context *ev,
+ struct tevent_timer *te,
+ struct timeval t,
+ void *ptr)
{
struct proxy_client *proxy_cli;
@@ -155,38 +126,53 @@ static void init_timeout(struct tevent_context *ev,
int proxy_client_init(struct sbus_connection *conn, void *data)
{
- struct proxy_auth_ctx *proxy_auth_ctx;
+ struct proxy_auth_ctx *auth_ctx;
struct proxy_client *proxy_cli;
struct timeval tv;
+ errno_t ret;
- proxy_auth_ctx = talloc_get_type(data, struct proxy_auth_ctx);
+ static struct iface_proxy_client iface_proxy_client = {
+ { &iface_proxy_client_meta, 0 },
- /* hang off this memory to the connection so that when the connection
- * is freed we can potentially call a destructor */
+ .Register = proxy_client_register,
+ };
+ auth_ctx = talloc_get_type(data, struct proxy_auth_ctx);
+
+ /* When connection is lost we also free the client. */
proxy_cli = talloc_zero(conn, struct proxy_client);
- if (!proxy_cli) {
- DEBUG(SSSDBG_FATAL_FAILURE,"Out of memory?!\n");
- talloc_zfree(conn);
+ if (proxy_cli == NULL) {
+ DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory, killing connection.\n");
+ talloc_free(conn);
return ENOMEM;
}
- proxy_cli->proxy_auth_ctx = proxy_auth_ctx;
+
+ proxy_cli->proxy_auth_ctx = auth_ctx;
proxy_cli->conn = conn;
proxy_cli->initialized = false;
- /* 5 seconds should be plenty */
+ /* Setup timeout in case client fails to register himself in time. */
tv = tevent_timeval_current_ofs(5, 0);
-
- proxy_cli->timeout = tevent_add_timer(proxy_auth_ctx->be->ev, proxy_cli,
- tv, init_timeout, proxy_cli);
- if (!proxy_cli->timeout) {
- DEBUG(SSSDBG_FATAL_FAILURE,"Out of memory?!\n");
- talloc_zfree(conn);
+ proxy_cli->timeout = tevent_add_timer(auth_ctx->be->ev, proxy_cli, tv,
+ proxy_client_timeout, proxy_cli);
+ if (proxy_cli->timeout == NULL) {
+ /* Connection is closed in the caller. */
+ DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory, killing connection\n");
return ENOMEM;
}
+
DEBUG(SSSDBG_CONF_SETTINGS,
"Set-up proxy client ID timeout [%p]\n", proxy_cli->timeout);
- return sbus_conn_register_iface(conn, &proxy_methods.vtable,
- DP_PATH, proxy_cli);
+ /* Setup D-Bus interfaces and methods. */
+ ret = sbus_conn_register_iface(conn, &iface_proxy_client.vtable,
+ PROXY_CHILD_PATH, proxy_cli);
+ if (ret != EOK) {
+ /* Connection is closed in the caller. */
+ DEBUG(SSSDBG_FATAL_FAILURE, "Unable to register D-Bus interface, "
+ "killing connection [%d]: %s\n", ret, sss_strerror(ret));
+ return ret;
+ }
+
+ return ret;
}
diff --git a/src/providers/proxy/proxy_iface.xml b/src/providers/proxy/proxy_iface.xml
new file mode 100644
index 0000000000000000000000000000000000000000..39b0b03928661a1851fd739598b0194547441c2c
--- /dev/null
+++ b/src/providers/proxy/proxy_iface.xml
@@ -0,0 +1,17 @@
+<!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.ProxyChild.Client">
+ <annotation value="iface_proxy_client" name="org.freedesktop.DBus.GLib.CSymbol"/>
+ <method name="Register">
+ <arg name="ID" type="u" direction="in" />
+ </method>
+ </interface>
+
+ <interface name="org.freedesktop.sssd.ProxyChild.Auth">
+ <annotation value="iface_proxy_auth" name="org.freedesktop.DBus.GLib.CSymbol"/>
+ <method name="PAM">
+ <annotation name="org.freedesktop.sssd.RawHandler" value="true"/>
+ </method>
+ </interface>
+</node>
diff --git a/src/providers/proxy/proxy_iface_generated.c b/src/providers/proxy/proxy_iface_generated.c
new file mode 100644
index 0000000000000000000000000000000000000000..425727d1496b537eb25b002815d14e1f57b8f00d
--- /dev/null
+++ b/src/providers/proxy/proxy_iface_generated.c
@@ -0,0 +1,80 @@
+/* The following definitions are auto-generated from proxy_iface.xml */
+
+#include "util/util.h"
+#include "sbus/sssd_dbus.h"
+#include "sbus/sssd_dbus_meta.h"
+#include "sbus/sssd_dbus_invokers.h"
+#include "proxy_iface_generated.h"
+
+/* invokes a handler with a 'u' DBus signature */
+static int invoke_u_method(struct sbus_request *dbus_req, void *function_ptr);
+
+/* arguments for org.freedesktop.sssd.ProxyChild.Client.Register */
+const struct sbus_arg_meta iface_proxy_client_Register__in[] = {
+ { "ID", "u" },
+ { NULL, }
+};
+
+int iface_proxy_client_Register_finish(struct sbus_request *req)
+{
+ return sbus_request_return_and_finish(req,
+ DBUS_TYPE_INVALID);
+}
+
+/* methods for org.freedesktop.sssd.ProxyChild.Client */
+const struct sbus_method_meta iface_proxy_client__methods[] = {
+ {
+ "Register", /* name */
+ iface_proxy_client_Register__in,
+ NULL, /* no out_args */
+ offsetof(struct iface_proxy_client, Register),
+ invoke_u_method,
+ },
+ { NULL, }
+};
+
+/* interface info for org.freedesktop.sssd.ProxyChild.Client */
+const struct sbus_interface_meta iface_proxy_client_meta = {
+ "org.freedesktop.sssd.ProxyChild.Client", /* name */
+ iface_proxy_client__methods,
+ NULL, /* no signals */
+ NULL, /* no properties */
+ sbus_invoke_get_all, /* GetAll invoker */
+};
+
+/* methods for org.freedesktop.sssd.ProxyChild.Auth */
+const struct sbus_method_meta iface_proxy_auth__methods[] = {
+ {
+ "PAM", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct iface_proxy_auth, PAM),
+ NULL, /* no invoker */
+ },
+ { NULL, }
+};
+
+/* interface info for org.freedesktop.sssd.ProxyChild.Auth */
+const struct sbus_interface_meta iface_proxy_auth_meta = {
+ "org.freedesktop.sssd.ProxyChild.Auth", /* name */
+ iface_proxy_auth__methods,
+ NULL, /* no signals */
+ NULL, /* no properties */
+ sbus_invoke_get_all, /* GetAll invoker */
+};
+
+/* invokes a handler with a 'u' DBus signature */
+static int invoke_u_method(struct sbus_request *dbus_req, void *function_ptr)
+{
+ uint32_t arg_0;
+ int (*handler)(struct sbus_request *, void *, uint32_t) = function_ptr;
+
+ if (!sbus_request_parse_or_finish(dbus_req,
+ DBUS_TYPE_UINT32, &arg_0,
+ DBUS_TYPE_INVALID)) {
+ return EOK; /* request handled */
+ }
+
+ return (handler)(dbus_req, dbus_req->intf->handler_data,
+ arg_0);
+}
diff --git a/src/providers/proxy/proxy_iface_generated.h b/src/providers/proxy/proxy_iface_generated.h
new file mode 100644
index 0000000000000000000000000000000000000000..7af074fa3d839263318ceac7ea34f62dcde64563
--- /dev/null
+++ b/src/providers/proxy/proxy_iface_generated.h
@@ -0,0 +1,71 @@
+/* The following declarations are auto-generated from proxy_iface.xml */
+
+#ifndef __PROXY_IFACE_XML__
+#define __PROXY_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.ProxyChild.Client */
+#define IFACE_PROXY_CLIENT "org.freedesktop.sssd.ProxyChild.Client"
+#define IFACE_PROXY_CLIENT_REGISTER "Register"
+
+/* constants for org.freedesktop.sssd.ProxyChild.Auth */
+#define IFACE_PROXY_AUTH "org.freedesktop.sssd.ProxyChild.Auth"
+#define IFACE_PROXY_AUTH_PAM "PAM"
+
+/* ------------------------------------------------------------------------
+ * DBus handlers
+ *
+ * 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 are 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.
+ *
+ * Handlers have a matching xxx_finish() function (unless the method has
+ * accepts raw messages). These finish functions the
+ * sbus_request_return_and_finish() with the appropriate arguments to
+ * construct a valid reply. Once a finish function has been called, the
+ * @dbus_req it was called with is freed and no longer valid.
+ */
+
+/* vtable for org.freedesktop.sssd.ProxyChild.Client */
+struct iface_proxy_client {
+ struct sbus_vtable vtable; /* derive from sbus_vtable */
+ int (*Register)(struct sbus_request *req, void *data, uint32_t arg_ID);
+};
+
+/* finish function for Register */
+int iface_proxy_client_Register_finish(struct sbus_request *req);
+
+/* vtable for org.freedesktop.sssd.ProxyChild.Auth */
+struct iface_proxy_auth {
+ struct sbus_vtable vtable; /* derive from sbus_vtable */
+ sbus_msg_handler_fn PAM;
+};
+
+/* ------------------------------------------------------------------------
+ * 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.ProxyChild.Client */
+extern const struct sbus_interface_meta iface_proxy_client_meta;
+
+/* interface info for org.freedesktop.sssd.ProxyChild.Auth */
+extern const struct sbus_interface_meta iface_proxy_auth_meta;
+
+#endif /* __PROXY_IFACE_XML__ */
--
2.1.0
From 2adf984058d1e9dd916af6c150810201a789da29 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrez...@redhat.com>
Date: Tue, 19 Jul 2016 14:24:16 +0200
Subject: [PATCH 3/4] DP: Remove old data provider interface
Reverse data provider interface is moved to a better location in
NSS responder. All responders now can have an sbus interface
defined per data provider connection. The unused old data provider
interface is removed.
---
Makefile.am | 11 +--
src/providers/data_provider.h | 1 -
src/providers/data_provider/dp_target_id.c | 7 +-
src/providers/data_provider_iface.xml | 53 ---------------
src/providers/data_provider_iface_generated.c | 98 ---------------------------
src/providers/data_provider_iface_generated.h | 82 ----------------------
src/responder/autofs/autofssrv.c | 13 +---
src/responder/common/responder.h | 8 +--
src/responder/common/responder_common.c | 16 +++--
src/responder/common/responder_get_domains.c | 4 +-
src/responder/ifp/ifpsrv.c | 13 +---
src/responder/nss/nss_iface.c | 38 +++++++++++
src/responder/nss/nss_iface.h | 30 ++++++++
src/responder/nss/nss_iface.xml | 12 ++++
src/responder/nss/nss_iface_generated.c | 69 +++++++++++++++++++
src/responder/nss/nss_iface_generated.h | 58 ++++++++++++++++
src/responder/nss/nsssrv.c | 39 ++++-------
src/responder/nss/nsssrv.h | 7 ++
src/responder/pac/pacsrv.c | 13 +---
src/responder/pam/pamsrv.c | 13 +---
src/responder/pam/pamsrv_dp.c | 4 +-
src/responder/ssh/sshsrv.c | 13 +---
src/responder/sudo/sudosrv.c | 13 +---
src/tests/cwrap/Makefile.am | 1 -
24 files changed, 259 insertions(+), 357 deletions(-)
delete mode 100644 src/providers/data_provider_iface.xml
delete mode 100644 src/providers/data_provider_iface_generated.c
delete mode 100644 src/providers/data_provider_iface_generated.h
create mode 100644 src/responder/nss/nss_iface.c
create mode 100644 src/responder/nss/nss_iface.h
create mode 100644 src/responder/nss/nss_iface.xml
create mode 100644 src/responder/nss/nss_iface_generated.c
create mode 100644 src/responder/nss/nss_iface_generated.h
diff --git a/Makefile.am b/Makefile.am
index 75824c250468308ef52cc028004299f52e99b701..de38e6d1721483e36fbc6ab9dc19789b078e7338 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -492,7 +492,6 @@ SSSD_RESPONDER_OBJ = \
src/responder/common/data_provider/rdp_message.c \
src/responder/common/data_provider/rdp_client.c \
src/monitor/monitor_iface_generated.c \
- src/providers/data_provider_iface_generated.c \
src/providers/data_provider_req.c
SSSD_TOOLS_OBJ = \
@@ -610,6 +609,8 @@ dist_noinst_HEADERS = \
src/responder/nss/nsssrv_netgroup.h \
src/responder/nss/nsssrv_services.h \
src/responder/nss/nsssrv_mmap_cache.h \
+ src/responder/nss/nss_iface_generated.h \
+ src/responder/nss/nss_iface.h \
src/responder/pac/pacsrv.h \
src/responder/common/negcache_files.h \
src/responder/common/negcache.h \
@@ -647,7 +648,6 @@ dist_noinst_HEADERS = \
src/confdb/confdb_setup.h \
src/providers/data_provider.h \
src/providers/data_provider_req.h \
- src/providers/data_provider_iface_generated.h \
src/providers/data_provider/dp.h \
src/providers/data_provider/dp_flags.h \
src/providers/data_provider/dp_responder_iface.h \
@@ -1195,10 +1195,10 @@ endif
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/dp_iface.xml \
$(srcdir)/src/providers/proxy/proxy_iface.xml \
- $(srcdir)/src/responder/ifp/ifp_iface.xml
+ $(srcdir)/src/responder/ifp/ifp_iface.xml \
+ $(srcdir)/src/responder/nss/nss_iface.xml
SBUS_CODEGEN = src/sbus/sbus_codegen
@@ -1247,6 +1247,8 @@ sssd_nss_SOURCES = \
src/responder/nss/nsssrv_netgroup.c \
src/responder/nss/nsssrv_services.c \
src/responder/nss/nsssrv_mmap_cache.c \
+ src/responder/nss/nss_iface_generated.c \
+ src/responder/nss/nss_iface.c \
$(SSSD_RESPONDER_OBJ)
sssd_nss_LDADD = \
$(TDB_LIBS) \
@@ -1395,7 +1397,6 @@ sssd_be_SOURCES = \
src/providers/be_ptask.c \
src/providers/be_refresh.c \
src/monitor/monitor_iface_generated.c \
- src/providers/data_provider_iface_generated.c \
src/providers/data_provider/dp.c \
src/providers/data_provider/dp_modules.c \
src/providers/data_provider/dp_targets.c \
diff --git a/src/providers/data_provider.h b/src/providers/data_provider.h
index b0b6876d984d7c6574baaa8d130e374ba2e6f0c4..14a0902c265850d91fa7d29cc2708e70b060ec18 100644
--- a/src/providers/data_provider.h
+++ b/src/providers/data_provider.h
@@ -44,7 +44,6 @@
#include "sss_client/sss_cli.h"
#include "util/authtok.h"
#include "providers/data_provider_req.h"
-#include "providers/data_provider_iface_generated.h"
#define DATA_PROVIDER_VERSION 0x0001
#define DATA_PROVIDER_PIPE "private/sbus-dp"
diff --git a/src/providers/data_provider/dp_target_id.c b/src/providers/data_provider/dp_target_id.c
index f24b2ccb62c07eb900b5c057a1a3dbf824c553a9..e67b9d766a4a542d1de2e683fef1f0e0e5601c8a 100644
--- a/src/providers/data_provider/dp_target_id.c
+++ b/src/providers/data_provider/dp_target_id.c
@@ -25,6 +25,7 @@
#include "providers/data_provider/dp_private.h"
#include "providers/data_provider/dp_iface.h"
#include "providers/backend.h"
+#include "responder/nss/nss_iface.h"
#include "util/util.h"
#define FILTER_TYPE(str, type) {str "=", sizeof(str "=") - 1, type}
@@ -168,9 +169,9 @@ static void dp_req_initgr_pp(const char *req_name,
}
msg = dbus_message_new_method_call(NULL,
- DP_PATH,
- DATA_PROVIDER_REV_IFACE,
- DATA_PROVIDER_REV_IFACE_INITGRCHECK);
+ NSS_MEMORYCACHE_PATH,
+ IFACE_NSS_MEMORYCACHE,
+ IFACE_NSS_MEMORYCACHE_UPDATEINITGROUPS);
if (msg == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
return;
diff --git a/src/providers/data_provider_iface.xml b/src/providers/data_provider_iface.xml
deleted file mode 100644
index 143975633081ce2ae5690c4036e7169e41d776fc..0000000000000000000000000000000000000000
--- a/src/providers/data_provider_iface.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<!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.dataprovider">
- <annotation value="data_provider_iface" name="org.freedesktop.DBus.GLib.CSymbol"/>
- <method name="RegisterService">
- <!-- arguments parsed manually, raw handler -->
- <annotation name="org.freedesktop.sssd.RawHandler" value="true"/>
- </method>
- <method name="pamHandler">
- <!-- arguments parsed manually, raw handler -->
- <annotation name="org.freedesktop.sssd.RawHandler" value="true"/>
- </method>
- <method name="sudoHandler">
- <!-- arguments parsed manually, raw handler -->
- <annotation name="org.freedesktop.sssd.RawHandler" value="true"/>
- </method>
- <method name="autofsHandler">
- <!-- arguments parsed manually, raw handler -->
- <annotation name="org.freedesktop.sssd.RawHandler" value="true"/>
- </method>
- <method name="hostHandler">
- <!-- arguments parsed manually, raw handler -->
- <annotation name="org.freedesktop.sssd.RawHandler" value="true"/>
- </method>
- <method name="getDomains">
- <!-- arguments parsed manually, raw handler -->
- <annotation name="org.freedesktop.sssd.RawHandler" value="true"/>
- </method>
- <method name="getAccountInfo">
- <!-- arguments parsed manually, raw handler -->
- <annotation name="org.freedesktop.sssd.RawHandler" value="true"/>
- </method>
- </interface>
-
- <!--
- this is a reverse method sent from providers to
- the nss responder to tell it to update the mmap
- cache
- -->
-
- <interface name="org.freedesktop.sssd.dataprovider_rev">
- <annotation value="data_provider_rev_iface" name="org.freedesktop.DBus.GLib.CSymbol"/>
- <method name="updateCache">
- <!-- arguments parsed manually, raw handler -->
- <annotation name="org.freedesktop.sssd.RawHandler" value="true"/>
- </method>
- <method name="initgrCheck">
- <!-- arguments parsed manually, raw handler -->
- <annotation name="org.freedesktop.sssd.RawHandler" value="true"/>
- </method>
- </interface>
-</node>
diff --git a/src/providers/data_provider_iface_generated.c b/src/providers/data_provider_iface_generated.c
deleted file mode 100644
index bdd6a4d76d18bbb44530d816fce14009736b6f6d..0000000000000000000000000000000000000000
--- a/src/providers/data_provider_iface_generated.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* The following definitions are auto-generated from data_provider_iface.xml */
-
-#include "util/util.h"
-#include "sbus/sssd_dbus.h"
-#include "sbus/sssd_dbus_meta.h"
-#include "sbus/sssd_dbus_invokers.h"
-#include "data_provider_iface_generated.h"
-
-/* methods for org.freedesktop.sssd.dataprovider */
-const struct sbus_method_meta data_provider_iface__methods[] = {
- {
- "RegisterService", /* name */
- NULL, /* no in_args */
- NULL, /* no out_args */
- offsetof(struct data_provider_iface, RegisterService),
- NULL, /* no invoker */
- },
- {
- "pamHandler", /* name */
- NULL, /* no in_args */
- NULL, /* no out_args */
- offsetof(struct data_provider_iface, pamHandler),
- NULL, /* no invoker */
- },
- {
- "sudoHandler", /* name */
- NULL, /* no in_args */
- NULL, /* no out_args */
- offsetof(struct data_provider_iface, sudoHandler),
- NULL, /* no invoker */
- },
- {
- "autofsHandler", /* name */
- NULL, /* no in_args */
- NULL, /* no out_args */
- offsetof(struct data_provider_iface, autofsHandler),
- NULL, /* no invoker */
- },
- {
- "hostHandler", /* name */
- NULL, /* no in_args */
- NULL, /* no out_args */
- offsetof(struct data_provider_iface, hostHandler),
- NULL, /* no invoker */
- },
- {
- "getDomains", /* name */
- NULL, /* no in_args */
- NULL, /* no out_args */
- offsetof(struct data_provider_iface, getDomains),
- NULL, /* no invoker */
- },
- {
- "getAccountInfo", /* name */
- NULL, /* no in_args */
- NULL, /* no out_args */
- offsetof(struct data_provider_iface, getAccountInfo),
- NULL, /* no invoker */
- },
- { NULL, }
-};
-
-/* interface info for org.freedesktop.sssd.dataprovider */
-const struct sbus_interface_meta data_provider_iface_meta = {
- "org.freedesktop.sssd.dataprovider", /* name */
- data_provider_iface__methods,
- NULL, /* no signals */
- NULL, /* no properties */
- sbus_invoke_get_all, /* GetAll invoker */
-};
-
-/* methods for org.freedesktop.sssd.dataprovider_rev */
-const struct sbus_method_meta data_provider_rev_iface__methods[] = {
- {
- "updateCache", /* name */
- NULL, /* no in_args */
- NULL, /* no out_args */
- offsetof(struct data_provider_rev_iface, updateCache),
- NULL, /* no invoker */
- },
- {
- "initgrCheck", /* name */
- NULL, /* no in_args */
- NULL, /* no out_args */
- offsetof(struct data_provider_rev_iface, initgrCheck),
- NULL, /* no invoker */
- },
- { NULL, }
-};
-
-/* interface info for org.freedesktop.sssd.dataprovider_rev */
-const struct sbus_interface_meta data_provider_rev_iface_meta = {
- "org.freedesktop.sssd.dataprovider_rev", /* name */
- data_provider_rev_iface__methods,
- NULL, /* no signals */
- NULL, /* no properties */
- sbus_invoke_get_all, /* GetAll invoker */
-};
diff --git a/src/providers/data_provider_iface_generated.h b/src/providers/data_provider_iface_generated.h
deleted file mode 100644
index 976e42b89c6aaf9523b16999b8f5103a1e6f8e66..0000000000000000000000000000000000000000
--- a/src/providers/data_provider_iface_generated.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* The following declarations are auto-generated from data_provider_iface.xml */
-
-#ifndef __DATA_PROVIDER_IFACE_XML__
-#define __DATA_PROVIDER_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.dataprovider */
-#define DATA_PROVIDER_IFACE "org.freedesktop.sssd.dataprovider"
-#define DATA_PROVIDER_IFACE_REGISTERSERVICE "RegisterService"
-#define DATA_PROVIDER_IFACE_PAMHANDLER "pamHandler"
-#define DATA_PROVIDER_IFACE_SUDOHANDLER "sudoHandler"
-#define DATA_PROVIDER_IFACE_AUTOFSHANDLER "autofsHandler"
-#define DATA_PROVIDER_IFACE_HOSTHANDLER "hostHandler"
-#define DATA_PROVIDER_IFACE_GETDOMAINS "getDomains"
-#define DATA_PROVIDER_IFACE_GETACCOUNTINFO "getAccountInfo"
-
-/* constants for org.freedesktop.sssd.dataprovider_rev */
-#define DATA_PROVIDER_REV_IFACE "org.freedesktop.sssd.dataprovider_rev"
-#define DATA_PROVIDER_REV_IFACE_UPDATECACHE "updateCache"
-#define DATA_PROVIDER_REV_IFACE_INITGRCHECK "initgrCheck"
-
-/* ------------------------------------------------------------------------
- * DBus handlers
- *
- * 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 are 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.
- *
- * Handlers have a matching xxx_finish() function (unless the method has
- * accepts raw messages). These finish functions the
- * sbus_request_return_and_finish() with the appropriate arguments to
- * construct a valid reply. Once a finish function has been called, the
- * @dbus_req it was called with is freed and no longer valid.
- */
-
-/* vtable for org.freedesktop.sssd.dataprovider */
-struct data_provider_iface {
- struct sbus_vtable vtable; /* derive from sbus_vtable */
- sbus_msg_handler_fn RegisterService;
- sbus_msg_handler_fn pamHandler;
- sbus_msg_handler_fn sudoHandler;
- sbus_msg_handler_fn autofsHandler;
- sbus_msg_handler_fn hostHandler;
- sbus_msg_handler_fn getDomains;
- sbus_msg_handler_fn getAccountInfo;
-};
-
-/* vtable for org.freedesktop.sssd.dataprovider_rev */
-struct data_provider_rev_iface {
- struct sbus_vtable vtable; /* derive from sbus_vtable */
- sbus_msg_handler_fn updateCache;
- sbus_msg_handler_fn initgrCheck;
-};
-
-/* ------------------------------------------------------------------------
- * 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.dataprovider */
-extern const struct sbus_interface_meta data_provider_iface_meta;
-
-/* interface info for org.freedesktop.sssd.dataprovider_rev */
-extern const struct sbus_interface_meta data_provider_rev_iface_meta;
-
-#endif /* __DATA_PROVIDER_IFACE_XML__ */
diff --git a/src/responder/autofs/autofssrv.c b/src/responder/autofs/autofssrv.c
index c72f3c1f7aee81a9986076975086cdd88e968edb..826a36e9bc0e2afedfda17104d15b86c5fc1b7e1 100644
--- a/src/responder/autofs/autofssrv.c
+++ b/src/responder/autofs/autofssrv.c
@@ -44,17 +44,6 @@ struct mon_cli_iface monitor_autofs_methods = {
.sysbusReconnect = NULL,
};
-static struct data_provider_iface autofs_dp_methods = {
- { &data_provider_iface_meta, 0 },
- .RegisterService = NULL,
- .pamHandler = NULL,
- .sudoHandler = NULL,
- .autofsHandler = NULL,
- .hostHandler = NULL,
- .getDomains = NULL,
- .getAccountInfo = NULL,
-};
-
static errno_t
autofs_get_config(struct autofs_ctx *actx,
struct confdb_ctx *cdb)
@@ -130,7 +119,7 @@ autofs_process_init(TALLOC_CTX *mem_ctx,
SSS_AUTOFS_SBUS_SERVICE_VERSION,
&monitor_autofs_methods,
"autofs",
- &autofs_dp_methods.vtable,
+ NULL,
autofs_connection_setup,
&rctx);
if (ret != EOK) {
diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h
index 335b313ce1a6bc7c0e0ba332786e2e9f39a04ff1..9e3b2fdbda4e30b859df597374fc7d490b1720e5 100644
--- a/src/responder/common/responder.h
+++ b/src/responder/common/responder.h
@@ -163,11 +163,7 @@ struct mon_cli_iface;
typedef int (*connection_setup_t)(struct cli_ctx *cctx);
int sss_connection_setup(struct cli_ctx *cctx);
-/*
- * NOTE: We would like to use more strong typing for the @dp_vtable argument
- * but can't since it accepts either a struct data_provider_iface
- * or struct data_provider_rev_iface. So pass the base struct: sbus_vtable
- */
+
int sss_process_init(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct confdb_ctx *cdb,
@@ -181,7 +177,7 @@ int sss_process_init(TALLOC_CTX *mem_ctx,
uint16_t svc_version,
struct mon_cli_iface *monitor_intf,
const char *cli_name,
- struct sbus_vtable *dp_intf,
+ struct sbus_iface_map *sbus_iface,
connection_setup_t conn_setup,
struct resp_ctx **responder_ctx);
diff --git a/src/responder/common/responder_common.c b/src/responder/common/responder_common.c
index 02a64368cad60990436497865aa0c772a39cde5a..951f36a6c073456da5495d9bd0b9b187a58616aa 100644
--- a/src/responder/common/responder_common.c
+++ b/src/responder/common/responder_common.c
@@ -549,7 +549,7 @@ void idle_handler(struct tevent_context *ev,
}
static int sss_dp_init(struct resp_ctx *rctx,
- struct sbus_vtable *dp_intf,
+ struct sbus_iface_map *sbus_iface,
const char *cli_name,
struct sss_domain_info *domain)
{
@@ -577,10 +577,12 @@ static int sss_dp_init(struct resp_ctx *rctx,
return ret;
}
- ret = sbus_conn_register_iface(be_conn->conn, dp_intf, DP_PATH, rctx);
- if (ret != EOK) {
- DEBUG(SSSDBG_FATAL_FAILURE, "Failed to export data provider.\n");
- return ret;
+ if (sbus_iface != NULL) {
+ ret = sbus_conn_register_iface_map(be_conn->conn, sbus_iface, rctx);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_FATAL_FAILURE, "Failed to register D-Bus interface.\n");
+ return ret;
+ }
}
DLIST_ADD_END(rctx->be_conns, be_conn, struct be_conn *);
@@ -924,7 +926,7 @@ int sss_process_init(TALLOC_CTX *mem_ctx,
uint16_t svc_version,
struct mon_cli_iface *monitor_intf,
const char *cli_name,
- struct sbus_vtable *dp_intf,
+ struct sbus_iface_map *sbus_iface,
connection_setup_t conn_setup,
struct resp_ctx **responder_ctx)
{
@@ -1039,7 +1041,7 @@ int sss_process_init(TALLOC_CTX *mem_ctx,
continue;
}
- ret = sss_dp_init(rctx, dp_intf, cli_name, dom);
+ ret = sss_dp_init(rctx, sbus_iface, cli_name, dom);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE,
"fatal error setting up backend connector\n");
diff --git a/src/responder/common/responder_get_domains.c b/src/responder/common/responder_get_domains.c
index 6b354d8b2251f3a5cf576a58ae191fd99f307dd7..cc7b99f30046569547a08f83e46cbbe9d6c19897 100644
--- a/src/responder/common/responder_get_domains.c
+++ b/src/responder/common/responder_get_domains.c
@@ -88,8 +88,8 @@ sss_dp_get_domains_msg(void *pvt)
msg = dbus_message_new_method_call(NULL,
DP_PATH,
- DATA_PROVIDER_IFACE,
- DATA_PROVIDER_IFACE_GETDOMAINS);
+ IFACE_DP,
+ IFACE_DP_GETDOMAINS);
if (msg == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
return NULL;
diff --git a/src/responder/ifp/ifpsrv.c b/src/responder/ifp/ifpsrv.c
index a2137ecb218824909325df6c7052dbbbcb144679..0555c00167045707b7d455d28df368749b9b84f6 100644
--- a/src/responder/ifp/ifpsrv.c
+++ b/src/responder/ifp/ifpsrv.c
@@ -58,17 +58,6 @@ struct mon_cli_iface monitor_ifp_methods = {
.sysbusReconnect = ifp_sysbus_reconnect,
};
-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[] = {
@@ -238,7 +227,7 @@ int ifp_process_init(TALLOC_CTX *mem_ctx,
SSS_IFP_SBUS_SERVICE_VERSION,
&monitor_ifp_methods,
"InfoPipe",
- &ifp_dp_methods.vtable,
+ NULL,
sss_connection_setup,
&rctx);
if (ret != EOK) {
diff --git a/src/responder/nss/nss_iface.c b/src/responder/nss/nss_iface.c
new file mode 100644
index 0000000000000000000000000000000000000000..b01732e086c5fc5c7018ec84c3438e19ed812fef
--- /dev/null
+++ b/src/responder/nss/nss_iface.c
@@ -0,0 +1,38 @@
+/*
+ Authors:
+ Pavel BÅezina <pbrez...@redhat.com>
+
+ Copyright (C) 2016 Red Hat
+
+ 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 "sbus/sssd_dbus.h"
+#include "responder/nss/nss_iface.h"
+#include "responder/nss/nsssrv.h"
+
+struct iface_nss_memorycache iface_nss_memorycache = {
+ { &iface_nss_memorycache_meta, 0 },
+ .UpdateInitgroups = nss_memorycache_update_initgroups
+};
+
+static struct sbus_iface_map iface_map[] = {
+ { NSS_MEMORYCACHE_PATH, &iface_nss_memorycache.vtable },
+ { NULL, NULL }
+};
+
+struct sbus_iface_map *nss_get_sbus_interface()
+{
+ return iface_map;
+}
diff --git a/src/responder/nss/nss_iface.h b/src/responder/nss/nss_iface.h
new file mode 100644
index 0000000000000000000000000000000000000000..ab59928c3e2dac62cea6f793ff774d9e0f8da6db
--- /dev/null
+++ b/src/responder/nss/nss_iface.h
@@ -0,0 +1,30 @@
+/*
+ Authors:
+ Pavel BÅezina <pbrez...@redhat.com>
+
+ Copyright (C) 2016 Red Hat
+
+ 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 _NSS_IFACE_H_
+#define _NSS_IFACE_H_
+
+#include "responder/nss/nss_iface_generated.h"
+
+#define NSS_MEMORYCACHE_PATH "/org/freedesktop/sssd/nss/memcache"
+
+struct sbus_iface_map *nss_get_sbus_interface(void);
+
+#endif /* _NSS_IFACE_H_ */
diff --git a/src/responder/nss/nss_iface.xml b/src/responder/nss/nss_iface.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b7cc4deb77135a592bad2ca62570f206231129b7
--- /dev/null
+++ b/src/responder/nss/nss_iface.xml
@@ -0,0 +1,12 @@
+<!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.nss.MemoryCache">
+ <annotation value="iface_nss_memorycache" name="org.freedesktop.DBus.GLib.CSymbol"/>
+ <method name="UpdateInitgroups">
+ <arg name="user" type="s" direction="in" />
+ <arg name="domain" type="s" direction="in" />
+ <arg name="groups" type="au" direction="in" />
+ </method>
+ </interface>
+</node>
diff --git a/src/responder/nss/nss_iface_generated.c b/src/responder/nss/nss_iface_generated.c
new file mode 100644
index 0000000000000000000000000000000000000000..2d0031090e33df9c9e9d9fbf1a18825026509803
--- /dev/null
+++ b/src/responder/nss/nss_iface_generated.c
@@ -0,0 +1,69 @@
+/* The following definitions are auto-generated from nss_iface.xml */
+
+#include "util/util.h"
+#include "sbus/sssd_dbus.h"
+#include "sbus/sssd_dbus_meta.h"
+#include "sbus/sssd_dbus_invokers.h"
+#include "nss_iface_generated.h"
+
+/* invokes a handler with a 'ssau' DBus signature */
+static int invoke_ssau_method(struct sbus_request *dbus_req, void *function_ptr);
+
+/* arguments for org.freedesktop.sssd.nss.MemoryCache.UpdateInitgroups */
+const struct sbus_arg_meta iface_nss_memorycache_UpdateInitgroups__in[] = {
+ { "user", "s" },
+ { "domain", "s" },
+ { "groups", "au" },
+ { NULL, }
+};
+
+int iface_nss_memorycache_UpdateInitgroups_finish(struct sbus_request *req)
+{
+ return sbus_request_return_and_finish(req,
+ DBUS_TYPE_INVALID);
+}
+
+/* methods for org.freedesktop.sssd.nss.MemoryCache */
+const struct sbus_method_meta iface_nss_memorycache__methods[] = {
+ {
+ "UpdateInitgroups", /* name */
+ iface_nss_memorycache_UpdateInitgroups__in,
+ NULL, /* no out_args */
+ offsetof(struct iface_nss_memorycache, UpdateInitgroups),
+ invoke_ssau_method,
+ },
+ { NULL, }
+};
+
+/* interface info for org.freedesktop.sssd.nss.MemoryCache */
+const struct sbus_interface_meta iface_nss_memorycache_meta = {
+ "org.freedesktop.sssd.nss.MemoryCache", /* name */
+ iface_nss_memorycache__methods,
+ NULL, /* no signals */
+ NULL, /* no properties */
+ sbus_invoke_get_all, /* GetAll invoker */
+};
+
+/* invokes a handler with a 'ssau' DBus signature */
+static int invoke_ssau_method(struct sbus_request *dbus_req, void *function_ptr)
+{
+ const char * arg_0;
+ const char * arg_1;
+ uint32_t *arg_2;
+ int len_2;
+ int (*handler)(struct sbus_request *, void *, const char *, const char *, uint32_t[], int) = function_ptr;
+
+ if (!sbus_request_parse_or_finish(dbus_req,
+ DBUS_TYPE_STRING, &arg_0,
+ DBUS_TYPE_STRING, &arg_1,
+ DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &arg_2, &len_2,
+ DBUS_TYPE_INVALID)) {
+ return EOK; /* request handled */
+ }
+
+ return (handler)(dbus_req, dbus_req->intf->handler_data,
+ arg_0,
+ arg_1,
+ arg_2,
+ len_2);
+}
diff --git a/src/responder/nss/nss_iface_generated.h b/src/responder/nss/nss_iface_generated.h
new file mode 100644
index 0000000000000000000000000000000000000000..ad902482a9be03a60cbf3663b6f771d0a2020b88
--- /dev/null
+++ b/src/responder/nss/nss_iface_generated.h
@@ -0,0 +1,58 @@
+/* The following declarations are auto-generated from nss_iface.xml */
+
+#ifndef __NSS_IFACE_XML__
+#define __NSS_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.nss.MemoryCache */
+#define IFACE_NSS_MEMORYCACHE "org.freedesktop.sssd.nss.MemoryCache"
+#define IFACE_NSS_MEMORYCACHE_UPDATEINITGROUPS "UpdateInitgroups"
+
+/* ------------------------------------------------------------------------
+ * DBus handlers
+ *
+ * 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 are 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.
+ *
+ * Handlers have a matching xxx_finish() function (unless the method has
+ * accepts raw messages). These finish functions the
+ * sbus_request_return_and_finish() with the appropriate arguments to
+ * construct a valid reply. Once a finish function has been called, the
+ * @dbus_req it was called with is freed and no longer valid.
+ */
+
+/* vtable for org.freedesktop.sssd.nss.MemoryCache */
+struct iface_nss_memorycache {
+ struct sbus_vtable vtable; /* derive from sbus_vtable */
+ int (*UpdateInitgroups)(struct sbus_request *req, void *data, const char *arg_user, const char *arg_domain, uint32_t arg_groups[], int len_groups);
+};
+
+/* finish function for UpdateInitgroups */
+int iface_nss_memorycache_UpdateInitgroups_finish(struct sbus_request *req);
+
+/* ------------------------------------------------------------------------
+ * 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.nss.MemoryCache */
+extern const struct sbus_interface_meta iface_nss_memorycache_meta;
+
+#endif /* __NSS_IFACE_XML__ */
diff --git a/src/responder/nss/nsssrv.c b/src/responder/nss/nsssrv.c
index 8be3455e57e07481e7cf7d4d0f525dad5b8601fc..05b51ecdf2e17e20af2ee3ee48377cbe1bf19a24 100644
--- a/src/responder/nss/nsssrv.c
+++ b/src/responder/nss/nsssrv.c
@@ -37,6 +37,7 @@
#include "responder/nss/nsssrv_private.h"
#include "responder/nss/nsssrv_mmap_cache.h"
#include "responder/nss/nsssrv_netgroup.h"
+#include "responder/nss/nss_iface.h"
#include "responder/common/negcache.h"
#include "db/sysdb.h"
#include "confdb/confdb.h"
@@ -327,7 +328,7 @@ done:
return ret;
}
-static int nss_update_memcache(struct sbus_request *dbus_req, void *data)
+int nss_update_memcache(struct sbus_request *dbus_req, void *data)
{
struct resp_ctx *rctx = talloc_get_type(data, struct resp_ctx);
struct nss_ctx *nctx = talloc_get_type(rctx->pvt_ctx, struct nss_ctx);
@@ -338,37 +339,24 @@ static int nss_update_memcache(struct sbus_request *dbus_req, void *data)
return EOK;
}
-static int nss_memcache_initgr_check(struct sbus_request *dbus_req, void *data)
+int nss_memorycache_update_initgroups(struct sbus_request *sbus_req,
+ void *data,
+ const char *user,
+ const char *domain,
+ uint32_t *groups,
+ int num_groups)
{
struct resp_ctx *rctx = talloc_get_type(data, struct resp_ctx);
struct nss_ctx *nctx = talloc_get_type(rctx->pvt_ctx, struct nss_ctx);
- char *user;
- char *domain;
- uint32_t *groups;
- int gnum;
- if (!sbus_request_parse_or_finish(dbus_req,
- DBUS_TYPE_STRING, &user,
- DBUS_TYPE_STRING, &domain,
- DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &groups, &gnum,
- DBUS_TYPE_INVALID)) {
- return EOK; /* handled */
- }
+ DEBUG(SSSDBG_TRACE_LIBS, "Updating inigroups memory cache of [%s@%s]\n",
+ user, domain);
- DEBUG(SSSDBG_TRACE_LIBS,
- "Got request for [%s@%s]\n", user, domain);
+ nss_update_initgr_memcache(nctx, user, domain, num_groups, groups);
- nss_update_initgr_memcache(nctx, user, domain, gnum, groups);
-
- return sbus_request_return_and_finish(dbus_req, DBUS_TYPE_INVALID);
+ return iface_nss_memorycache_UpdateInitgroups_finish(sbus_req);
}
-static struct data_provider_rev_iface nss_dp_methods = {
- { &data_provider_rev_iface_meta, 0 },
- .updateCache = nss_update_memcache,
- .initgrCheck = nss_memcache_initgr_check
-};
-
static void nss_dp_reconnect_init(struct sbus_connection *conn,
int status, void *pvt)
{
@@ -419,7 +407,8 @@ int nss_process_init(TALLOC_CTX *mem_ctx,
NSS_SBUS_SERVICE_NAME,
NSS_SBUS_SERVICE_VERSION,
&monitor_nss_methods,
- "NSS", &nss_dp_methods.vtable,
+ "NSS",
+ nss_get_sbus_interface(),
nss_connection_setup,
&rctx);
if (ret != EOK) {
diff --git a/src/responder/nss/nsssrv.h b/src/responder/nss/nsssrv.h
index 2977479aa52082480f92eab94f7833e2e696a9ac..d4a80f76df236f40d872c701687bf453255d9890 100644
--- a/src/responder/nss/nsssrv.h
+++ b/src/responder/nss/nsssrv.h
@@ -81,4 +81,11 @@ struct nss_packet;
struct sss_cmd_table *get_nss_cmds(void);
+int nss_memorycache_update_initgroups(struct sbus_request *sbus_req,
+ void *data,
+ const char *user,
+ const char *domain,
+ uint32_t *groups,
+ int num_groups);
+
#endif /* __NSSSRV_H__ */
diff --git a/src/responder/pac/pacsrv.c b/src/responder/pac/pacsrv.c
index 15d1986f842ac8397cf509ca8ef44728d6ddc5f1..852deb10eff014189d35a2769d895a901d8296e1 100644
--- a/src/responder/pac/pacsrv.c
+++ b/src/responder/pac/pacsrv.c
@@ -61,17 +61,6 @@ struct mon_cli_iface monitor_pac_methods = {
.sysbusReconnect = NULL,
};
-static struct data_provider_iface pac_dp_methods = {
- { &data_provider_iface_meta, 0 },
- .RegisterService = NULL,
- .pamHandler = NULL,
- .sudoHandler = NULL,
- .autofsHandler = NULL,
- .hostHandler = NULL,
- .getDomains = NULL,
- .getAccountInfo = NULL,
-};
-
/* TODO: check if this can be made generic for all responders */
static void pac_dp_reconnect_init(struct sbus_connection *conn,
int status, void *pvt)
@@ -122,7 +111,7 @@ int pac_process_init(TALLOC_CTX *mem_ctx,
PAC_SBUS_SERVICE_NAME,
PAC_SBUS_SERVICE_VERSION,
&monitor_pac_methods,
- "PAC", &pac_dp_methods.vtable,
+ "PAC", NULL,
sss_connection_setup,
&rctx);
if (ret != EOK) {
diff --git a/src/responder/pam/pamsrv.c b/src/responder/pam/pamsrv.c
index efd1e5c7527decda5de7304b54919846fa2ee0db..9374de4d63b2886262ca1541daff581603d7c838 100644
--- a/src/responder/pam/pamsrv.c
+++ b/src/responder/pam/pamsrv.c
@@ -66,17 +66,6 @@ struct mon_cli_iface monitor_pam_methods = {
.sysbusReconnect = NULL,
};
-static struct data_provider_iface pam_dp_methods = {
- { &data_provider_iface_meta, 0 },
- .RegisterService = NULL,
- .pamHandler = NULL,
- .sudoHandler = NULL,
- .autofsHandler = NULL,
- .hostHandler = NULL,
- .getDomains = NULL,
- .getAccountInfo = NULL,
-};
-
static void pam_dp_reconnect_init(struct sbus_connection *conn, int status, void *pvt)
{
struct be_conn *be_conn = talloc_get_type(pvt, struct be_conn);
@@ -201,7 +190,7 @@ static int pam_process_init(TALLOC_CTX *mem_ctx,
SSS_PAM_SBUS_SERVICE_NAME,
SSS_PAM_SBUS_SERVICE_VERSION,
&monitor_pam_methods,
- "PAM", &pam_dp_methods.vtable,
+ "PAM", NULL,
sss_connection_setup,
&rctx);
if (ret != EOK) {
diff --git a/src/responder/pam/pamsrv_dp.c b/src/responder/pam/pamsrv_dp.c
index 826146350670d67f897ee7eec2cf6ca607b96435..aa3fdc3c32d234ed54a9f5202886157601ee3846 100644
--- a/src/responder/pam/pamsrv_dp.c
+++ b/src/responder/pam/pamsrv_dp.c
@@ -130,8 +130,8 @@ int pam_dp_send_req(struct pam_auth_req *preq, int timeout)
msg = dbus_message_new_method_call(NULL,
DP_PATH,
- DATA_PROVIDER_IFACE,
- DATA_PROVIDER_IFACE_PAMHANDLER);
+ IFACE_DP,
+ IFACE_DP_PAMHANDLER);
if (msg == NULL) {
DEBUG(SSSDBG_FATAL_FAILURE,"Out of memory?!\n");
return ENOMEM;
diff --git a/src/responder/ssh/sshsrv.c b/src/responder/ssh/sshsrv.c
index f763e3b00d20527225046a85609e7ff56861f682..88938215b542b5748721cfecc59ca4141010fb88 100644
--- a/src/responder/ssh/sshsrv.c
+++ b/src/responder/ssh/sshsrv.c
@@ -41,17 +41,6 @@ struct mon_cli_iface monitor_ssh_methods = {
.sysbusReconnect = NULL,
};
-static struct data_provider_iface ssh_dp_methods = {
- { &data_provider_iface_meta, 0 },
- .RegisterService = NULL,
- .pamHandler = NULL,
- .sudoHandler = NULL,
- .autofsHandler = NULL,
- .hostHandler = NULL,
- .getDomains = NULL,
- .getAccountInfo = NULL,
-};
-
static void ssh_dp_reconnect_init(struct sbus_connection *conn,
int status, void *pvt)
{
@@ -96,7 +85,7 @@ int ssh_process_init(TALLOC_CTX *mem_ctx,
SSS_SSH_SBUS_SERVICE_VERSION,
&monitor_ssh_methods,
"SSH",
- &ssh_dp_methods.vtable,
+ NULL,
sss_connection_setup,
&rctx);
if (ret != EOK) {
diff --git a/src/responder/sudo/sudosrv.c b/src/responder/sudo/sudosrv.c
index e0346033e38f1e39e621e131c3265a583b91a5c3..d832686a8572f3729a0477cdca2f77ebcb19fbc0 100644
--- a/src/responder/sudo/sudosrv.c
+++ b/src/responder/sudo/sudosrv.c
@@ -42,17 +42,6 @@ struct mon_cli_iface monitor_sudo_methods = {
.sysbusReconnect = NULL,
};
-static struct data_provider_iface sudo_dp_methods = {
- { &data_provider_iface_meta, 0 },
- .RegisterService = NULL,
- .pamHandler = NULL,
- .sudoHandler = NULL,
- .autofsHandler = NULL,
- .hostHandler = NULL,
- .getDomains = NULL,
- .getAccountInfo = NULL,
-};
-
static void sudo_dp_reconnect_init(struct sbus_connection *conn,
int status,
void *pvt)
@@ -98,7 +87,7 @@ int sudo_process_init(TALLOC_CTX *mem_ctx,
SSS_SUDO_SBUS_SERVICE_VERSION,
&monitor_sudo_methods,
"SUDO",
- &sudo_dp_methods.vtable,
+ NULL,
sss_connection_setup,
&rctx);
if (ret != EOK) {
diff --git a/src/tests/cwrap/Makefile.am b/src/tests/cwrap/Makefile.am
index d8a49f1434cefc02bc7fce505d1b4e07fc74ec5f..3e40cba52e927730483b14cc7e56687b250de646 100644
--- a/src/tests/cwrap/Makefile.am
+++ b/src/tests/cwrap/Makefile.am
@@ -49,7 +49,6 @@ SSSD_RESPONDER_OBJ = \
../../../src/responder/common/data_provider/rdp_message.c \
../../../src/responder/common/data_provider/rdp_client.c \
../../../src/monitor/monitor_iface_generated.c \
- ../../../src/providers/data_provider_iface_generated.c \
../../../src/providers/data_provider_req.c
dist_noinst_DATA = \
--
2.1.0
From 51ace9549829daa87a47218ed174de59752de177 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrez...@redhat.com>
Date: Tue, 19 Jul 2016 14:42:26 +0200
Subject: [PATCH 4/4] NSS: Remove unused functions
When removing the old data provider I noticed that those functions
are not used at all.
---
src/responder/nss/nsssrv.c | 11 ----
src/responder/nss/nsssrv_cmd.c | 112 -------------------------------------
src/responder/nss/nsssrv_private.h | 2 -
3 files changed, 125 deletions(-)
diff --git a/src/responder/nss/nsssrv.c b/src/responder/nss/nsssrv.c
index 05b51ecdf2e17e20af2ee3ee48377cbe1bf19a24..06d58f21b00b73c6c7a4b7583e10b4b61a627d75 100644
--- a/src/responder/nss/nsssrv.c
+++ b/src/responder/nss/nsssrv.c
@@ -328,17 +328,6 @@ done:
return ret;
}
-int nss_update_memcache(struct sbus_request *dbus_req, void *data)
-{
- struct resp_ctx *rctx = talloc_get_type(data, struct resp_ctx);
- struct nss_ctx *nctx = talloc_get_type(rctx->pvt_ctx, struct nss_ctx);
-
- nss_update_pw_memcache(nctx);
- nss_update_gr_memcache(nctx);
-
- return EOK;
-}
-
int nss_memorycache_update_initgroups(struct sbus_request *sbus_req,
void *data,
const char *user,
diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c
index 1ae17969688fa29734ca14fd2b152decef1fdbca..196bdb7a30936e2f1c7b60ed27687c3453bba592 100644
--- a/src/responder/nss/nsssrv_cmd.c
+++ b/src/responder/nss/nsssrv_cmd.c
@@ -118,66 +118,6 @@ static int nss_reset_negcache(struct resp_ctx *rctx)
* PASSWD db related functions
***************************************************************************/
-void nss_update_pw_memcache(struct nss_ctx *nctx)
-{
- struct sss_domain_info *dom;
- struct ldb_result *res;
- uint64_t exp;
- struct sized_string key;
- const char *id;
- time_t now;
- int ret;
- int i;
-
- now = time(NULL);
-
- for (dom = nctx->rctx->domains; dom; dom = get_next_domain(dom, 0)) {
- ret = sysdb_enumpwent_with_views(nctx, dom, &res);
- if (ret != EOK) {
- DEBUG(SSSDBG_CRIT_FAILURE,
- "Failed to enumerate users for domain [%s]\n", dom->name);
- continue;
- }
-
- for (i = 0; i < res->count; i++) {
- exp = ldb_msg_find_attr_as_uint64(res->msgs[i],
- SYSDB_CACHE_EXPIRE, 0);
- if (exp >= now) {
- continue;
- }
-
- /* names require more manipulation (build up fqname conditionally),
- * but uidNumber is unique and always resolvable too, so we use
- * that to update the cache, as it points to the same entry */
- id = sss_view_ldb_msg_find_attr_as_string(dom, res->msgs[i],
- SYSDB_UIDNUM, NULL);
- if (!id) {
- DEBUG(SSSDBG_CRIT_FAILURE,
- "Failed to find uidNumber in %s.\n",
- ldb_dn_get_linearized(res->msgs[i]->dn));
- continue;
- }
- to_sized_string(&key, id);
-
- ret = sss_mmap_cache_pw_invalidate(nctx->pwd_mc_ctx, &key);
- if (ret != EOK && ret != ENOENT) {
- DEBUG(SSSDBG_CRIT_FAILURE,
- "Internal failure in memory cache code: %d [%s]\n",
- ret, strerror(ret));
- }
-
- ret = sss_mmap_cache_pw_invalidate(nctx->initgr_mc_ctx, &key);
- if (ret != EOK && ret != ENOENT) {
- DEBUG(SSSDBG_CRIT_FAILURE,
- "Internal failure in memory cache code: %d [%s]\n",
- ret, strerror(ret));
- }
- }
-
- talloc_zfree(res);
- }
-}
-
static gid_t get_gid_override(struct ldb_message *msg,
struct sss_domain_info *dom)
{
@@ -2735,58 +2675,6 @@ done:
* GROUP db related functions
***************************************************************************/
-void nss_update_gr_memcache(struct nss_ctx *nctx)
-{
- struct sss_domain_info *dom;
- struct ldb_result *res;
- uint64_t exp;
- struct sized_string key;
- const char *id;
- time_t now;
- int ret;
- int i;
-
- now = time(NULL);
-
- for (dom = nctx->rctx->domains; dom; dom = get_next_domain(dom, 0)) {
- ret = sysdb_enumgrent_with_views(nctx, dom, &res);
- if (ret != EOK) {
- DEBUG(SSSDBG_CRIT_FAILURE,
- "Failed to enumerate users for domain [%s]\n", dom->name);
- continue;
- }
-
- for (i = 0; i < res->count; i++) {
- exp = ldb_msg_find_attr_as_uint64(res->msgs[i],
- SYSDB_CACHE_EXPIRE, 0);
- if (exp >= now) {
- continue;
- }
-
- /* names require more manipulation (build up fqname conditionally),
- * but uidNumber is unique and always resolvable too, so we use
- * that to update the cache, as it points to the same entry */
- id = sss_view_ldb_msg_find_attr_as_string(dom, res->msgs[i],
- SYSDB_GIDNUM, NULL);
- if (!id) {
- DEBUG(SSSDBG_CRIT_FAILURE,
- "Failed to find gidNumber in %s.\n",
- ldb_dn_get_linearized(res->msgs[i]->dn));
- continue;
- }
- to_sized_string(&key, id);
-
- ret = sss_mmap_cache_gr_invalidate(nctx->grp_mc_ctx, &key);
- if (ret != EOK && ret != ENOENT) {
- DEBUG(SSSDBG_CRIT_FAILURE,
- "Internal failure in memory cache code: %d [%s]\n",
- ret, strerror(ret));
- }
- }
- talloc_zfree(res);
- }
-}
-
#define GID_ROFFSET 0
#define MNUM_ROFFSET sizeof(uint32_t)
#define STRS_ROFFSET 2*sizeof(uint32_t)
diff --git a/src/responder/nss/nsssrv_private.h b/src/responder/nss/nsssrv_private.h
index 79c7b7265f66f57e0ea89fe192a1da4f8992f1a3..c6f57235ca9f14fb80ead7c88bf830906c8b94ef 100644
--- a/src/responder/nss/nsssrv_private.h
+++ b/src/responder/nss/nsssrv_private.h
@@ -143,8 +143,6 @@ errno_t check_cache(struct nss_dom_ctx *dctx,
sss_dp_callback_t callback,
void *pvt);
-void nss_update_pw_memcache(struct nss_ctx *nctx);
-void nss_update_gr_memcache(struct nss_ctx *nctx);
void nss_update_initgr_memcache(struct nss_ctx *nctx,
const char *name, const char *domain,
int gnum, uint32_t *groups);
--
2.1.0
_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/admin/lists/sssd-devel@lists.fedorahosted.org