Fabiano Fidêncio 2dd8451
From de891b231464f10ce029593d7ee2ebb401e8a0b3 Mon Sep 17 00:00:00 2001
Fabiano Fidêncio 2dd8451
From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= <fidencio@redhat.com>
Fabiano Fidêncio 2dd8451
Date: Mon, 19 Feb 2018 12:51:57 +0100
Fabiano Fidêncio 2dd8451
Subject: [PATCH] SDAP: Properly handle group id-collision when renaming
Fabiano Fidêncio 2dd8451
 incomplete groups
Fabiano Fidêncio 2dd8451
MIME-Version: 1.0
Fabiano Fidêncio 2dd8451
Content-Type: text/plain; charset=UTF-8
Fabiano Fidêncio 2dd8451
Content-Transfer-Encoding: 8bit
Fabiano Fidêncio 2dd8451
Fabiano Fidêncio 2dd8451
Resolves:
Fabiano Fidêncio 2dd8451
https://pagure.io/SSSD/sssd/issue/2653
Fabiano Fidêncio 2dd8451
Fabiano Fidêncio 2dd8451
Signed-off-by: Fabiano FidĂȘncio <fidencio@redhat.com>
Fabiano Fidêncio 2dd8451
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
Fabiano Fidêncio 2dd8451
(cherry picked from commit a2e743cd23e8e2033340612c77a8dbb8ef48c1e1)
Fabiano Fidêncio 2dd8451
---
Fabiano Fidêncio 2dd8451
 src/providers/ad/ad_pac.c                     |  3 +++
Fabiano Fidêncio 2dd8451
 src/providers/ldap/sdap_async_ad.h            |  1 +
Fabiano Fidêncio 2dd8451
 src/providers/ldap/sdap_async_initgroups.c    | 13 +++++++++++++
Fabiano Fidêncio 2dd8451
 src/providers/ldap/sdap_async_initgroups_ad.c | 15 +++++++++++++++
Fabiano Fidêncio 2dd8451
 4 files changed, 32 insertions(+)
