On (10/07/14 16:38), Pavel Reichl wrote: >Hello, > >please see attached patches. > >I found out that if we go with approach introduced in previous version >(in case of LDAP provider assume SID comes from default domain) this can >lead to resolutions of SIDs like S-1-5-32-545 and also SIDs of non-posix >groups which in case of disabled id mapping leads to failure which will >end request prematurely. 2nd patch should make SID resolution more >resilient to handle this. > >Regards, >Pavel Reichl > >On Tue, 2014-07-08 at 09:57 +0200, Sumit Bose wrote: >> On Mon, Jul 07, 2014 at 10:25:23PM +0200, Jakub Hrozek wrote: >> > On Mon, Jul 07, 2014 at 07:03:01PM +0200, Pavel Reichl wrote: >> > > On Mon, 2014-06-23 at 11:41 +0200, Sumit Bose wrote: >> > > > On Mon, Jun 23, 2014 at 11:20:52AM +0200, Jakub Hrozek wrote: >> > > > > On Tue, Jun 17, 2014 at 06:30:31PM +0200, Pavel Reichl wrote: >> > > > > > Hello, >> > > > > > >> > > > > > please see attached patch. >> > > > > > >> > > > > > Regards, >> > > > > > >> > > > > > PR >> > > > > >> > > > > The patch solves the problem, but I think one part should be >> > > > > improved: >> > > > > >> > > > > > @@ -875,7 +893,13 @@ static void >> > > > > > sdap_ad_tokengroups_initgr_mapping_done(struct tevent_req *subreq) >> > > > > > domain = >> > > > > > find_subdomain_by_sid(get_domains_head(state->domain), sid); >> > > > > > if (domain == NULL) { >> > > > > > DEBUG(SSSDBG_MINOR_FAILURE, "Domain not found for SID >> > > > > > %s\n", sid); >> > > > > > - continue; >> > > > > > + if (state->domain->parent == NULL && >> > > > > > + state->domain->subdomains == NULL) { >> > > > > > + domain = state->domain; >> > > > > > + DEBUG(SSSDBG_TRACE_FUNC, "Using domain %s\n", >> > > > > > domain->name); >> > > > > > + } else { >> > > > > > + continue; >> > > > > > + } >> > > > > > } >> > > > > >> > > > > I think this is a bit dangerous. I wonder if we should have some >> > > > > modification of find_subdomain_by_sid that would return the first >> > > > > configured domain if no subdomain provider was configured or if no >> > > > > domains had a SID. This could be a separate function. >> > > > >> > > > This sounds even more dangerous to me. >> > > > >> > > > > >> > > > > Anyhow, find_subdomain_by_sid is misnamed, we routinely use the >> > > > > function >> > > > > to find the primary domain. >> > > > >> > > > I think find_subdomain_by_sid() does what the name says and of course >> > > > it >> > > > can return the primary domain as long as the SID of the domain is know >> > ^^^^^^ >> > fwiw, this was my concern, the function is named "find_subdomain" yet it >> > can find both main domain and subdomain. But I won't bikeshed any further. >> >> ah, sorry, now I see your point. I agree that the name misleading but I >> think this can be fixed after the release. > >Would 's/find_subdomain_by_sid/find_domain_by_sid/' be sufficient >solution? > >> bye, >> Sumit >> >> > >> > > > which is the case for the IPA and AD provider. >> > > > >> > > >> > > > What about adding an explicit check if the running id provider is the >> > > > plain LDAP provider? >> > > Would that be acceptable with you Jakub? >> > >> > It's a bit hackish but I don't see any other way. >> > >> > > >> > > > As an alternative the LDAP provider can add a >> > > > special value in the id member of the sss_dom_info struct and then >> > > > find_subdomain_by_sid can handle this case specially? >> > > > >> > > > bye, >> > > > Sumit >> > > >
You will change patch to address Jakub comments. So, you can also change few nitpicks ;-) I would ignore them if patches were already ACK-ed. >From 77f41aea31afd642d26057018181394c65d81000 Mon Sep 17 00:00:00 2001 >From: Pavel Reichl <prei...@redhat.com> >Date: Tue, 17 Jun 2014 17:16:14 +0100 >Subject: [PATCH 1/2] LDAP: tokengroups do not work with id_provider=ldap > >With plain LDAP provider we already have a sdap_handle, so it should be >possible >that in the case where sdom->pvt == NULL sdap_id_op_connect_send() can be >skipped and sdap_get_ad_tokengroups_send() can be already send with the >sdap_handle passed to sdap_ad_tokengroups_initgr_mapping_send(). So we should >only fail if sdom->pvt == NULL and sh == NULL. > >if find_subdomain_by_sid() failed we can check if there is only one domain in >the domain list (state->domain) and in this case continue with this domain >since >the LDAP provider does not know about sub-domains and hence can only have one >configured domain. > >Resolves: >https://fedorahosted.org/sssd/ticket/2345 >--- //snip >+ >+static errno_t handle_missing_pvt(TALLOC_CTX *mem_ctx, >+ struct tevent_context *ev, >+ struct sdap_options *opts, >+ const char *orig_dn, >+ int timeout, >+ const char *username, >+ struct sdap_handle *sh, >+ struct tevent_req *req, >+ tevent_req_fn callback) >+{ >+ struct tevent_req *subreq = NULL; >+ errno_t ret; >+ >+ if (sh != NULL) { >+ /* plain LDAP provider already has a sdap_handle */ >+ subreq = sdap_get_ad_tokengroups_send(mem_ctx, ev, opts, sh, username, >+ orig_dn, timeout); >+ if (subreq == NULL) { >+ ret = ENOMEM; >+ tevent_req_error(req, ENOMEM); ^^^^^^ We call in this way: tevent_req_error(req, ret); There are some exceptions, but it this case you can use it. >+ goto done; >+ } >+ >+ tevent_req_set_callback(subreq, callback, req); >+ ret = EOK; >+ goto done; >+ >+ } else { >+ ret = EINVAL; >+ goto done; >+ } >+ >+done: >+ return ret; >+} >From 2056ad183feaf41423610f7f1705dad827bb8470 Mon Sep 17 00:00:00 2001 >From: Pavel Reichl <prei...@redhat.com> >Date: Thu, 10 Jul 2014 10:48:42 +0100 >Subject: [PATCH 2/2] SDAP: Continue resolving SID even if some fail > >Resolving groups obtained via Token-Groups in case of disabled ID mapping may >lead to failure as non-posix groups are not resolved. This patch amends >sdap_ad_resolve_sids_done() not to abruptly finish request if ENOENT is >returned. > >Resolves: >https://fedorahosted.org/sssd/ticket/2345 >--- > src/providers/ldap/sdap_async_initgroups_ad.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > >diff --git a/src/providers/ldap/sdap_async_initgroups_ad.c >b/src/providers/ldap/sdap_async_initgroups_ad.c >index >1550f6ceab7fe7ad6c4aed3af674407b92802752..f6a45fb70173355010289dfae30b0a898c61f166 > 100644 >--- a/src/providers/ldap/sdap_async_initgroups_ad.c >+++ b/src/providers/ldap/sdap_async_initgroups_ad.c >@@ -646,7 +646,12 @@ static void sdap_ad_resolve_sids_done(struct tevent_req >*subreq) > > ret = groups_get_recv(subreq, &dp_error, &sdap_error); > talloc_zfree(subreq); >- if (ret != EOK || sdap_error != EOK || dp_error != DP_ERR_OK) { >+ >+ if (ret == EOK && sdap_error == ENOENT && dp_error == DP_ERR_OK) { >+ DEBUG(SSSDBG_CRIT_FAILURE, >+ "Unable to resolve SID %s - will try next sid.\n", >+ state->current_sid); >+ } else if (ret != EOK || (sdap_error != EOK) || dp_error != DP_ERR_OK) { ^^^^^^^^^^^^^^^^^^^ Could you explain why you added parentheses just here? They weren't in previous code. > DEBUG(SSSDBG_CRIT_FAILURE, "Unable to resolve SID %s [dp_error: %d, " > "sdap_error: %d, ret: %d]: %s\n", state->current_sid, dp_error, > sdap_error, ret, strerror(ret)); LS _______________________________________________ sssd-devel mailing list sssd-devel@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/sssd-devel