https://fedorahosted.org/sssd/ticket/1168

The actual base for the map entry is the entry DN, so it's not really
multiple search bases..still, the change is useful to honor the extra
filter and scope.
From 84dd3afb09483f394a51b23d4c8d40f8e80dcbde Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <[email protected]>
Date: Thu, 23 Feb 2012 17:23:05 +0100
Subject: [PATCH] AUTOFS: Search all search bases for automounter map entries

https://fedorahosted.org/sssd/ticket/1168
---
 src/providers/ldap/sdap_async_autofs.c |  106 ++++++++++++++++++++++++++------
 1 files changed, 86 insertions(+), 20 deletions(-)

diff --git a/src/providers/ldap/sdap_async_autofs.c 
b/src/providers/ldap/sdap_async_autofs.c
index 
ce8a1f96af17cb09d30a7c90aed98ecefb8c7769..d0a29282bc194b3dc929c12ada4e92535691e5bf
 100644
--- a/src/providers/ldap/sdap_async_autofs.c
+++ b/src/providers/ldap/sdap_async_autofs.c
@@ -185,8 +185,12 @@ struct automntmaps_process_members_state {
     int    timeout;
     struct sysdb_ctx *sysdb;
 
+    char *clean_orig_dn;
+    char *base_filter;
     char *filter;
     const char **attrs;
+    size_t base_iter;
+    struct sdap_search_base **search_bases;
 
     struct sysdb_attrs *map;
 
@@ -196,6 +200,8 @@ struct automntmaps_process_members_state {
 
 static void
 automntmaps_process_members_done(struct tevent_req *subreq);
+static errno_t
+automntmaps_process_members_next_base(struct tevent_req *req);
 
 static struct tevent_req *
 automntmaps_process_members_send(TALLOC_CTX *mem_ctx,
@@ -209,10 +215,8 @@ automntmaps_process_members_send(TALLOC_CTX *mem_ctx,
 {
     errno_t ret;
     struct tevent_req *req;
-    struct tevent_req *subreq;
     struct automntmaps_process_members_state *state;
     const char *orig_dn;
-    char *clean_orig_dn;
 
     req = tevent_req_create(mem_ctx, &state,
                             struct automntmaps_process_members_state);
@@ -224,13 +228,14 @@ automntmaps_process_members_send(TALLOC_CTX *mem_ctx,
     state->sh = sh;
     state->sysdb = sysdb;
     state->timeout = timeout;
+    state->base_iter = 0;
 
     state->map = map;
 
-    state->filter = talloc_asprintf(state, "(&(%s=*)(objectclass=%s))",
+    state->base_filter = talloc_asprintf(state, "(&(%s=*)(objectclass=%s))",
                     opts->autofs_entry_map[SDAP_AT_AUTOFS_ENTRY_KEY].name,
                     opts->autofs_entry_map[SDAP_OC_AUTOFS_ENTRY].name);
-    if (!state->filter) {
+    if (!state->base_filter) {
         DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to build filter\n"));
         ret = ENOMEM;
         goto immediate;
@@ -250,37 +255,67 @@ automntmaps_process_members_send(TALLOC_CTX *mem_ctx,
         goto immediate;
     }
 
-    /* FIXME - should test if the DN is in the current base? */
-    ret = sss_filter_sanitize(state, orig_dn, &clean_orig_dn);
+    ret = sss_filter_sanitize(state, orig_dn, &state->clean_orig_dn);
     if (ret != EOK) {
         DEBUG(SSSDBG_CRIT_FAILURE, ("Cannot sanitize originalDN\n"));
         goto immediate;
     }
 
     DEBUG(SSSDBG_TRACE_FUNC,
-          ("Examining autofs map [%s]\n", clean_orig_dn));
+          ("Examining autofs map [%s]\n", state->clean_orig_dn));
+
+    ret = automntmaps_process_members_next_base(req);
+    if (ret != EOK) {
+        DEBUG(SSSDBG_OP_FAILURE,
+              ("search failed [%d]: %s\n", ret, strerror(ret)));
+        goto immediate;
+    }
+
+    return req;
+
+immediate:
+    if (ret != EOK) {
+        tevent_req_error(req, ret);
+    } else {
+        tevent_req_done(req);
+    }
+    tevent_req_post(req, ev);
+    return req;
+}
+
+static errno_t
+automntmaps_process_members_next_base(struct tevent_req *req)
+{
+    struct tevent_req *subreq;
+    struct automntmaps_process_members_state *state =
+        tevent_req_data(req, struct automntmaps_process_members_state);
+
+    talloc_zfree(state->filter);
+    state->filter = sdap_get_id_specific_filter(state,
+                        state->base_filter,
+                        state->search_bases[state->base_iter]->filter);
+    if (!state->filter) {
+        return ENOMEM;
+    }
+
+    DEBUG(SSSDBG_TRACE_FUNC,
+          ("Searching for automount map entries with base [%s]\n",
+           state->search_bases[state->base_iter]->basedn));
 
     subreq = sdap_get_generic_send(state, state->ev, state->opts, state->sh,
-                                   clean_orig_dn, LDAP_SCOPE_SUBTREE,
+                                   state->clean_orig_dn,
+                                   
state->search_bases[state->base_iter]->scope,
                                    state->filter, state->attrs,
-                                   opts->autofs_entry_map,
+                                   state->opts->autofs_entry_map,
                                    SDAP_OPTS_AUTOFS_ENTRY,
                                    state->timeout);
     if (!subreq) {
         DEBUG(SSSDBG_CRIT_FAILURE, ("Cannot start search for entries\n"));
-        goto immediate;
+        return EIO;
     }
     tevent_req_set_callback(subreq, automntmaps_process_members_done, req);
-    return req;
 
-immediate:
-    if (ret != EOK) {
-        tevent_req_error(req, ret);
-    } else {
-        tevent_req_done(req);
-    }
-    tevent_req_post(req, ev);
-    return req;
+    return EOK;
 }
 
 static void
@@ -291,15 +326,46 @@ automntmaps_process_members_done(struct tevent_req 
*subreq)
     struct automntmaps_process_members_state *state =
         tevent_req_data(req, struct automntmaps_process_members_state);
     errno_t ret;
+    struct sysdb_attrs **entries;
+    size_t entries_count, i;
 
     ret = sdap_get_generic_recv(subreq, state,
-                                &state->entries_count, &state->entries);
+                                &entries_count, &entries);
     talloc_zfree(subreq);
     if (ret) {
         tevent_req_error(req, ret);
         return;
     }
 
+    if (entries_count > 0) {
+        state->entries = talloc_realloc(state, state->entries,
+                                        struct sysdb_attrs *,
+                                        state->entries_count + entries_count + 
1);
+        if (state->entries == NULL) {
+            tevent_req_error(req, ENOMEM);
+            return;
+        }
+
+        for (i=0; i < entries_count; i++) {
+            state->entries[state->entries_count + i] =
+                talloc_steal(state->entries, entries[i]);
+        }
+
+        state->entries_count += entries_count;
+        state->entries[state->entries_count] = NULL;
+    }
+
+    state->base_iter++;
+    if (state->search_bases[state->base_iter]) {
+        ret = automntmaps_process_members_next_base(req);
+        if (ret != EOK) {
+            tevent_req_error(req, ret);
+            return;
+        }
+    }
+
+    DEBUG(SSSDBG_TRACE_INTERNAL, ("No more search bases to try\n"));
+
     DEBUG(SSSDBG_TRACE_FUNC,
           ("Search for autofs entries, returned %d results.\n",
           state->entries_count));
-- 
1.7.7.6

_______________________________________________
sssd-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to