From 7d926fb2e8fe21e3fa51bc341189d33658600daf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= <fidencio@redhat.com>
Date: Wed, 24 May 2017 11:52:23 +0200
Subject: [PATCH 177/181] SYSDB: Make the usage of the filter more generic for
search_ts_matches()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
In order to make this function re-usable in different parts of our code,
let's start passing an already built filter to it instead of having the
specific code building the name filter there.
Related:
https://pagure.io/SSSD/sssd/issue/3369
Signed-off-by: Fabiano FidĂȘncio <fidencio@redhat.com>
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
(cherry picked from commit 8ad57e17779b3ec60246ac58c1691ee15745084c)
---
src/db/sysdb_search.c | 67 +++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 54 insertions(+), 13 deletions(-)
diff --git a/src/db/sysdb_search.c b/src/db/sysdb_search.c
index 0c04b84a584e047a0ba8243c9216547ea2791e60..f488442afcc6eef114437a7110722759f86fe19e 100644
--- a/src/db/sysdb_search.c
+++ b/src/db/sysdb_search.c
@@ -489,7 +489,6 @@ errno_t sysdb_search_ts_matches(TALLOC_CTX *mem_ctx,
const char *filter,
struct ldb_result **_res)
{
- char *dn_filter;
TALLOC_CTX *tmp_ctx = NULL;
struct ldb_result *res;
errno_t ret;
@@ -501,7 +500,7 @@ errno_t sysdb_search_ts_matches(TALLOC_CTX *mem_ctx,
}
tmp_ctx = talloc_new(NULL);
- if (!tmp_ctx) {
+ if (tmp_ctx == NULL) {
return ENOMEM;
}
@@ -511,7 +510,43 @@ errno_t sysdb_search_ts_matches(TALLOC_CTX *mem_ctx,
goto done;
}
- dn_filter = talloc_asprintf(tmp_ctx, "(&(%s=%s)(|", SYSDB_NAME, filter);
+ ret = ldb_search(sysdb->ldb, tmp_ctx, &res, NULL,
+ LDB_SCOPE_SUBTREE, attrs, "%s", filter);
+ if (ret) {
+ ret = sysdb_error_to_errno(ret);
+ goto done;
+ }
+
+ *_res = talloc_steal(mem_ctx, res);
+ ret = EOK;
+
+done:
+ talloc_zfree(tmp_ctx);
+ return ret;
+}
+
+static errno_t sysdb_enum_dn_filter(TALLOC_CTX *mem_ctx,
+ struct ldb_result *ts_res,
+ const char *name_filter,
+ char **_dn_filter)
+{
+ TALLOC_CTX *tmp_ctx = NULL;
+ char *dn_filter;
+ errno_t ret;
+
+ if (ts_res->count == 0) {
+ *_dn_filter = NULL;
+ ret = EOK;
+ goto done;
+ }
+
+ tmp_ctx = talloc_new(NULL);
+ if (tmp_ctx == NULL) {
+ return ENOMEM;
+ }
+
+ dn_filter = talloc_asprintf(tmp_ctx, "(&(%s=%s)(|", SYSDB_NAME,
+ name_filter);
if (dn_filter == NULL) {
ret = ENOMEM;
goto done;
@@ -535,15 +570,9 @@ errno_t sysdb_search_ts_matches(TALLOC_CTX *mem_ctx,
goto done;
}
- ret = ldb_search(sysdb->ldb, tmp_ctx, &res, NULL,
- LDB_SCOPE_SUBTREE, attrs, "%s", dn_filter);
- if (ret) {
- ret = sysdb_error_to_errno(ret);
- goto done;
- }
-
+ *_dn_filter = talloc_steal(mem_ctx, dn_filter);
ret = EOK;
- *_res = talloc_steal(mem_ctx, res);
+
done:
talloc_zfree(tmp_ctx);
return ret;
@@ -558,6 +587,7 @@ int sysdb_enumpwent_filter(TALLOC_CTX *mem_ctx,
TALLOC_CTX *tmp_ctx;
static const char *attrs[] = SYSDB_PW_ATTRS;
char *filter = NULL;
+ char *dn_filter = NULL;
const char *ts_filter = NULL;
struct ldb_dn *base_dn;
struct ldb_result *res;
@@ -595,8 +625,13 @@ int sysdb_enumpwent_filter(TALLOC_CTX *mem_ctx,
goto done;
}
+ ret = sysdb_enum_dn_filter(tmp_ctx, &ts_res, name_filter, &dn_filter);
+ if (ret != EOK) {
+ goto done;
+ }
+
ret = sysdb_search_ts_matches(tmp_ctx, domain->sysdb, attrs, &ts_res,
- name_filter, &ts_cache_res);
+ dn_filter, &ts_cache_res);
if (ret != EOK && ret != ENOENT) {
goto done;
}
@@ -1052,6 +1087,7 @@ int sysdb_enumgrent_filter(TALLOC_CTX *mem_ctx,
const char *filter = NULL;
const char *ts_filter = NULL;
const char *base_filter;
+ char *dn_filter = NULL;
struct ldb_dn *base_dn;
struct ldb_result *res;
struct ldb_result ts_res;
@@ -1100,8 +1136,13 @@ int sysdb_enumgrent_filter(TALLOC_CTX *mem_ctx,
goto done;
}
+ ret = sysdb_enum_dn_filter(tmp_ctx, &ts_res, name_filter, &dn_filter);
+ if (ret != EOK) {
+ goto done;
+ }
+
ret = sysdb_search_ts_matches(tmp_ctx, domain->sysdb, attrs, &ts_res,
- name_filter, &ts_cache_res);
+ dn_filter, &ts_cache_res);
if (ret != EOK && ret != ENOENT) {
goto done;
}
--
2.9.4