>From 5c5924051965e6c6930ae8f019b0b6fe5ab0ea9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= Date: Wed, 11 Sep 2013 12:41:43 +0200 Subject: [PATCH 3/8] ghosts: pick correct domain for every member Groups may contain members from different domains. We need to make sure that we store subdomain users with correct domain name. Resolves: https://fedorahosted.org/sssd/ticket/2064 --- src/providers/ldap/sdap_async_groups.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/providers/ldap/sdap_async_groups.c b/src/providers/ldap/sdap_async_groups.c index 00ac3e991710f227c07b411ddffb641748a32213..03a9110a6d4e210d9d6f67646fab87df2ca5d86e 100644 --- a/src/providers/ldap/sdap_async_groups.c +++ b/src/providers/ldap/sdap_async_groups.c @@ -2005,6 +2005,8 @@ static errno_t sdap_nested_group_populate_users(TALLOC_CTX *mem_ctx, const char *username; char *clean_orig_dn; const char *original_dn; + struct sss_domain_info *user_dom; + struct sdap_domain *sdap_dom; TALLOC_CTX *tmp_ctx; struct ldb_message **msgs; @@ -2045,14 +2047,6 @@ static errno_t sdap_nested_group_populate_users(TALLOC_CTX *mem_ctx, in_transaction = true; for (i = 0; i < num_users; i++) { - ret = sdap_get_user_primary_name(tmp_ctx, opts, users[i], - domain, &username); - if (ret != EOK) { - DEBUG(SSSDBG_MINOR_FAILURE, - ("User entry %d has no name attribute. Skipping\n", i)); - continue; - } - ret = sysdb_attrs_get_el(users[i], SYSDB_ORIG_DN, &el); if (el->num_values == 0) { ret = EINVAL; @@ -2072,6 +2066,17 @@ static errno_t sdap_nested_group_populate_users(TALLOC_CTX *mem_ctx, goto done; } + sdap_dom = sdap_domain_get_by_dn(opts, original_dn); + user_dom = sdap_dom == NULL ? domain : sdap_dom->dom; + + ret = sdap_get_user_primary_name(tmp_ctx, opts, users[i], + user_dom, &username); + if (ret != EOK) { + DEBUG(SSSDBG_MINOR_FAILURE, + ("User entry %d has no name attribute. Skipping\n", i)); + continue; + } + /* Check for the specified origDN in the sysdb */ filter = talloc_asprintf(tmp_ctx, "(%s=%s)", SYSDB_ORIG_DN, @@ -2080,7 +2085,7 @@ static errno_t sdap_nested_group_populate_users(TALLOC_CTX *mem_ctx, ret = ENOMEM; goto done; } - ret = sysdb_search_users(tmp_ctx, sysdb, domain, filter, + ret = sysdb_search_users(tmp_ctx, user_dom->sysdb, user_dom, filter, search_attrs, &count, &msgs); talloc_zfree(filter); talloc_zfree(clean_orig_dn); @@ -2109,7 +2114,7 @@ static errno_t sdap_nested_group_populate_users(TALLOC_CTX *mem_ctx, ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, username); if (ret) goto done; - ret = sysdb_set_user_attr(sysdb, domain, sysdb_name, + ret = sysdb_set_user_attr(user_dom->sysdb, user_dom, sysdb_name, attrs, SYSDB_MOD_REP); if (ret != EOK) goto done; } else { -- 1.8.3.1