diff --git a/src/db/sysdb.h b/src/db/sysdb.h index 319b88e25f..ee65f9bb77 100644 --- a/src/db/sysdb.h +++ b/src/db/sysdb.h @@ -1594,11 +1594,6 @@ errno_t sysdb_get_sids_of_members(TALLOC_CTX *mem_ctx, const char ***_dns, size_t *_n); -errno_t sysdb_get_user_members_recursively(TALLOC_CTX *mem_ctx, - struct sss_domain_info *dom, - struct ldb_dn *group_dn, - struct ldb_result **members); - errno_t sysdb_handle_original_uuid(const char *orig_name, struct sysdb_attrs *src_attrs, const char *src_name, diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c index 32e49d7594..b7157364d9 100644 --- a/src/db/sysdb_ops.c +++ b/src/db/sysdb_ops.c @@ -5420,80 +5420,6 @@ errno_t sysdb_get_sids_of_members(TALLOC_CTX *mem_ctx, return ret; } -errno_t sysdb_get_user_members_recursively(TALLOC_CTX *mem_ctx, - struct sss_domain_info *dom, - struct ldb_dn *group_dn, - struct ldb_result **members) -{ - TALLOC_CTX *tmp_ctx; - int ret; - size_t count; - struct ldb_result *res; - struct ldb_dn *base_dn; - char *filter; - char *sanitized_name; - const char *attrs[] = SYSDB_PW_ATTRS; - struct ldb_message **msgs; - - tmp_ctx = talloc_new(NULL); - if (tmp_ctx == NULL) { - return ENOMEM; - } - - base_dn = sysdb_base_dn(dom->sysdb, tmp_ctx); - if (base_dn == NULL) { - DEBUG(SSSDBG_OP_FAILURE, "sysdb_base_dn failed.\n"); - ret = ENOMEM; - goto done; - } - - ret = sss_filter_sanitize(tmp_ctx, ldb_dn_get_linearized(group_dn), - &sanitized_name); - if (ret != EOK) { - DEBUG(SSSDBG_CRIT_FAILURE, - "Failed to sanitize the given name:'%s'.\n", - ldb_dn_get_linearized(group_dn)); - goto done; - } - - filter = talloc_asprintf(tmp_ctx, "(&("SYSDB_UC")("SYSDB_MEMBEROF"=%s))", - sanitized_name); - if (filter == NULL) { - DEBUG(SSSDBG_OP_FAILURE, "talloc_asprintf failed.\n"); - ret = ENOMEM; - goto done; - } - - ret = sysdb_search_entry(tmp_ctx, dom->sysdb, base_dn, LDB_SCOPE_SUBTREE, - filter, attrs, &count, &msgs); - if (ret != EOK) { - goto done; - } - - res = talloc_zero(tmp_ctx, struct ldb_result); - if (res == NULL) { - DEBUG(SSSDBG_OP_FAILURE, "talloc_zero failed.\n"); - ret = ENOMEM; - goto done; - } - - res->count = count; - res->msgs = talloc_steal(res, msgs); - - ret = EOK; - -done: - if (ret == EOK) { - *members = talloc_steal(mem_ctx, res); - } else if (ret == ENOENT) { - DEBUG(SSSDBG_TRACE_FUNC, "No such entry\n"); - } else { - DEBUG(SSSDBG_OP_FAILURE, "Error: %d (%s)\n", ret, strerror(ret)); - } - talloc_free(tmp_ctx); - return ret; -} - errno_t sysdb_handle_original_uuid(const char *orig_name, struct sysdb_attrs *src_attrs, const char *src_name, diff --git a/src/db/sysdb_views.c b/src/db/sysdb_views.c index 7392abc90b..f182ae0787 100644 --- a/src/db/sysdb_views.c +++ b/src/db/sysdb_views.c @@ -1533,6 +1533,80 @@ errno_t sysdb_add_overrides_to_object(struct sss_domain_info *domain, return ret; } +static errno_t get_user_members_recursively(TALLOC_CTX *mem_ctx, + struct sss_domain_info *dom, + struct ldb_dn *group_dn, + struct ldb_result **members) +{ + TALLOC_CTX *tmp_ctx; + int ret; + size_t count; + struct ldb_result *res; + struct ldb_dn *base_dn; + char *filter; + char *sanitized_name; + const char *attrs[] = SYSDB_PW_ATTRS; + struct ldb_message **msgs; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + return ENOMEM; + } + + base_dn = sysdb_base_dn(dom->sysdb, tmp_ctx); + if (base_dn == NULL) { + DEBUG(SSSDBG_OP_FAILURE, "sysdb_base_dn failed.\n"); + ret = ENOMEM; + goto done; + } + + ret = sss_filter_sanitize(tmp_ctx, ldb_dn_get_linearized(group_dn), + &sanitized_name); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, + "Failed to sanitize the given name:'%s'.\n", + ldb_dn_get_linearized(group_dn)); + goto done; + } + + filter = talloc_asprintf(tmp_ctx, "(&("SYSDB_UC")("SYSDB_MEMBEROF"=%s))", + sanitized_name); + if (filter == NULL) { + DEBUG(SSSDBG_OP_FAILURE, "talloc_asprintf failed.\n"); + ret = ENOMEM; + goto done; + } + + ret = sysdb_search_entry(tmp_ctx, dom->sysdb, base_dn, LDB_SCOPE_SUBTREE, + filter, attrs, &count, &msgs); + if (ret != EOK) { + goto done; + } + + res = talloc_zero(tmp_ctx, struct ldb_result); + if (res == NULL) { + DEBUG(SSSDBG_OP_FAILURE, "talloc_zero failed.\n"); + ret = ENOMEM; + goto done; + } + + res->count = count; + res->msgs = talloc_steal(res, msgs); + + ret = EOK; + +done: + if (ret == EOK) { + *members = talloc_steal(mem_ctx, res); + } else if (ret == ENOENT) { + DEBUG(SSSDBG_TRACE_FUNC, "No such entry\n"); + } else { + DEBUG(SSSDBG_OP_FAILURE, "Error: %d (%s)\n", ret, strerror(ret)); + } + talloc_free(tmp_ctx); + return ret; +} + static inline int add_domain_name(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, const char *orig_name, @@ -1595,7 +1669,7 @@ errno_t sysdb_add_group_member_overrides(struct sss_domain_info *domain, return ENOMEM; } - ret = sysdb_get_user_members_recursively(tmp_ctx, domain, obj->dn, + ret = get_user_members_recursively(tmp_ctx, domain, obj->dn, &res_members); if (ret == ENOENT) { ret = EOK;