From 0b780a0d50e4ebb279b3ba36869d8e62c3c38044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= Date: Wed, 28 Aug 2019 12:40:56 +0200 Subject: [PATCH 82/90] dp: add additional autofs methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves: https://pagure.io/SSSD/sssd/issue/2607 Reviewed-by: Tomáš Halman --- src/providers/data_provider/dp.h | 2 ++ src/providers/data_provider/dp_custom_data.h | 1 + src/providers/data_provider/dp_iface.h | 4 ++- src/providers/data_provider/dp_iface.xml | 2 ++ .../data_provider/dp_iface_generated.c | 36 +++++++++++++++++-- .../data_provider/dp_iface_generated.h | 2 +- .../data_provider/dp_target_autofs.c | 28 +++++++++++++-- .../plugins/cache_req_autofs_entry_by_name.c | 3 +- .../plugins/cache_req_autofs_map_by_name.c | 3 +- .../plugins/cache_req_autofs_map_entries.c | 3 +- src/responder/common/responder.h | 7 ++-- src/responder/common/responder_dp_autofs.c | 19 ++++++---- 12 files changed, 91 insertions(+), 19 deletions(-) diff --git a/src/providers/data_provider/dp.h b/src/providers/data_provider/dp.h index 8ef4a92ae..df774fcf4 100644 --- a/src/providers/data_provider/dp.h +++ b/src/providers/data_provider/dp.h @@ -85,6 +85,8 @@ enum dp_methods { DPM_REFRESH_ACCESS_RULES, + DPM_AUTOFS_GET_MAP, + DPM_AUTOFS_GET_ENTRY, DPM_AUTOFS_ENUMERATE, DP_METHOD_SENTINEL diff --git a/src/providers/data_provider/dp_custom_data.h b/src/providers/data_provider/dp_custom_data.h index 7c64bde45..b5f41786c 100644 --- a/src/providers/data_provider/dp_custom_data.h +++ b/src/providers/data_provider/dp_custom_data.h @@ -37,6 +37,7 @@ struct dp_hostid_data { struct dp_autofs_data { const char *mapname; + const char *entryname; }; struct dp_subdomains_data { diff --git a/src/providers/data_provider/dp_iface.h b/src/providers/data_provider/dp_iface.h index 0a2f81eb5..5af1fdff0 100644 --- a/src/providers/data_provider/dp_iface.h +++ b/src/providers/data_provider/dp_iface.h @@ -52,7 +52,9 @@ errno_t dp_host_handler(struct sbus_request *sbus_req, errno_t dp_autofs_handler(struct sbus_request *sbus_req, void *dp_cli, uint32_t dp_flags, - const char *mapname); + uint32_t method, + const char *mapname, + const char *entryname); errno_t dp_subdomains_handler(struct sbus_request *sbus_req, void *dp_cli, diff --git a/src/providers/data_provider/dp_iface.xml b/src/providers/data_provider/dp_iface.xml index c2431850b..545d9aaa4 100644 --- a/src/providers/data_provider/dp_iface.xml +++ b/src/providers/data_provider/dp_iface.xml @@ -50,7 +50,9 @@ + + diff --git a/src/providers/data_provider/dp_iface_generated.c b/src/providers/data_provider/dp_iface_generated.c index 4d0934445..453ca8854 100644 --- a/src/providers/data_provider/dp_iface_generated.c +++ b/src/providers/data_provider/dp_iface_generated.c @@ -12,8 +12,8 @@ /* invokes a handler with a 's' DBus signature */ static int invoke_s_method(struct sbus_request *dbus_req, void *function_ptr); -/* invokes a handler with a 'us' DBus signature */ -static int invoke_us_method(struct sbus_request *dbus_req, void *function_ptr); +/* invokes a handler with a 'uuss' DBus signature */ +static int invoke_uuss_method(struct sbus_request *dbus_req, void *function_ptr); /* invokes a handler with a 'uss' DBus signature */ static int invoke_uss_method(struct sbus_request *dbus_req, void *function_ptr); @@ -21,6 +21,9 @@ static int invoke_uss_method(struct sbus_request *dbus_req, void *function_ptr); /* invokes a handler with a 'uusss' DBus signature */ static int invoke_uusss_method(struct sbus_request *dbus_req, void *function_ptr); +/* invokes a handler with a 'us' DBus signature */ +static int invoke_us_method(struct sbus_request *dbus_req, void *function_ptr); + /* arguments for org.freedesktop.sssd.DataProvider.Client.Register */ const struct sbus_arg_meta iface_dp_client_Register__in[] = { { "Name", "s" }, @@ -217,7 +220,9 @@ const struct sbus_interface_meta iface_dp_access_control_meta = { /* arguments for org.freedesktop.sssd.dataprovider.autofsHandler */ const struct sbus_arg_meta iface_dp_autofsHandler__in[] = { { "dp_flags", "u" }, + { "method", "u" }, { "mapname", "s" }, + { "entryname", "s" }, { NULL, } }; @@ -358,7 +363,7 @@ const struct sbus_method_meta iface_dp__methods[] = { iface_dp_autofsHandler__in, iface_dp_autofsHandler__out, offsetof(struct iface_dp, autofsHandler), - invoke_us_method, + invoke_uuss_method, }, { "hostHandler", /* name */ @@ -400,6 +405,31 @@ const struct sbus_interface_meta iface_dp_meta = { sbus_invoke_get_all, /* GetAll invoker */ }; +/* invokes a handler with a 'uuss' DBus signature */ +static int invoke_uuss_method(struct sbus_request *dbus_req, void *function_ptr) +{ + uint32_t arg_0; + uint32_t arg_1; + const char * arg_2; + const char * arg_3; + int (*handler)(struct sbus_request *, void *, uint32_t, uint32_t, const char *, const char *) = function_ptr; + + if (!sbus_request_parse_or_finish(dbus_req, + DBUS_TYPE_UINT32, &arg_0, + DBUS_TYPE_UINT32, &arg_1, + DBUS_TYPE_STRING, &arg_2, + DBUS_TYPE_STRING, &arg_3, + DBUS_TYPE_INVALID)) { + return EOK; /* request handled */ + } + + return (handler)(dbus_req, dbus_req->intf->handler_data, + arg_0, + arg_1, + arg_2, + arg_3); +} + /* invokes a handler with a 's' DBus signature */ static int invoke_s_method(struct sbus_request *dbus_req, void *function_ptr) { diff --git a/src/providers/data_provider/dp_iface_generated.h b/src/providers/data_provider/dp_iface_generated.h index b629ec774..7dd0f27cc 100644 --- a/src/providers/data_provider/dp_iface_generated.h +++ b/src/providers/data_provider/dp_iface_generated.h @@ -107,7 +107,7 @@ struct iface_dp { struct sbus_vtable vtable; /* derive from sbus_vtable */ sbus_msg_handler_fn pamHandler; sbus_msg_handler_fn sudoHandler; - int (*autofsHandler)(struct sbus_request *req, void *data, uint32_t arg_dp_flags, const char *arg_mapname); + int (*autofsHandler)(struct sbus_request *req, void *data, uint32_t arg_dp_flags, uint32_t arg_method, const char *arg_mapname, const char *arg_entryname); int (*hostHandler)(struct sbus_request *req, void *data, uint32_t arg_dp_flags, const char *arg_name, const char *arg_alias); int (*getDomains)(struct sbus_request *req, void *data, const char *arg_domain_hint); int (*getAccountInfo)(struct sbus_request *req, void *data, uint32_t arg_dp_flags, uint32_t arg_entry_type, const char *arg_filter, const char *arg_domain, const char *arg_extra); diff --git a/src/providers/data_provider/dp_target_autofs.c b/src/providers/data_provider/dp_target_autofs.c index 5f24f2975..8b5447aef 100644 --- a/src/providers/data_provider/dp_target_autofs.c +++ b/src/providers/data_provider/dp_target_autofs.c @@ -26,14 +26,19 @@ #include "providers/data_provider/dp_iface.h" #include "providers/backend.h" #include "util/util.h" +#include "responder/common/responder.h" errno_t dp_autofs_handler(struct sbus_request *sbus_req, void *dp_cli, uint32_t dp_flags, - const char *mapname) + uint32_t method, + const char *mapname, + const char *entryname) { struct dp_autofs_data *data; const char *key; + enum dp_methods dp_method; + if (mapname == NULL) { return EINVAL; @@ -45,10 +50,27 @@ errno_t dp_autofs_handler(struct sbus_request *sbus_req, } data->mapname = mapname; - key = mapname; + data->entryname = entryname; + + key = talloc_asprintf(sbus_req, "%u:%s:%s", method, mapname, entryname); + if (key == NULL) { + return ENOMEM; + } + + switch (method) { + case SSS_DP_AUTOFS_ENUMERATE: + dp_method = DPM_AUTOFS_ENUMERATE; + break; + case SSS_DP_AUTOFS_GET_MAP: + dp_method = DPM_AUTOFS_GET_MAP; + break; + case SSS_DP_AUTOFS_GET_ENTRY: + dp_method = DPM_AUTOFS_GET_ENTRY; + break; + } dp_req_with_reply(dp_cli, NULL, "AutoFS", key, sbus_req, DPT_AUTOFS, - DPM_AUTOFS_ENUMERATE, dp_flags, data, + dp_method, dp_flags, data, dp_req_reply_std, struct dp_reply_std); return EOK; diff --git a/src/responder/common/cache_req/plugins/cache_req_autofs_entry_by_name.c b/src/responder/common/cache_req/plugins/cache_req_autofs_entry_by_name.c index 17b0b508e..f4d0cb140 100644 --- a/src/responder/common/cache_req/plugins/cache_req_autofs_entry_by_name.c +++ b/src/responder/common/cache_req/plugins/cache_req_autofs_entry_by_name.c @@ -72,7 +72,8 @@ cache_req_autofs_entry_by_name_dp_send(TALLOC_CTX *mem_ctx, struct ldb_result *result) { return sss_dp_get_autofs_send(mem_ctx, cr->rctx, domain, true, - SSS_DP_AUTOFS, data->name.name); + SSS_DP_AUTOFS_ENUMERATE, + data->name.name, NULL); } const struct cache_req_plugin cache_req_autofs_entry_by_name = { diff --git a/src/responder/common/cache_req/plugins/cache_req_autofs_map_by_name.c b/src/responder/common/cache_req/plugins/cache_req_autofs_map_by_name.c index 2f69c762c..268711678 100644 --- a/src/responder/common/cache_req/plugins/cache_req_autofs_map_by_name.c +++ b/src/responder/common/cache_req/plugins/cache_req_autofs_map_by_name.c @@ -69,7 +69,8 @@ cache_req_autofs_map_by_name_dp_send(TALLOC_CTX *mem_ctx, struct ldb_result *result) { return sss_dp_get_autofs_send(mem_ctx, cr->rctx, domain, true, - SSS_DP_AUTOFS, data->name.name); + SSS_DP_AUTOFS_ENUMERATE, + data->name.name, NULL); } const struct cache_req_plugin cache_req_autofs_map_by_name = { diff --git a/src/responder/common/cache_req/plugins/cache_req_autofs_map_entries.c b/src/responder/common/cache_req/plugins/cache_req_autofs_map_entries.c index 73d2b3cf2..7a2691f2f 100644 --- a/src/responder/common/cache_req/plugins/cache_req_autofs_map_entries.c +++ b/src/responder/common/cache_req/plugins/cache_req_autofs_map_entries.c @@ -101,7 +101,8 @@ cache_req_autofs_map_entries_dp_send(TALLOC_CTX *mem_ctx, struct ldb_result *result) { return sss_dp_get_autofs_send(mem_ctx, cr->rctx, domain, true, - SSS_DP_AUTOFS, data->name.name); + SSS_DP_AUTOFS_ENUMERATE, + data->name.name, NULL); } const struct cache_req_plugin cache_req_autofs_map_entries = { diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h index 17b04c3de..4007bfd41 100644 --- a/src/responder/common/responder.h +++ b/src/responder/common/responder.h @@ -364,7 +364,9 @@ sss_dp_get_ssh_host_recv(TALLOC_CTX *mem_ctx, char **err_msg); enum sss_dp_autofs_type { - SSS_DP_AUTOFS + SSS_DP_AUTOFS_ENUMERATE, + SSS_DP_AUTOFS_GET_MAP, + SSS_DP_AUTOFS_GET_ENTRY }; struct tevent_req * @@ -373,7 +375,8 @@ sss_dp_get_autofs_send(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom, bool fast_reply, enum sss_dp_autofs_type type, - const char *name); + const char *mapname, + const char *entryname); errno_t sss_dp_get_autofs_recv(TALLOC_CTX *mem_ctx, diff --git a/src/responder/common/responder_dp_autofs.c b/src/responder/common/responder_dp_autofs.c index bb8c2a428..edf31d035 100644 --- a/src/responder/common/responder_dp_autofs.c +++ b/src/responder/common/responder_dp_autofs.c @@ -34,7 +34,8 @@ struct sss_dp_get_autofs_info { bool fast_reply; enum sss_dp_autofs_type type; - const char *name; + const char *mapname; + const char *entryname; }; static DBusMessage * @@ -46,7 +47,8 @@ sss_dp_get_autofs_send(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom, bool fast_reply, enum sss_dp_autofs_type type, - const char *name) + const char *mapname, + const char *entryname) { struct tevent_req *req; struct sss_dp_req_state *state; @@ -64,6 +66,8 @@ sss_dp_get_autofs_send(TALLOC_CTX *mem_ctx, goto error; } + entryname = entryname == NULL ? "" : entryname; + info = talloc_zero(state, struct sss_dp_get_autofs_info); if (info == NULL) { ret = ENOMEM; @@ -71,10 +75,11 @@ sss_dp_get_autofs_send(TALLOC_CTX *mem_ctx, } info->fast_reply = fast_reply; info->type = type; - info->name = name; + info->mapname = mapname; + info->entryname = entryname; info->dom = dom; - key = talloc_asprintf(state, "%d:%s@%s", type, name, dom->name); + key = talloc_asprintf(state, "%d:%s@%s:%s", type, mapname, dom->name, entryname); if (!key) { ret = ENOMEM; goto error; @@ -124,11 +129,13 @@ sss_dp_get_autofs_msg(void *pvt) /* create the message */ DEBUG(SSSDBG_TRACE_FUNC, "Creating autofs request for [%s][%u][%s]\n", - info->dom->name, dp_flags, info->name); + info->dom->name, dp_flags, info->mapname); dbret = dbus_message_append_args(msg, DBUS_TYPE_UINT32, &dp_flags, - DBUS_TYPE_STRING, &info->name, + DBUS_TYPE_UINT32, &info->type, + DBUS_TYPE_STRING, &info->mapname, + DBUS_TYPE_STRING, &info->entryname, DBUS_TYPE_INVALID); if (!dbret) { DEBUG(SSSDBG_CRIT_FAILURE, "Failed to build message\n"); -- 2.20.1