summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Slebodnik <lslebodn@redhat.com>2014-02-12 14:33:49 +0100
committerJakub Hrozek <jhrozek@redhat.com>2014-02-26 10:42:18 +0100
commitf7a7a583c475eb22a6d762e74c67ffcfa7ba32d0 (patch)
tree1a05b1c154047ecbd3fbe3a59846f0daf5504849
parentda729f6765e11fec980fbb9ec1291e2a7ef533fe (diff)
downloadsssd-f7a7a583c475eb22a6d762e74c67ffcfa7ba32d0.tar.gz
sssd-f7a7a583c475eb22a6d762e74c67ffcfa7ba32d0.tar.xz
sssd-f7a7a583c475eb22a6d762e74c67ffcfa7ba32d0.zip
LDAP: Setup periodic task only once.
If id provider is {ipa, ad} periodic task will be stared in sssm_{ipa,ad}_init If you enable enumeration and use different providers for id and sudo(autofs) then another periodic task will be scheduled. This can cause weird behaviour (e.g. missing members of group) Perodic tasks will be started only by id_provider. Resolves: https://fedorahosted.org/sssd/ticket/2153 Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> (cherry picked from commit 057cb583f02bf47678c393cb8f1f74861c2b960b)
-rw-r--r--src/providers/ldap/ldap_init.c54
1 files changed, 41 insertions, 13 deletions
diff --git a/src/providers/ldap/ldap_init.c b/src/providers/ldap/ldap_init.c
index 15615b289..cf4ab5598 100644
--- a/src/providers/ldap/ldap_init.c
+++ b/src/providers/ldap/ldap_init.c
@@ -84,9 +84,9 @@ errno_t check_order_list_for_duplicates(char **list,
return EOK;
}
-int sssm_ldap_id_init(struct be_ctx *bectx,
- struct bet_ops **ops,
- void **pvt_data)
+static int ldap_id_init_internal(struct be_ctx *bectx,
+ struct bet_ops **ops,
+ void **pvt_data)
{
struct sdap_id_ctx *ctx = NULL;
const char *urls;
@@ -160,11 +160,6 @@ int sssm_ldap_id_init(struct be_ctx *bectx,
ret = sdap_idmap_init(ctx, ctx, &ctx->opts->idmap_ctx);
if (ret != EOK) goto done;
- ret = ldap_id_setup_tasks(ctx);
- if (ret != EOK) {
- goto done;
- }
-
ret = sdap_setup_child();
if (ret != EOK) {
DEBUG(1, ("setup_child failed [%d][%s].\n",
@@ -202,6 +197,39 @@ done:
return ret;
}
+int sssm_ldap_id_init(struct be_ctx *bectx,
+ struct bet_ops **ops,
+ void **pvt_data)
+{
+ int ret;
+ struct sdap_id_ctx *ctx = NULL;
+
+ ret = ldap_id_init_internal(bectx, ops, (void **) &ctx);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_MINOR_FAILURE,
+ ("ldap_id_init_internal failed [%d][%s].\n",
+ ret, strerror(ret)));
+ goto done;
+ }
+
+ ret = ldap_id_setup_tasks(ctx);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_MINOR_FAILURE,
+ ("sdap_id_setup_tasks failed [%d][%s].\n",
+ ret, strerror(ret)));
+ goto done;
+ }
+
+ *pvt_data = ctx;
+ ret = EOK;
+
+done:
+ if (ret != EOK) {
+ talloc_free(ctx);
+ }
+ return ret;
+}
+
int sssm_ldap_auth_init(struct be_ctx *bectx,
struct bet_ops **ops,
void **pvt_data)
@@ -211,7 +239,7 @@ int sssm_ldap_auth_init(struct be_ctx *bectx,
struct sdap_auth_ctx *ctx;
int ret;
- ret = sssm_ldap_id_init(bectx, ops, &data);
+ ret = ldap_id_init_internal(bectx, ops, &data);
if (ret == EOK) {
id_ctx = talloc_get_type(data, struct sdap_id_ctx);
@@ -302,9 +330,9 @@ int sssm_ldap_access_init(struct be_ctx *bectx,
goto done;
}
- ret = sssm_ldap_id_init(bectx, ops, (void **)&access_ctx->id_ctx);
+ ret = ldap_id_init_internal(bectx, ops, (void **)&access_ctx->id_ctx);
if (ret != EOK) {
- DEBUG(1, ("sssm_ldap_id_init failed.\n"));
+ DEBUG(SSSDBG_CRIT_FAILURE, ("ldap_id_init_internal failed.\n"));
goto done;
}
@@ -417,7 +445,7 @@ int sssm_ldap_sudo_init(struct be_ctx *be_ctx,
void *data;
int ret;
- ret = sssm_ldap_id_init(be_ctx, ops, &data);
+ ret = ldap_id_init_internal(be_ctx, ops, &data);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Cannot init LDAP ID provider [%d]: %s\n",
ret, strerror(ret)));
@@ -447,7 +475,7 @@ int sssm_ldap_autofs_init(struct be_ctx *be_ctx,
void *data;
int ret;
- ret = sssm_ldap_id_init(be_ctx, ops, &data);
+ ret = ldap_id_init_internal(be_ctx, ops, &data);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Cannot init LDAP ID provider [%d]: %s\n",
ret, strerror(ret)));