>From 7d42b1d95533aa2e66c7ffb8454f0cda62068397 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek 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