|
|
d15e81 |
From 61964561654d86e1ba2179fc0afd7f93cafbc6ab Mon Sep 17 00:00:00 2001
|
|
|
d15e81 |
From: Sumit Bose <sbose@redhat.com>
|
|
|
d15e81 |
Date: Tue, 28 Apr 2015 20:59:43 +0200
|
|
|
d15e81 |
Subject: [PATCH 214/214] IPA: search for overrides during initgroups in sever
|
|
|
d15e81 |
mode
|
|
|
d15e81 |
|
|
|
d15e81 |
After the group memberships of a user from a trusted domain are read it
|
|
|
d15e81 |
must be checked if there are overrides for the discovered groups to be
|
|
|
d15e81 |
able to return the right gid or name to the caller.
|
|
|
d15e81 |
|
|
|
d15e81 |
Related to https://fedorahosted.org/sssd/ticket/2633
|
|
|
d15e81 |
|
|
|
d15e81 |
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
|
|
|
d15e81 |
(cherry picked from commit 2263c6dd1242c92253240f4998c86a04b6a0ca3a)
|
|
|
d15e81 |
(cherry picked from commit eaf656843831d579f30f94154d88aba2201c1712)
|
|
|
d15e81 |
---
|
|
|
d15e81 |
src/providers/ipa/ipa_subdomains_id.c | 69 +++++++++++++++++++++++++++++++++++
|
|
|
d15e81 |
1 file changed, 69 insertions(+)
|
|
|
d15e81 |
|
|
|
d15e81 |
diff --git a/src/providers/ipa/ipa_subdomains_id.c b/src/providers/ipa/ipa_subdomains_id.c
|
|
|
d15e81 |
index 1020c8a0b9209fc7404c32963ad5622fc6958d6b..ffe2b18e8dda2137d2ebbfdb780c908eabcd4708 100644
|
|
|
d15e81 |
--- a/src/providers/ipa/ipa_subdomains_id.c
|
|
|
d15e81 |
+++ b/src/providers/ipa/ipa_subdomains_id.c
|
|
|
d15e81 |
@@ -558,6 +558,8 @@ struct ipa_get_ad_acct_state {
|
|
|
d15e81 |
static void ipa_get_ad_acct_ad_part_done(struct tevent_req *subreq);
|
|
|
d15e81 |
static void ipa_get_ad_override_done(struct tevent_req *subreq);
|
|
|
d15e81 |
static errno_t ipa_get_ad_apply_override_step(struct tevent_req *req);
|
|
|
d15e81 |
+static errno_t ipa_get_ad_ipa_membership_step(struct tevent_req *req);
|
|
|
d15e81 |
+static void ipa_id_get_groups_overrides_done(struct tevent_req *subreq);
|
|
|
d15e81 |
static void ipa_get_ad_acct_done(struct tevent_req *subreq);
|
|
|
d15e81 |
static struct ad_id_ctx *ipa_get_ad_id_ctx(struct ipa_id_ctx *ipa_ctx,
|
|
|
d15e81 |
struct sss_domain_info *dom);
|
|
|
d15e81 |
@@ -1112,6 +1114,9 @@ static errno_t ipa_get_ad_apply_override_step(struct tevent_req *req)
|
|
|
d15e81 |
struct tevent_req *subreq;
|
|
|
d15e81 |
const char *obj_name;
|
|
|
d15e81 |
int entry_type;
|
|
|
d15e81 |
+ size_t groups_count = 0;
|
|
|
d15e81 |
+ struct ldb_message **groups = NULL;
|
|
|
d15e81 |
+ const char *attrs[] = SYSDB_INITGR_ATTRS;
|
|
|
d15e81 |
|
|
|
d15e81 |
if (state->override_attrs != NULL) {
|
|
|
d15e81 |
/* We are in ipa-server-mode, so the view is the default view by
|
|
|
d15e81 |
@@ -1166,6 +1171,70 @@ static errno_t ipa_get_ad_apply_override_step(struct tevent_req *req)
|
|
|
d15e81 |
state->ar->entry_type = BE_REQ_USER;
|
|
|
d15e81 |
}
|
|
|
d15e81 |
|
|
|
d15e81 |
+ /* Lookup all groups the user is a member of which do not have ORIGINALAD
|
|
|
d15e81 |
+ * attributes set, i.e. where overrides might not have been applied. */
|
|
|
d15e81 |
+ ret = sysdb_asq_search(state, state->obj_dom, state->obj_msg->dn,
|
|
|
d15e81 |
+ "(&("SYSDB_GC")("SYSDB_GIDNUM"=*)" \
|
|
|
d15e81 |
+ "(!("ORIGINALAD_PREFIX SYSDB_GIDNUM"=*))" \
|
|
|
d15e81 |
+ "(!("ORIGINALAD_PREFIX SYSDB_NAME"=*)))",
|
|
|
d15e81 |
+ SYSDB_INITGR_ATTR,
|
|
|
d15e81 |
+ attrs, &groups_count, &groups);
|
|
|
d15e81 |
+ if (ret != EOK) {
|
|
|
d15e81 |
+ DEBUG(SSSDBG_OP_FAILURE, "ipa_get_ad_groups_without_orig failed.\n");
|
|
|
d15e81 |
+ return ret;
|
|
|
d15e81 |
+ }
|
|
|
d15e81 |
+
|
|
|
d15e81 |
+ if (groups != NULL) {
|
|
|
d15e81 |
+ subreq = ipa_initgr_get_overrides_send(state, state->ev, state->ipa_ctx,
|
|
|
d15e81 |
+ state->obj_dom, groups_count,
|
|
|
d15e81 |
+ groups, SYSDB_SID_STR);
|
|
|
d15e81 |
+ if (subreq == NULL) {
|
|
|
d15e81 |
+ DEBUG(SSSDBG_OP_FAILURE, "ipa_initgr_get_overrides_send failed.\n");
|
|
|
d15e81 |
+ return ENOMEM;
|
|
|
d15e81 |
+ }
|
|
|
d15e81 |
+ tevent_req_set_callback(subreq, ipa_id_get_groups_overrides_done, req);
|
|
|
d15e81 |
+ return EOK;
|
|
|
d15e81 |
+ }
|
|
|
d15e81 |
+
|
|
|
d15e81 |
+ ret = ipa_get_ad_ipa_membership_step(req);
|
|
|
d15e81 |
+ if (ret != EOK) {
|
|
|
d15e81 |
+ DEBUG(SSSDBG_OP_FAILURE, "ipa_get_ad_ipa_membership_step failed.\n");
|
|
|
d15e81 |
+ return ret;
|
|
|
d15e81 |
+ }
|
|
|
d15e81 |
+
|
|
|
d15e81 |
+ return EOK;
|
|
|
d15e81 |
+}
|
|
|
d15e81 |
+
|
|
|
d15e81 |
+static void ipa_id_get_groups_overrides_done(struct tevent_req *subreq)
|
|
|
d15e81 |
+{
|
|
|
d15e81 |
+ struct tevent_req *req = tevent_req_callback_data(subreq,
|
|
|
d15e81 |
+ struct tevent_req);
|
|
|
d15e81 |
+ errno_t ret;
|
|
|
d15e81 |
+
|
|
|
d15e81 |
+ ret = ipa_initgr_get_overrides_recv(subreq, NULL);
|
|
|
d15e81 |
+ talloc_zfree(subreq);
|
|
|
d15e81 |
+ if (ret != EOK) {
|
|
|
d15e81 |
+ DEBUG(SSSDBG_OP_FAILURE,
|
|
|
d15e81 |
+ "IPA resolve user groups overrides failed [%d].\n", ret);
|
|
|
d15e81 |
+ tevent_req_error(req, ret);
|
|
|
d15e81 |
+ return;
|
|
|
d15e81 |
+ }
|
|
|
d15e81 |
+
|
|
|
d15e81 |
+ ret = ipa_get_ad_ipa_membership_step(req);
|
|
|
d15e81 |
+ if (ret != EOK) {
|
|
|
d15e81 |
+ DEBUG(SSSDBG_OP_FAILURE, "ipa_get_ad_ipa_membership_step failed.\n");
|
|
|
d15e81 |
+ tevent_req_error(req, ret);
|
|
|
d15e81 |
+ return;
|
|
|
d15e81 |
+ }
|
|
|
d15e81 |
+
|
|
|
d15e81 |
+ return;
|
|
|
d15e81 |
+}
|
|
|
d15e81 |
+
|
|
|
d15e81 |
+static errno_t ipa_get_ad_ipa_membership_step(struct tevent_req *req)
|
|
|
d15e81 |
+{
|
|
|
d15e81 |
+ struct ipa_get_ad_acct_state *state = tevent_req_data(req,
|
|
|
d15e81 |
+ struct ipa_get_ad_acct_state);
|
|
|
d15e81 |
+ struct tevent_req *subreq;
|
|
|
d15e81 |
|
|
|
d15e81 |
/* For initgroups request we have to check IPA group memberships of AD
|
|
|
d15e81 |
* users. This has to be done for other user-request as well to make sure
|
|
|
d15e81 |
--
|
|
|
d15e81 |
2.4.3
|
|
|
d15e81 |
|