Fabiano Fidêncio 2dd8451
Fabiano Fidêncio 2dd8451
diff --git a/src/providers/ad/ad_pac.c b/src/providers/ad/ad_pac.c
Fabiano Fidêncio 2dd8451
index 6b47462cf..1a344725f 100644
Fabiano Fidêncio 2dd8451
--- a/src/providers/ad/ad_pac.c
Fabiano Fidêncio 2dd8451
+++ b/src/providers/ad/ad_pac.c
Fabiano Fidêncio 2dd8451
@@ -434,6 +434,7 @@ struct ad_handle_pac_initgr_state {
Fabiano Fidêncio 2dd8451
     const char *err;
Fabiano Fidêncio 2dd8451
     int dp_error;
Fabiano Fidêncio 2dd8451
     int sdap_ret;
Fabiano Fidêncio 2dd8451
+    struct sdap_options *opts;
Fabiano Fidêncio 2dd8451
 
Fabiano Fidêncio 2dd8451
     size_t num_missing_sids;
Fabiano Fidêncio 2dd8451
     char **missing_sids;
Fabiano Fidêncio 2dd8451
@@ -471,6 +472,7 @@ struct tevent_req *ad_handle_pac_initgr_send(TALLOC_CTX *mem_ctx,
Fabiano Fidêncio 2dd8451
         return NULL;
Fabiano Fidêncio 2dd8451
     }
Fabiano Fidêncio 2dd8451
     state->user_dom = sdom->dom;
Fabiano Fidêncio 2dd8451
+    state->opts = id_ctx->opts;
Fabiano Fidêncio 2dd8451
 
Fabiano Fidêncio 2dd8451
     /* The following variables are currently unused because no sub-request
Fabiano Fidêncio 2dd8451
      * returns any of them. But they are needed to allow the same signature as
Fabiano Fidêncio 2dd8451
@@ -514,6 +516,7 @@ struct tevent_req *ad_handle_pac_initgr_send(TALLOC_CTX *mem_ctx,
Fabiano Fidêncio 2dd8451
         DEBUG(SSSDBG_TRACE_ALL, "Running PAC processing with id-mapping.\n");
Fabiano Fidêncio 2dd8451
 
Fabiano Fidêncio 2dd8451
         ret = sdap_ad_save_group_membership_with_idmapping(state->username,
Fabiano Fidêncio 2dd8451
+                                                        state->opts,
Fabiano Fidêncio 2dd8451
                                                         sdom->dom,
Fabiano Fidêncio 2dd8451
                                                         id_ctx->opts->idmap_ctx,
Fabiano Fidêncio 2dd8451
                                                         num_sids, group_sids);
Fabiano Fidêncio 2dd8451
diff --git a/src/providers/ldap/sdap_async_ad.h b/src/providers/ldap/sdap_async_ad.h
Fabiano Fidêncio 2dd8451
index 950f5a030..a5f47a1a9 100644
Fabiano Fidêncio 2dd8451
--- a/src/providers/ldap/sdap_async_ad.h
Fabiano Fidêncio 2dd8451
+++ b/src/providers/ldap/sdap_async_ad.h
Fabiano Fidêncio 2dd8451
@@ -25,6 +25,7 @@
Fabiano Fidêncio 2dd8451
 #define SDAP_ASYNC_AD_H_
Fabiano Fidêncio 2dd8451
 
Fabiano Fidêncio 2dd8451
 errno_t sdap_ad_save_group_membership_with_idmapping(const char *username,
Fabiano Fidêncio 2dd8451
+                                               struct sdap_options *opts,
Fabiano Fidêncio 2dd8451
                                                struct sss_domain_info *user_dom,
Fabiano Fidêncio 2dd8451
                                                struct sdap_idmap_ctx *idmap_ctx,
Fabiano Fidêncio 2dd8451
                                                size_t num_sids,
Fabiano Fidêncio 2dd8451
diff --git a/src/providers/ldap/sdap_async_initgroups.c b/src/providers/ldap/sdap_async_initgroups.c
Fabiano Fidêncio 2dd8451
index 34747be59..03f6de01a 100644
Fabiano Fidêncio 2dd8451
--- a/src/providers/ldap/sdap_async_initgroups.c
Fabiano Fidêncio 2dd8451
+++ b/src/providers/ldap/sdap_async_initgroups.c
Fabiano Fidêncio 2dd8451
@@ -225,6 +225,19 @@ errno_t sdap_add_incomplete_groups(struct sysdb_ctx *sysdb,
Fabiano Fidêncio 2dd8451
                 ret = sysdb_add_incomplete_group(domain, groupname, gid,
Fabiano Fidêncio 2dd8451
                                                  original_dn, sid_str,
Fabiano Fidêncio 2dd8451
                                                  uuid, posix, now);
Fabiano Fidêncio 2dd8451
+                if (ret == ERR_GID_DUPLICATED) {
Fabiano Fidêncio 2dd8451
+                    /* In case o group id-collision, do:
Fabiano Fidêncio 2dd8451
+                     * - Delete the group from sysdb
Fabiano Fidêncio 2dd8451
+                     * - Add the new incomplete group
Fabiano Fidêncio 2dd8451
+                     * - Notify the NSS responder that the entry has also to be
Fabiano Fidêncio 2dd8451
+                     *   removed from the memory cache
Fabiano Fidêncio 2dd8451
+                     */
Fabiano Fidêncio 2dd8451
+                    ret = sdap_handle_id_collision_for_incomplete_groups(
Fabiano Fidêncio 2dd8451
+                                            opts->dp, domain, groupname, gid,
Fabiano Fidêncio 2dd8451
+                                            original_dn, sid_str, uuid, posix,
Fabiano Fidêncio 2dd8451
+                                            now);
Fabiano Fidêncio 2dd8451
+                }
Fabiano Fidêncio 2dd8451
+
Fabiano Fidêncio 2dd8451
                 if (ret != EOK) {
Fabiano Fidêncio 2dd8451
                     goto done;
Fabiano Fidêncio 2dd8451
                 }
