|
|
d15e81 |
From 3d9560303f7c96abf36ff93abd85b2319808d3f6 Mon Sep 17 00:00:00 2001
|
|
|
d15e81 |
From: Sumit Bose <sbose@redhat.com>
|
|
|
d15e81 |
Date: Tue, 28 Apr 2015 20:58:15 +0200
|
|
|
d15e81 |
Subject: [PATCH 213/214] IPA: enhance ipa_initgr_get_overrides_send()
|
|
|
d15e81 |
|
|
|
d15e81 |
This patch makes ipa_initgr_get_overrides_send() public and add support
|
|
|
d15e81 |
to search overrides by UUID or by SID.
|
|
|
d15e81 |
|
|
|
d15e81 |
Related to https://fedorahosted.org/sssd/ticket/2633
|
|
|
d15e81 |
|
|
|
d15e81 |
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
|
|
|
d15e81 |
(cherry picked from commit 145578006684481434ced78461ab8d1c3570f478)
|
|
|
d15e81 |
(cherry picked from commit 58a19d50888b1a7da0ee78b49e7d3dcbebc8614d)
|
|
|
d15e81 |
---
|
|
|
d15e81 |
src/db/sysdb_views.c | 5 ++++
|
|
|
d15e81 |
src/providers/ipa/ipa_id.c | 63 +++++++++++++++++++++++++++++++++-------------
|
|
|
d15e81 |
src/providers/ipa/ipa_id.h | 10 ++++++++
|
|
|
d15e81 |
3 files changed, 61 insertions(+), 17 deletions(-)
|
|
|
d15e81 |
|
|
|
d15e81 |
diff --git a/src/db/sysdb_views.c b/src/db/sysdb_views.c
|
|
|
d15e81 |
index 717edf20a447003568060cf4d32bf8d47bd93e63..58cad5426109f0fb37ef16fd1304b50a702cf44a 100644
|
|
|
d15e81 |
--- a/src/db/sysdb_views.c
|
|
|
d15e81 |
+++ b/src/db/sysdb_views.c
|
|
|
d15e81 |
@@ -733,6 +733,11 @@ errno_t sysdb_apply_default_override(struct sss_domain_info *domain,
|
|
|
d15e81 |
NULL };
|
|
|
d15e81 |
bool override_attrs_found = false;
|
|
|
d15e81 |
|
|
|
d15e81 |
+ if (override_attrs == NULL) {
|
|
|
d15e81 |
+ /* nothing to do */
|
|
|
d15e81 |
+ return EOK;
|
|
|
d15e81 |
+ }
|
|
|
d15e81 |
+
|
|
|
d15e81 |
tmp_ctx = talloc_new(NULL);
|
|
|
d15e81 |
if (tmp_ctx == NULL) {
|
|
|
d15e81 |
DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n");
|
|
|
d15e81 |
diff --git a/src/providers/ipa/ipa_id.c b/src/providers/ipa/ipa_id.c
|
|
|
d15e81 |
index cc6abcf8721e3f05526bf62063f0cbdc7c1c257b..02b59ab77a7408012efdd9a1538287e08de0af1e 100644
|
|
|
d15e81 |
--- a/src/providers/ipa/ipa_id.c
|
|
|
d15e81 |
+++ b/src/providers/ipa/ipa_id.c
|
|
|
d15e81 |
@@ -294,6 +294,7 @@ struct ipa_initgr_get_overrides_state {
|
|
|
d15e81 |
|
|
|
d15e81 |
struct ldb_message **groups;
|
|
|
d15e81 |
size_t group_count;
|
|
|
d15e81 |
+ const char *groups_id_attr;
|
|
|
d15e81 |
size_t group_idx;
|
|
|
d15e81 |
struct be_acct_req *ar;
|
|
|
d15e81 |
|
|
|
d15e81 |
@@ -302,13 +303,14 @@ struct ipa_initgr_get_overrides_state {
|
|
|
d15e81 |
|
|
|
d15e81 |
static int ipa_initgr_get_overrides_step(struct tevent_req *req);
|
|
|
d15e81 |
|
|
|
d15e81 |
-static struct tevent_req *
|
|
|
d15e81 |
+struct tevent_req *
|
|
|
d15e81 |
ipa_initgr_get_overrides_send(TALLOC_CTX *memctx,
|
|
|
d15e81 |
struct tevent_context *ev,
|
|
|
d15e81 |
struct ipa_id_ctx *ipa_ctx,
|
|
|
d15e81 |
struct sss_domain_info *user_dom,
|
|
|
d15e81 |
size_t groups_count,
|
|
|
d15e81 |
- struct ldb_message **groups)
|
|
|
d15e81 |
+ struct ldb_message **groups,
|
|
|
d15e81 |
+ const char *groups_id_attr)
|
|
|
d15e81 |
{
|
|
|
d15e81 |
int ret;
|
|
|
d15e81 |
struct tevent_req *req;
|
|
|
d15e81 |
@@ -334,6 +336,12 @@ ipa_initgr_get_overrides_send(TALLOC_CTX *memctx,
|
|
|
d15e81 |
ret = EINVAL;
|
|
|
d15e81 |
goto done;
|
|
|
d15e81 |
}
|
|
|
d15e81 |
+ state->groups_id_attr = talloc_strdup(state, groups_id_attr);
|
|
|
d15e81 |
+ if (state->groups_id_attr == NULL) {
|
|
|
d15e81 |
+ DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n");
|
|
|
d15e81 |
+ ret = ENOMEM;
|
|
|
d15e81 |
+ goto done;
|
|
|
d15e81 |
+ }
|
|
|
d15e81 |
|
|
|
d15e81 |
ret = ipa_initgr_get_overrides_step(req);
|
|
|
d15e81 |
done:
|
|
|
d15e81 |
@@ -366,7 +374,7 @@ static int ipa_initgr_get_overrides_step(struct tevent_req *req)
|
|
|
d15e81 |
}
|
|
|
d15e81 |
|
|
|
d15e81 |
ipa_uuid = ldb_msg_find_attr_as_string(state->groups[state->group_idx],
|
|
|
d15e81 |
- SYSDB_UUID, NULL);
|
|
|
d15e81 |
+ state->groups_id_attr, NULL);
|
|
|
d15e81 |
if (ipa_uuid == NULL) {
|
|
|
d15e81 |
/* This should never happen, the search filter used to get the list
|
|
|
d15e81 |
* of groups includes "uuid=*"
|
|
|
d15e81 |
@@ -377,11 +385,24 @@ static int ipa_initgr_get_overrides_step(struct tevent_req *req)
|
|
|
d15e81 |
|
|
|
d15e81 |
talloc_free(state->ar); /* Avoid spiking memory with many groups */
|
|
|
d15e81 |
|
|
|
d15e81 |
- ret = get_be_acct_req_for_uuid(state, ipa_uuid,
|
|
|
d15e81 |
- state->user_dom->name, &state->ar);
|
|
|
d15e81 |
- if (ret != EOK) {
|
|
|
d15e81 |
- DEBUG(SSSDBG_OP_FAILURE, "get_be_acct_req_for_sid failed.\n");
|
|
|
d15e81 |
- return ret;
|
|
|
d15e81 |
+ if (strcmp(state->groups_id_attr, SYSDB_UUID) == 0) {
|
|
|
d15e81 |
+ ret = get_be_acct_req_for_uuid(state, ipa_uuid,
|
|
|
d15e81 |
+ state->user_dom->name, &state->ar);
|
|
|
d15e81 |
+ if (ret != EOK) {
|
|
|
d15e81 |
+ DEBUG(SSSDBG_OP_FAILURE, "get_be_acct_req_for_sid failed.\n");
|
|
|
d15e81 |
+ return ret;
|
|
|
d15e81 |
+ }
|
|
|
d15e81 |
+ } else if (strcmp(state->groups_id_attr, SYSDB_SID_STR) == 0) {
|
|
|
d15e81 |
+ ret = get_be_acct_req_for_sid(state, ipa_uuid,
|
|
|
d15e81 |
+ state->user_dom->name, &state->ar);
|
|
|
d15e81 |
+ if (ret != EOK) {
|
|
|
d15e81 |
+ DEBUG(SSSDBG_OP_FAILURE, "get_be_acct_req_for_sid failed.\n");
|
|
|
d15e81 |
+ return ret;
|
|
|
d15e81 |
+ }
|
|
|
d15e81 |
+ } else {
|
|
|
d15e81 |
+ DEBUG(SSSDBG_CRIT_FAILURE, "Unsupported groups ID type [%s].\n",
|
|
|
d15e81 |
+ state->groups_id_attr);
|
|
|
d15e81 |
+ return EINVAL;
|
|
|
d15e81 |
}
|
|
|
d15e81 |
|
|
|
d15e81 |
DEBUG(SSSDBG_TRACE_LIBS, "Fetching group %s\n", ipa_uuid);
|
|
|
d15e81 |
@@ -408,7 +429,7 @@ static void ipa_initgr_get_overrides_override_done(struct tevent_req *subreq)
|
|
|
d15e81 |
struct ipa_initgr_get_overrides_state *state = tevent_req_data(req,
|
|
|
d15e81 |
struct ipa_initgr_get_overrides_state);
|
|
|
d15e81 |
int ret;
|
|
|
d15e81 |
- struct sysdb_attrs *override_attrs;
|
|
|
d15e81 |
+ struct sysdb_attrs *override_attrs = NULL;
|
|
|
d15e81 |
|
|
|
d15e81 |
ret = ipa_get_ad_override_recv(subreq, &state->dp_error, state,
|
|
|
d15e81 |
&override_attrs);
|
|
|
d15e81 |
@@ -419,10 +440,16 @@ static void ipa_initgr_get_overrides_override_done(struct tevent_req *subreq)
|
|
|
d15e81 |
return;
|
|
|
d15e81 |
}
|
|
|
d15e81 |
|
|
|
d15e81 |
- ret = sysdb_store_override(state->user_dom, state->ipa_ctx->view_name,
|
|
|
d15e81 |
- SYSDB_MEMBER_GROUP,
|
|
|
d15e81 |
- override_attrs,
|
|
|
d15e81 |
- state->groups[state->group_idx]->dn);
|
|
|
d15e81 |
+ if (strcmp(state->ipa_ctx->view_name, SYSDB_DEFAULT_VIEW_NAME) == 0) {
|
|
|
d15e81 |
+ ret = sysdb_apply_default_override(state->user_dom, override_attrs,
|
|
|
d15e81 |
+ state->groups[state->group_idx]->dn);
|
|
|
d15e81 |
+ } else {
|
|
|
d15e81 |
+ ret = sysdb_store_override(state->user_dom,
|
|
|
d15e81 |
+ state->ipa_ctx->view_name,
|
|
|
d15e81 |
+ SYSDB_MEMBER_GROUP,
|
|
|
d15e81 |
+ override_attrs,
|
|
|
d15e81 |
+ state->groups[state->group_idx]->dn);
|
|
|
d15e81 |
+ }
|
|
|
d15e81 |
talloc_free(override_attrs);
|
|
|
d15e81 |
if (ret != EOK) {
|
|
|
d15e81 |
DEBUG(SSSDBG_OP_FAILURE, "sysdb_store_override failed.\n");
|
|
|
d15e81 |
@@ -443,7 +470,7 @@ static void ipa_initgr_get_overrides_override_done(struct tevent_req *subreq)
|
|
|
d15e81 |
tevent_req_done(req);
|
|
|
d15e81 |
}
|
|
|
d15e81 |
|
|
|
d15e81 |
-static int ipa_initgr_get_overrides_recv(struct tevent_req *req, int *dp_error)
|
|
|
d15e81 |
+int ipa_initgr_get_overrides_recv(struct tevent_req *req, int *dp_error)
|
|
|
d15e81 |
{
|
|
|
d15e81 |
struct ipa_initgr_get_overrides_state *state = tevent_req_data(req,
|
|
|
d15e81 |
struct ipa_initgr_get_overrides_state);
|
|
|
d15e81 |
@@ -881,7 +908,8 @@ static void ipa_id_get_account_info_orig_done(struct tevent_req *subreq)
|
|
|
d15e81 |
if (state->user_groups != NULL) {
|
|
|
d15e81 |
subreq = ipa_initgr_get_overrides_send(state, state->ev, state->ipa_ctx,
|
|
|
d15e81 |
state->domain, state->group_cnt,
|
|
|
d15e81 |
- state->user_groups);
|
|
|
d15e81 |
+ state->user_groups,
|
|
|
d15e81 |
+ SYSDB_UUID);
|
|
|
d15e81 |
if (subreq == NULL) {
|
|
|
d15e81 |
DEBUG(SSSDBG_OP_FAILURE, "ipa_resolve_user_list_send failed.\n");
|
|
|
d15e81 |
ret = ENOMEM;
|
|
|
d15e81 |
@@ -959,8 +987,9 @@ static void ipa_id_get_account_info_done(struct tevent_req *subreq)
|
|
|
d15e81 |
|
|
|
d15e81 |
if (state->user_groups != NULL) {
|
|
|
d15e81 |
subreq = ipa_initgr_get_overrides_send(state, state->ev, state->ipa_ctx,
|
|
|
d15e81 |
- state->domain, state->group_cnt,
|
|
|
d15e81 |
- state->user_groups);
|
|
|
d15e81 |
+ state->domain, state->group_cnt,
|
|
|
d15e81 |
+ state->user_groups,
|
|
|
d15e81 |
+ SYSDB_UUID);
|
|
|
d15e81 |
if (subreq == NULL) {
|
|
|
d15e81 |
DEBUG(SSSDBG_OP_FAILURE, "ipa_resolve_user_list_send failed.\n");
|
|
|
d15e81 |
ret = ENOMEM;
|
|
|
d15e81 |
diff --git a/src/providers/ipa/ipa_id.h b/src/providers/ipa/ipa_id.h
|
|
|
d15e81 |
index 2bb5e0d38f42d4bbb04854dfb04804fecf6257e8..c03ca037a2850478a8f4933bac4fcf8bd70ada04 100644
|
|
|
d15e81 |
--- a/src/providers/ipa/ipa_id.h
|
|
|
d15e81 |
+++ b/src/providers/ipa/ipa_id.h
|
|
|
d15e81 |
@@ -119,4 +119,14 @@ errno_t get_object_from_cache(TALLOC_CTX *mem_ctx,
|
|
|
d15e81 |
struct sss_domain_info *dom,
|
|
|
d15e81 |
struct be_acct_req *ar,
|
|
|
d15e81 |
struct ldb_message **_msg);
|
|
|
d15e81 |
+
|
|
|
d15e81 |
+struct tevent_req *
|
|
|
d15e81 |
+ipa_initgr_get_overrides_send(TALLOC_CTX *memctx,
|
|
|
d15e81 |
+ struct tevent_context *ev,
|
|
|
d15e81 |
+ struct ipa_id_ctx *ipa_ctx,
|
|
|
d15e81 |
+ struct sss_domain_info *user_dom,
|
|
|
d15e81 |
+ size_t groups_count,
|
|
|
d15e81 |
+ struct ldb_message **groups,
|
|
|
d15e81 |
+ const char *groups_id_attr);
|
|
|
d15e81 |
+int ipa_initgr_get_overrides_recv(struct tevent_req *req, int *dp_error);
|
|
|
d15e81 |
#endif
|
|
|
d15e81 |
--
|
|
|
d15e81 |
2.4.3
|
|
|
d15e81 |
|