[SSSD] [PATCH] SUDO: Provide a sudo DP request based on the internal_req
Jakub Hrozek
jhrozek at redhat.com
Sun Jan 22 21:14:23 UTC 2012
The attached patch requires the DP refactoring patch. It contains a
sudo-specific DP request.
A patch that actually uses the request in the sudo responder is being
tested now, but I wanted to get an early response on the approach.
-------------- next part --------------
>From 7d42b1d95533aa2e66c7ffb8454f0cda62068397 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Thu, 19 Jan 2012 10:00:47 +0100
Subject: [PATCH 2/2] SUDO: Provide a sudo DP request based on the
internal_req
---
src/providers/data_provider.h | 1 +
src/responder/common/responder.h | 18 ++++-
src/responder/common/responder_dp.c | 141 +++++++++++++++++++++++++++++++++++
3 files changed, 159 insertions(+), 1 deletions(-)
diff --git a/src/providers/data_provider.h b/src/providers/data_provider.h
index fb61c730a2daca28b76a6f50fed5019a17d8a6d6..eb4f98cf3a62a6356b31758c0ebbd028ae0fff21 100644
--- a/src/providers/data_provider.h
+++ b/src/providers/data_provider.h
@@ -137,6 +137,7 @@
#define BE_REQ_INITGROUPS 0x0003
#define BE_REQ_NETGROUP 0x0004
#define BE_REQ_SERVICES 0x0005
+#define BE_REQ_SUDO 0x0006
#define BE_REQ_FAST 0x1000
/* AUTH related common data and functions */
diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h
index 12196a3430a68120eba13e625d8050036bd0484a..49c105ac9cb54973b6c67dac201c235056866820 100644
--- a/src/responder/common/responder.h
+++ b/src/responder/common/responder.h
@@ -162,7 +162,8 @@ enum sss_dp_type {
SSS_DP_GROUP,
SSS_DP_INITGROUPS,
SSS_DP_NETGR,
- SSS_DP_SERVICES
+ SSS_DP_SERVICES,
+ SSS_DP_SUDO
};
typedef void (*sss_dp_callback_t)(uint16_t err_maj, uint32_t err_min,
@@ -204,6 +205,21 @@ sss_dp_get_account_recv(TALLOC_CTX *mem_ctx,
dbus_uint32_t *err_min,
char **err_msg);
+struct tevent_req *
+sss_dp_get_sudoers_send(TALLOC_CTX *mem_ctx,
+ struct resp_ctx *rctx,
+ struct sss_domain_info *dom,
+ bool fast_reply,
+ int type,
+ const char *name);
+
+errno_t
+sss_dp_get_sudoers_recv(TALLOC_CTX *mem_ctx,
+ struct tevent_req *req,
+ dbus_uint16_t *err_maj,
+ dbus_uint32_t *err_min,
+ char **err_msg);
+
bool sss_utf8_check(const uint8_t *s, size_t n);
#endif /* __SSS_RESPONDER_H__ */
diff --git a/src/responder/common/responder_dp.c b/src/responder/common/responder_dp.c
index f101a3c85d74acdd382d83f4e0efc6bcfa2d1d82..f59a6d656242a27e5795218aa6542aa7b0f78cf9 100644
--- a/src/responder/common/responder_dp.c
+++ b/src/responder/common/responder_dp.c
@@ -567,6 +567,147 @@ sss_dp_get_account_recv(TALLOC_CTX *mem_ctx,
return sss_dp_req_recv(mem_ctx, req, err_maj, err_min, err_msg);
}
+static void sss_dp_get_sudoers_done(struct tevent_req *subreq);
+
+struct sss_dp_get_sudoers_info {
+ struct sss_domain_info *dom;
+
+ bool fast_reply;
+ int type;
+ const char *name;
+};
+
+static DBusMessage *
+sss_dp_get_sudoers_msg(void *pvt);
+
+struct tevent_req *
+sss_dp_get_sudoers_send(TALLOC_CTX *mem_ctx,
+ struct resp_ctx *rctx,
+ struct sss_domain_info *dom,
+ bool fast_reply,
+ int type,
+ const char *name)
+{
+ struct tevent_req *req;
+ struct sss_dp_req_state *state;
+ struct sss_dp_get_sudoers_info *info;
+ errno_t ret;
+
+ req = tevent_req_create(mem_ctx, &state, struct sss_dp_req_state);
+ if (!req) {
+ ret = ENOMEM;
+ goto error;
+ }
+
+ if (!dom) {
+ ret = EINVAL;
+ goto error;
+ }
+
+ info = talloc_zero(state, struct sss_dp_get_sudoers_info);
+ info->fast_reply = fast_reply;
+ info->type = type;
+ info->name = name;
+ info->dom = dom;
+
+ state->key = talloc(state, hash_key_t);
+ if (!state->key) {
+ ret = ENOMEM;
+ goto error;
+ }
+
+ state->key->type = HASH_KEY_STRING;
+
+ state->key->str = talloc_asprintf(state->key, "%d:%s@%s",
+ type, name, dom->name);
+ if (!state->key->str) {
+ ret = ENOMEM;
+ goto error;
+ }
+
+ ret = sss_dp_issue_request(state, rctx, state->key, dom,
+ sss_dp_get_sudoers_msg, state,
+ req, sss_dp_get_sudoers_done);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_OP_FAILURE,
+ ("Could not issue DP request [%d]: %s\n",
+ ret, strerror(ret)));
+ goto error;
+ }
+
+ return req;
+
+error:
+ tevent_req_error(req, ret);
+ tevent_req_post(req, rctx->ev);
+ return req;
+}
+
+static DBusMessage *
+sss_dp_get_sudoers_msg(void *pvt)
+{
+ DBusMessage *msg;
+ dbus_bool_t dbret;
+ struct sss_dp_get_sudoers_info *info;
+ uint32_t be_type = BE_REQ_SUDO;
+ char *filter;
+
+ info = talloc_get_type(pvt, struct sss_dp_get_sudoers_info);
+
+ if (info->fast_reply) {
+ be_type |= BE_REQ_FAST;
+ }
+
+ filter = talloc_asprintf(info, "name=%s", info->name);
+ if (!filter) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory?!\n"));
+ return NULL;
+ }
+
+ msg = dbus_message_new_method_call(NULL,
+ DP_PATH,
+ DP_INTERFACE,
+ DP_METHOD_SUDOHANDLER);
+ if (msg == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory?!\n"));
+ return NULL;
+ }
+
+ /* create the message */
+ DEBUG(SSSDBG_TRACE_FUNC,
+ ("Creating SUDOers request for [%s][%u][%s]\n",
+ info->dom->name, be_type, filter));
+
+ dbret = dbus_message_append_args(msg,
+ DBUS_TYPE_UINT32, &be_type,
+ DBUS_TYPE_STRING, &filter,
+ DBUS_TYPE_INVALID);
+ talloc_free(filter);
+ if (!dbret) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to build message\n"));
+ dbus_message_unref(msg);
+ return NULL;
+ }
+
+ return msg;
+}
+
+static void
+sss_dp_get_sudoers_done(struct tevent_req *sidereq)
+{
+ talloc_free(sidereq);
+}
+
+errno_t
+sss_dp_get_sudoers_recv(TALLOC_CTX *mem_ctx,
+ struct tevent_req *req,
+ dbus_uint16_t *err_maj,
+ dbus_uint32_t *err_min,
+ char **err_msg)
+{
+ return sss_dp_req_recv(mem_ctx, req, err_maj, err_min, err_msg);
+}
+
struct dp_internal_get_state {
struct resp_ctx *rctx;
struct sss_domain_info *dom;
--
1.7.7.5
More information about the sssd-devel
mailing list