>From fa77303721e254c55a36f9c991d55d9977d818b3 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Mon, 4 May 2015 12:34:32 +0200 Subject: [PATCH 03/11] DP: Add DP_WILDCARD and SSS_DP_WILDCARD_USER/SSS_DP_WILDCARD_GROUP Related: https://fedorahosted.org/sssd/ticket/2553 Extends the Data Provider interface and the responder<->Data provider interface with wildcard lookups. The patch uses a new "wildcard" prefix rather than reusing the existing user/group prefixes. --- src/providers/data_provider.h | 4 ++++ src/providers/data_provider_be.c | 5 +++++ src/responder/common/responder.h | 4 +++- src/responder/common/responder_dp.c | 11 +++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/providers/data_provider.h b/src/providers/data_provider.h index 657d2b798cf28fa59c9f644e343f2a2482609bad..8a56b857d93925a4c35243f9e3b04d4645634175 100644 --- a/src/providers/data_provider.h +++ b/src/providers/data_provider.h @@ -128,6 +128,7 @@ #define BE_FILTER_ENUM 3 #define BE_FILTER_SECID 4 #define BE_FILTER_UUID 5 +#define BE_FILTER_WILDCARD 6 #define BE_REQ_USER 0x0001 #define BE_REQ_GROUP 0x0002 @@ -149,6 +150,9 @@ * length */ #define DP_SEC_ID_LEN (sizeof(DP_SEC_ID) - 1) +#define DP_WILDCARD "wildcard" +#define DP_WILDCARD_LEN (sizeof(DP_WILDCARD) - 1) + #define EXTRA_NAME_IS_UPN "U" #define EXTRA_INPUT_MAYBE_WITH_VIEW "V" diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c index 34c7b2c766ee4072ee980ad43f1e1d33ee7c8a5a..dbc74446459e2fceb8aad90c12aa852eb4c8e367 100644 --- a/src/providers/data_provider_be.c +++ b/src/providers/data_provider_be.c @@ -1199,6 +1199,11 @@ static int be_get_account_info(struct sbus_request *dbus_req, void *user_data) ret = split_name_extended(req, &filter[DP_SEC_ID_LEN + 1], &req->filter_value, &req->extra_value); + } else if (strncmp(filter, DP_WILDCARD"=", DP_WILDCARD_LEN + 1) == 0) { + req->filter_type = BE_FILTER_WILDCARD; + ret = split_name_extended(req, &filter[DP_WILDCARD_LEN + 1], + &req->filter_value, + &req->extra_value); } else if (strcmp(filter, ENUM_INDICATOR) == 0) { req->filter_type = BE_FILTER_ENUM; req->filter_value = NULL; diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h index 9c7a73809a3de8859aa546c2a7d31620fea39ac9..7bf70b013a02c4809c48560ec40a7c79639dc075 100644 --- a/src/responder/common/responder.h +++ b/src/responder/common/responder.h @@ -281,7 +281,9 @@ enum sss_dp_acct_type { SSS_DP_NETGR, SSS_DP_SERVICES, SSS_DP_SECID, - SSS_DP_USER_AND_GROUP + SSS_DP_USER_AND_GROUP, + SSS_DP_WILDCARD_USER, + SSS_DP_WILDCARD_GROUP }; struct tevent_req * diff --git a/src/responder/common/responder_dp.c b/src/responder/common/responder_dp.c index 853b3eae3877a8b6b2ffb310a0fb9ccf017498ae..bc8304e767b29a13d05e96afb040e810d3139412 100644 --- a/src/responder/common/responder_dp.c +++ b/src/responder/common/responder_dp.c @@ -528,9 +528,11 @@ sss_dp_get_account_msg(void *pvt) switch (info->type) { case SSS_DP_USER: + case SSS_DP_WILDCARD_USER: be_type = BE_REQ_USER; break; case SSS_DP_GROUP: + case SSS_DP_WILDCARD_GROUP: be_type = BE_REQ_GROUP; break; case SSS_DP_INITGROUPS: @@ -563,6 +565,15 @@ sss_dp_get_account_msg(void *pvt) filter = talloc_asprintf(info, "%s=%s", DP_SEC_ID, info->opt_name); } + } else if (info->type == SSS_DP_WILDCARD_USER || + info->type == SSS_DP_WILDCARD_GROUP) { + if (info->extra) { + filter = talloc_asprintf(info, "%s=%s:%s", DP_WILDCARD, + info->opt_name, info->extra); + } else { + filter = talloc_asprintf(info, "%s=%s", DP_WILDCARD, + info->opt_name); + } } else { if (info->extra) { filter = talloc_asprintf(info, "name=%s:%s", -- 2.4.3