Blob Blame History Raw
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