On (10/12/14 10:44), Pavel Reichl wrote:
>
>On 12/09/2014 01:36 PM, Sumit Bose wrote:
>>On Tue, Nov 25, 2014 at 03:42:14PM +0100, Pavel Reichl wrote:
>>>Hello,
>>>
>>>please see attached patch for https://fedorahosted.org/sssd/ticket/2492
>>>
>>>Thanks!
>>Hi Pavel,
>>
>>thank you for the patch, it works well in my tests and I didn't see any
>>regressions in IPA setup with and without trsut to AD, so ACK.
>>
>>I would just like to ask you to add a comment to
>>
>>>@@ -842,6 +913,23 @@ static int sdap_save_grpmem(TALLOC_CTX *memctx,
>>>              goto fail;
>>>          }
>>>      }
>>>+    if (opts->schema_type == SDAP_SCHEMA_IPA_V1) {
>>>+        ret = sysdb_attrs_get_string(attrs, SYSDB_SID_STR, &group_sid);
>>>+        if (ret != EOK) {
>>>+            DEBUG(SSSDBG_TRACE_FUNC, "Failed to get group sid\n");
>>>+            group_sid = NULL;
>>>+        }
>>>+
>>>+        if (group_sid != NULL) {
>>>+            ret = retain_extern_members(memctx, dom, group_name, group_sid,
>>>+                                        &userdns, &nuserdns);
>>>+            if (ret != EOK) {
>>>+                DEBUG(SSSDBG_MINOR_FAILURE,
>>>+                      "retain_extern_members failed: %d:[%s].\n",
>>>+                      ret, sss_strerror(ret));
>>>+            }
>>>+        }
>>>+    }
>>which explains that this is a temporary solution until the IPA provider
>>can resolve external group membership. I have created
>>https://fedorahosted.org/sssd/ticket/2522 for this. Feel free to
>>explicitly add the ticket URL into the comment.
>>
>>bye,
>>Sumit
>>_______________________________________________
>>sssd-devel mailing list
>>sssd-devel@lists.fedorahosted.org
>>https://lists.fedorahosted.org/mailman/listinfo/sssd-devel
>Thanks for review.
>Please see updated patch.
>

