From 84dd3afb09483f394a51b23d4c8d40f8e80dcbde Mon Sep 17 00:00:00 2001 From: Jakub Hrozek 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