Blame SOURCES/0214-IPA-search-for-overrides-during-initgroups-in-sever-.patch

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