>From 5374ce295c926db5707f135e095998f1a05ff997 Mon Sep 17 00:00:00 2001 From: Lukas Slebodnik Date: Wed, 23 Oct 2013 18:05:58 +0200 Subject: [PATCH 2/3] AD: fall back to LDAP if GC is not available. AD provider went offline if the Global Catalog could not be connected although there was also the LDAP port available. With this patch, AD provider will fall back to the LDAP port before going offline. New boolean flag ignore_mark_offline was added to structure sdap_id_conn_ctx If this flag is enabled function be_mark_offline will not be called. Resolves: https://fedorahosted.org/sssd/ticket/2104 --- src/providers/ad/ad_id.c | 11 +++++++++++ src/providers/ldap/ldap_common.h | 2 ++ src/providers/ldap/sdap_id_op.c | 4 +++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/providers/ad/ad_id.c b/src/providers/ad/ad_id.c index f09b9c6fe239b9b602f53e8afce641a4d07be6e9..20f9c23fa8d1d272f91c0b886bd1e2e3a2522320 100644 --- a/src/providers/ad/ad_id.c +++ b/src/providers/ad/ad_id.c @@ -118,6 +118,14 @@ ad_handle_acct_info_done(struct tevent_req *subreq) struct ad_handle_acct_info_state); ret = sdap_handle_acct_req_recv(subreq, &dp_error, &err, &sdap_err); + if (dp_error == DP_ERR_OFFLINE + && state->conn[state->cindex]->ignore_mark_offline) { + /* This is a special case: GC does not work. + * We need to Fall back to ldap + */ + ret = EOK; + sdap_err = ENOENT; + } talloc_zfree(subreq); if (ret != EOK) { tevent_req_error(req, ret); @@ -192,9 +200,12 @@ get_conn_list(struct be_req *breq, struct ad_id_ctx *ad_ctx, /* Always try GC first */ clist[0] = ad_ctx->gc_ctx; if (IS_SUBDOMAIN(dom) == true) { + clist[0]->ignore_mark_offline = false; /* Subdomain users are only present in GC. */ break; } + /* fall back to ldap if gc is not available */ + clist[0]->ignore_mark_offline = true; /* With root domain users we have the option to * fall back to LDAP in case ie POSIX attributes diff --git a/src/providers/ldap/ldap_common.h b/src/providers/ldap/ldap_common.h index 0d565fc63b7e949e628ae5cf079e54c134464e77..fb9a34c6067521f8d28fb403b97ca6394918f303 100644 --- a/src/providers/ldap/ldap_common.h +++ b/src/providers/ldap/ldap_common.h @@ -52,6 +52,8 @@ struct sdap_id_conn_ctx { struct sdap_id_conn_cache *conn_cache; /* dlinklist pointers */ struct sdap_id_conn_ctx *prev, *next; + /* do not go offline, try another connection */ + bool ignore_mark_offline; }; struct sdap_id_ctx { diff --git a/src/providers/ldap/sdap_id_op.c b/src/providers/ldap/sdap_id_op.c index 52cf78569d7176bd054b6cbeabf772721c9a1c98..815c078d3049a7d4f926af77faa02e3cc8466ee1 100644 --- a/src/providers/ldap/sdap_id_op.c +++ b/src/providers/ldap/sdap_id_op.c @@ -556,7 +556,9 @@ static void sdap_id_op_connect_done(struct tevent_req *subreq) /* be is going offline as there is no more servers to try */ DEBUG(1, ("Failed to connect, going offline (%d [%s])\n", ret, strerror(ret))); - be_mark_offline(conn_cache->id_conn->id_ctx->be); + if (!conn_cache->id_conn->ignore_mark_offline) { + be_mark_offline(conn_cache->id_conn->id_ctx->be); + } is_offline = true; } -- 1.8.3.1