Fabiano Fidêncio 2dd8451
diff --git a/src/providers/ldap/sdap_async_initgroups_ad.c b/src/providers/ldap/sdap_async_initgroups_ad.c
Fabiano Fidêncio 2dd8451
index 30f1d3db2..eab103652 100644
Fabiano Fidêncio 2dd8451
--- a/src/providers/ldap/sdap_async_initgroups_ad.c
Fabiano Fidêncio 2dd8451
+++ b/src/providers/ldap/sdap_async_initgroups_ad.c
Fabiano Fidêncio 2dd8451
@@ -836,6 +836,7 @@ sdap_ad_tokengroups_initgr_mapping_connect_done(struct tevent_req *subreq)
Fabiano Fidêncio 2dd8451
 }
Fabiano Fidêncio 2dd8451
 
Fabiano Fidêncio 2dd8451
 errno_t sdap_ad_save_group_membership_with_idmapping(const char *username,
Fabiano Fidêncio 2dd8451
+                                               struct sdap_options *opts,
Fabiano Fidêncio 2dd8451
                                                struct sss_domain_info *user_dom,
Fabiano Fidêncio 2dd8451
                                                struct sdap_idmap_ctx *idmap_ctx,
Fabiano Fidêncio 2dd8451
                                                size_t num_sids,
Fabiano Fidêncio 2dd8451
@@ -921,6 +922,19 @@ errno_t sdap_ad_save_group_membership_with_idmapping(const char *username,
Fabiano Fidêncio 2dd8451
 
Fabiano Fidêncio 2dd8451
             ret = sysdb_add_incomplete_group(domain, name, gid,
Fabiano Fidêncio 2dd8451
                                              NULL, sid, NULL, false, now);
Fabiano Fidêncio 2dd8451
+            if (ret == ERR_GID_DUPLICATED) {
Fabiano Fidêncio 2dd8451
+                /* In case o group id-collision, do:
Fabiano Fidêncio 2dd8451
+                 * - Delete the group from sysdb
Fabiano Fidêncio 2dd8451
+                 * - Add the new incomplete group
Fabiano Fidêncio 2dd8451
+                 * - Notify the NSS responder that the entry has also to be
Fabiano Fidêncio 2dd8451
+                 *   removed from the memory cache
Fabiano Fidêncio 2dd8451
+                 */
Fabiano Fidêncio 2dd8451
+                ret = sdap_handle_id_collision_for_incomplete_groups(
Fabiano Fidêncio 2dd8451
+                                            idmap_ctx->id_ctx->be->provider,
Fabiano Fidêncio 2dd8451
+                                            domain, name, gid, NULL, sid, NULL,
Fabiano Fidêncio 2dd8451
+                                            false, now);
Fabiano Fidêncio 2dd8451
+            }
Fabiano Fidêncio 2dd8451
+
Fabiano Fidêncio 2dd8451
             if (ret != EOK) {
Fabiano Fidêncio 2dd8451
                 DEBUG(SSSDBG_MINOR_FAILURE, "Could not create incomplete "
Fabiano Fidêncio 2dd8451
                                              "group: [%s]\n", strerror(ret));
Fabiano Fidêncio 2dd8451
@@ -992,6 +1006,7 @@ static void sdap_ad_tokengroups_initgr_mapping_done(struct tevent_req *subreq)
Fabiano Fidêncio 2dd8451
     }
Fabiano Fidêncio 2dd8451
 
Fabiano Fidêncio 2dd8451
     ret = sdap_ad_save_group_membership_with_idmapping(state->username,
Fabiano Fidêncio 2dd8451
+                                                       state->opts,
Fabiano Fidêncio 2dd8451
                                                        state->domain,
Fabiano Fidêncio 2dd8451
                                                        state->idmap_ctx,
Fabiano Fidêncio 2dd8451
                                                        num_sids,
Fabiano Fidêncio 2dd8451
-- 
Fabiano Fidêncio 2dd8451
2.14.3
Fabiano Fidêncio 2dd8451