diff options
Diffstat (limited to 'src/providers/ipa/ipa_s2n_exop.c')
-rw-r--r-- | src/providers/ipa/ipa_s2n_exop.c | 63 |
1 files changed, 49 insertions, 14 deletions
diff --git a/src/providers/ipa/ipa_s2n_exop.c b/src/providers/ipa/ipa_s2n_exop.c index 55450c702..1d9a79a38 100644 --- a/src/providers/ipa/ipa_s2n_exop.c +++ b/src/providers/ipa/ipa_s2n_exop.c @@ -888,11 +888,13 @@ struct ipa_s2n_get_groups_state { int exop_timeout; struct resp_attrs *attrs; struct sss_domain_info *obj_domain; + struct sysdb_attrs *override_attrs; }; static errno_t ipa_s2n_get_groups_step(struct tevent_req *req); static void ipa_s2n_get_groups_get_override_done(struct tevent_req *subreq); static void ipa_s2n_get_groups_next(struct tevent_req *subreq); +static errno_t ipa_s2n_get_groups_save_step(struct tevent_req *req); static struct tevent_req *ipa_s2n_get_groups_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, @@ -921,6 +923,7 @@ static struct tevent_req *ipa_s2n_get_groups_send(TALLOC_CTX *mem_ctx, state->req_input.inp.name = NULL; state->exop_timeout = exop_timeout; state->attrs = NULL; + state->override_attrs = NULL; ret = ipa_s2n_get_groups_step(req); if (ret != EOK) { @@ -1018,6 +1021,18 @@ static void ipa_s2n_get_groups_next(struct tevent_req *subreq) goto fail; } + if (strcmp(state->ipa_ctx->view_name, SYSDB_DEFAULT_VIEW_NAME) == 0) { + ret = ipa_s2n_get_groups_save_step(req); + if (ret == EOK) { + tevent_req_done(req); + } else if (ret != EAGAIN) { + DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_get_groups_save_step failed.\n"); + goto fail; + } + + return; + } + ret = sysdb_attrs_get_string(state->attrs->sysdb_attrs, SYSDB_SID_STR, &sid_str); if (ret != EOK) { @@ -1059,39 +1074,55 @@ static void ipa_s2n_get_groups_get_override_done(struct tevent_req *subreq) struct tevent_req); struct ipa_s2n_get_groups_state *state = tevent_req_data(req, struct ipa_s2n_get_groups_state); - struct sysdb_attrs *override_attrs = NULL; - ret = ipa_get_ad_override_recv(subreq, NULL, state, &override_attrs); + ret = ipa_get_ad_override_recv(subreq, NULL, state, &state->override_attrs); talloc_zfree(subreq); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "IPA override lookup failed: %d\n", ret); goto fail; } + ret = ipa_s2n_get_groups_save_step(req); + if (ret == EOK) { + tevent_req_done(req); + } else if (ret != EAGAIN) { + DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_get_groups_save_step failed.\n"); + goto fail; + } + + return; + +fail: + tevent_req_error(req,ret); + return; +} + +static errno_t ipa_s2n_get_groups_save_step(struct tevent_req *req) +{ + int ret; + struct ipa_s2n_get_groups_state *state = tevent_req_data(req, + struct ipa_s2n_get_groups_state); + ret = ipa_s2n_save_objects(state->dom, &state->req_input, state->attrs, - NULL, state->ipa_ctx->view_name, override_attrs); + NULL, state->ipa_ctx->view_name, + state->override_attrs); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_save_objects failed.\n"); - goto fail; + return ret; } state->group_idx++; if (state->group_list[state->group_idx] == NULL) { - tevent_req_done(req); - return; + return EOK; } ret = ipa_s2n_get_groups_step(req); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "ipa_s2n_get_groups_step failed.\n"); - goto fail; + return ret; } - return; - -fail: - tevent_req_error(req,ret); - return; + return EAGAIN; } static int ipa_s2n_get_groups_recv(struct tevent_req *req) @@ -1484,7 +1515,9 @@ static void ipa_s2n_get_user_done(struct tevent_req *subreq) ret = ENOENT; } - if (ret == ENOENT) { + if (ret == ENOENT + || strcmp(state->ipa_ctx->view_name, + SYSDB_DEFAULT_VIEW_NAME) == 0) { ret = ipa_s2n_save_objects(state->dom, state->req_input, state->attrs, state->simple_attrs, NULL, NULL); if (ret != EOK) { @@ -2046,7 +2079,9 @@ static void ipa_s2n_get_groups_done(struct tevent_req *subreq) goto fail; } - if (state->override_attrs == NULL) { + if (state->override_attrs == NULL + && strcmp(state->ipa_ctx->view_name, + SYSDB_DEFAULT_VIEW_NAME) != 0) { subreq = ipa_get_ad_override_send(state, state->ev, state->ipa_ctx->sdap_id_ctx, state->ipa_ctx->ipa_options, |