>From a2b941b6f03b77e92604e2709bc18d891c2365f3 Mon Sep 17 00:00:00 2001
>From: Pavel Reichl <prei...@redhat.com>
>Date: Thu, 20 Nov 2014 18:27:04 +0000
>Subject: [PATCH] LDAP: retain external members
>
>When processing group membership check sysdb for group members from
>extern domain and include them in newly processed group membership as
>extern members are curently found only when initgroups() is called.
>
>Resolves:
>https://fedorahosted.org/sssd/ticket/2492
>---
> src/db/sysdb.h                         |  6 +++
> src/db/sysdb_ops.c                     | 90 ++++++++++++++++++++++++++++++++
> src/providers/ldap/sdap_async_groups.c | 93 ++++++++++++++++++++++++++++++++++
> 3 files changed, 189 insertions(+)
>
>diff --git a/src/db/sysdb.h b/src/db/sysdb.h
>index 
>5bd7f90acb685bbaff5c98f433c7dce8175c33ca..a1254bb556533245ca3a02342b775cda7f0f6f79
> 100644
>--- a/src/db/sysdb.h
>+++ b/src/db/sysdb.h
>@@ -1103,4 +1103,10 @@ errno_t sysdb_gpo_get_gpo_result_setting(TALLOC_CTX 
>*mem_ctx,
>                                          const char *policy_setting_key,
>                                          const char **policy_setting_value);
> 
>+errno_t sysdb_get_sids_of_members(TALLOC_CTX *mem_ctx,
>+                                  struct sss_domain_info *dom,
>+                                  const char *group_name,
>+                                  char ***_sids,
>+                                  char ***_dns,
>+                                  size_t *_n);
> #endif /* __SYS_DB_H__ */
>diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
>index 
>998046a2ca1c746b2032f430e5f9c4a7151e1dbc..7ad8816ba93e45e998ce277ca9dc672d5fe5c39e
> 100644
>--- a/src/db/sysdb_ops.c
>+++ b/src/db/sysdb_ops.c
>@@ -3630,3 +3630,93 @@ errno_t sysdb_search_object_by_uuid(TALLOC_CTX *mem_ctx,
>     return sysdb_search_object_by_str_attr(mem_ctx, domain, SYSDB_UUID_FILTER,
>                                            uuid_str, attrs, res);
> }
>+
>+errno_t sysdb_get_sids_of_members(TALLOC_CTX *mem_ctx,
>+                                  struct sss_domain_info *dom,
>+                                  const char *group_name,
>+                                  char ***_sids,
>+                                  char ***_dns,
>+                                  size_t *_n)
>+{
>+    errno_t ret;
>+    size_t i, m_count;
>+    TALLOC_CTX *tmp_ctx;
>+    struct ldb_message *msg;
>+    struct ldb_message **members;
>+    const char *attrs[] = {SYSDB_SID_STR,  NULL };
                            ^^
                        Please add space here
>+    char **sids = NULL, **dns = NULL;
>+    size_t n = 0;
>+
>+    tmp_ctx = talloc_new(NULL);
>+    if (tmp_ctx == NULL) {
>+        return ENOMEM;
>+    }
>+
>+    ret = sysdb_search_group_by_name(tmp_ctx, dom, group_name, NULL, &msg);
>+    if (ret != EOK) {
>+        goto done;
>+    }
>+
>+    /* Get sid_str attribute of all elemets pointed to by group members */
>+    ret = sysdb_asq_search(tmp_ctx, dom, msg->dn, NULL, SYSDB_MEMBER, attrs,
>+                           &m_count, &members);
>+    if (ret != EOK) {
>+        goto done;
>+    }
>+
>+    sids = talloc_array(tmp_ctx, char*, m_count);
>+    if (sids == NULL) {
>+        ret = ENOMEM;
>+        goto done;
>+    }
>+
>+    dns = talloc_array(tmp_ctx, char*, m_count);
>+    if (dns == NULL) {
>+        ret = ENOMEM;
>+        goto done;
>+    }
>+
>+    for(i=0; i < m_count; i++) {
>+        const char *sidstr;
>+
>+        sidstr = ldb_msg_find_attr_as_string(members[i], SYSDB_SID_STR, NULL);
>+
>+        if (sidstr != NULL) {
>+            sids[n] = talloc_strdup(sids, sidstr);
              result of sysdb_search_group_by_name is allocated under temporary
              context and it is not used anywhere else. If there aren't
              objections from other developers we can use talloc_steal in this
              case.

>+            if (sids[n] == NULL) {
>+                ret = ENOMEM;
>+                goto done;
>+            }
>+
>+            dns[n] = talloc_strdup(dns,
>+                                   ldb_dn_get_linearized(members[i]->dn));
              If there aren't objections from other developers we can use
              talloc_steal here as well.
>+
>+            if (dns[n] == NULL) {
>+                ret = ENOMEM;
>+                goto done;
>+            }
>+            n++;
>+        }
>+    }
>+
>+    if (n == 0) {
>+        ret = ENOENT;
>+        goto done;
>+    }
>+
>+    *_n = n;
>+    *_sids = talloc_steal(mem_ctx, sids);
>+    *_dns = talloc_steal(mem_ctx, dns);
>+
>+    ret = EOK;
>+
>+done:
>+    if (ret == ENOENT) {
>+        DEBUG(SSSDBG_TRACE_FUNC, "No such entry\n");
>+    }
>+    else if (ret) {
      ^^^^^^^^^
      } else if
      http://www.freeipa.org/page/Coding_Style#IF_Statements

>+        DEBUG(SSSDBG_OP_FAILURE, "Error: %d (%s)\n", ret, strerror(ret));
>+    }
>+    talloc_free(tmp_ctx);
>+    return ret;
>+}
>diff --git a/src/providers/ldap/sdap_async_groups.c 
>b/src/providers/ldap/sdap_async_groups.c
>index 
>8cf7f7ff1d414049f0694c7d2873556fc9dad741..e8c408253a0cc311bb84e749208180fd92b379a9
> 100644
>--- a/src/providers/ldap/sdap_async_groups.c
>+++ b/src/providers/ldap/sdap_async_groups.c
>@@ -801,6 +801,76 @@ done:
>     return ret;
> }
> 
>+static errno_t
>+are_sids_from_same_dom(const char *sid1, const char *sid2, bool *_result)
>+{
>+    char *rid1, *rid2;
>+    bool result;
>+
>+    rid1 = strrchr(sid1, '-');
>+    if (rid1 == NULL) {
>+        return EINVAL;
>+    }
>+
>+    rid2 = strrchr(sid2, '-');
>+    if (rid2 == NULL) {
>+        return EINVAL;
>+    }
>+
>+    result = ((rid1 - sid1) == (rid2 - sid2)) &&
>+        (strncmp(sid1, sid2, rid1 - sid1) == 0);
      (rid1 - sid1) is the lenght of "SID header"
"SID header" is probably not the right terminology. I was able to find just
this definition of sid.

The structure of the SID looks like this:
S-[Revision]-[IdentifierAuthority]-[SubAuthority0]-[SubAuthority1]-...-[SubAuthority[SubAuthorityCount]](-RID).

But let's back to main point It would improve readability if you use constants
for length of "SID header" (maybe slength{1,2} lenght{1,2} ...

>+
>+    *_result = result;
>+
>+    return EOK;
>+}
>+
>+static errno_t
>+retain_extern_members(TALLOC_CTX *mem_ctx,
>+                      struct sss_domain_info *dom,
>+                      const char *group_name,
>+                      const char *group_sid,
>+                      char ***_userdns,
>+                      size_t *_nuserdns)
>+{
>+    TALLOC_CTX *tmp_ctx;
>+    char **sids, **dns;
>+    bool same_domain;
>+    errno_t ret;
>+    size_t i, n;
>+
>+    tmp_ctx = talloc_new(NULL);
>+    if (tmp_ctx == NULL) {
>+        return ENOMEM;
>+    }
>+
>+    ret = sysdb_get_sids_of_members(tmp_ctx, dom, group_name, &sids, &dns, 
>&n);
>+    if (ret != EOK ) {
                    ^
                  remove extra space
>+        if (ret != ENOENT) {
>+            DEBUG(SSSDBG_TRACE_ALL,
>+                  "get_sids_of_members failed: %d [%s]\n",
>+                  ret, sss_strerror(ret));
>+        }
>+        goto done;
>+    }
>+
>+    for (i=0; i < n; i++) {
>+        ret = are_sids_from_same_dom(group_sid, sids[i], &same_domain);
>+        if (ret == EOK && !same_domain) {
>+            DEBUG(SSSDBG_TRACE_ALL, "extern member: %s\n", dns[i]);
>+
>+            (*_nuserdns)++;
>+            *_userdns = talloc_realloc(mem_ctx, *_userdns, char*, *_nuserdns);
>+            *_userdns[(*_nuserdns)-1] = talloc_steal(mem_ctx, dns[i]);
              ^^^^^^^^^
              @see Sumit's hint in different mail.
>+        }
>+    }
>+
>+    ret = EOK;
>+
>+done:
>+    talloc_free(tmp_ctx);
>+    return ret;
>+}
> 
> /* ==Save-Group-Memebrs=================================================== */
> 
>@@ -817,6 +887,7 @@ static int sdap_save_grpmem(TALLOC_CTX *memctx,
> {
>     struct ldb_message_element *el;
>     struct sysdb_attrs *group_attrs = NULL;
>+    const char *group_sid;
>     const char *group_name;
>     char **userdns = NULL;
>     size_t nuserdns = 0;
>@@ -843,6 +914,28 @@ static int sdap_save_grpmem(TALLOC_CTX *memctx,
>         }
>     }
> 
>+    /* This is a temporal solution until the IPA provider is able to
>+     * resolve external group membership.
>+     * https://fedorahosted.org/sssd/ticket/2522
>+     */
>+    if (opts->schema_type == SDAP_SCHEMA_IPA_V1) {
>+        ret = sysdb_attrs_get_string(attrs, SYSDB_SID_STR, &group_sid);
>+        if (ret != EOK) {
>+            DEBUG(SSSDBG_TRACE_FUNC, "Failed to get group sid\n");
>+            group_sid = NULL;
>+        }
>+
>+        if (group_sid != NULL) {
>+            ret = retain_extern_members(memctx, dom, group_name, group_sid,
>+                                        &userdns, &nuserdns);
>+            if (ret != EOK) {
>+                DEBUG(SSSDBG_MINOR_FAILURE,
>+                      "retain_extern_members failed: %d:[%s].\n",
>+                      ret, sss_strerror(ret));
>+            }
>+        }
>+    }
>+
>     ret = sysdb_attrs_get_el(attrs,
>                     opts->group_map[SDAP_AT_GROUP_MEMBER].sys_name, &el);
>     if (ret != EOK) {
>-- 
>1.9.3
>

>_______________________________________________
>sssd-devel mailing list
>sssd-devel@lists.fedorahosted.org
>https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to