diff options
Diffstat (limited to 'src/responder/common/responder_cache_req.c')
-rw-r--r-- | src/responder/common/responder_cache_req.c | 93 |
1 files changed, 81 insertions, 12 deletions
diff --git a/src/responder/common/responder_cache_req.c b/src/responder/common/responder_cache_req.c index c1f67cd90..dd4d2870f 100644 --- a/src/responder/common/responder_cache_req.c +++ b/src/responder/common/responder_cache_req.c @@ -380,6 +380,57 @@ cache_req_set_name(struct cache_req *cr, const char *name) } static errno_t +cache_req_domain_lookup_name(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct sss_domain_info *domain, + struct resp_ctx *rctx, + const char **_name, + const char **_debugobj) +{ + const char *name = NULL; + const char *debugobj = NULL; + TALLOC_CTX *tmp_ctx = NULL; + errno_t ret; + + if (cr->data->name.name == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "Bug: parsed name is NULL?\n"); + ret = ERR_INTERNAL; + goto done; + } + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + return ENOMEM; + } + + name = sss_get_cased_name(tmp_ctx, cr->data->name.name, + domain->case_sensitive); + if (name == NULL) { + ret = ENOMEM; + goto done; + } + + name = sss_reverse_replace_space(tmp_ctx, name, rctx->override_space); + if (name == NULL) { + ret = ENOMEM; + goto done; + } + + debugobj = talloc_asprintf(tmp_ctx, "%s@%s", name, domain->name); + if (debugobj == NULL) { + ret = ENOMEM; + goto done; + } + + ret = EOK; + *_name = talloc_steal(mem_ctx, name); + *_debugobj = talloc_steal(mem_ctx, debugobj); +done: + talloc_free(tmp_ctx); + return ret; +} + +static errno_t cache_req_set_domain(struct cache_req *cr, struct sss_domain_info *domain, struct resp_ctx *rctx) @@ -401,26 +452,45 @@ cache_req_set_domain(struct cache_req *cr, switch (cr->data->type) { case CACHE_REQ_USER_BY_NAME: - case CACHE_REQ_USER_BY_UPN: case CACHE_REQ_GROUP_BY_NAME: - case CACHE_REQ_USER_BY_FILTER: - case CACHE_REQ_GROUP_BY_FILTER: case CACHE_REQ_INITGROUPS: - case CACHE_REQ_INITGROUPS_BY_UPN: - if (cr->data->name.name == NULL) { - DEBUG(SSSDBG_CRIT_FAILURE, "Bug: parsed name is NULL?\n"); - ret = ERR_INTERNAL; + ret = cache_req_domain_lookup_name(tmp_ctx, cr, domain, rctx, + &name, &debugobj); + if (ret != EOK) { goto done; } - name = sss_get_cased_name(tmp_ctx, cr->data->name.name, - domain->case_sensitive); + name = sss_create_internal_fqname(tmp_ctx, name, domain->name); if (name == NULL) { ret = ENOMEM; goto done; } - name = sss_reverse_replace_space(tmp_ctx, name, rctx->override_space); + break; + + case CACHE_REQ_USER_BY_FILTER: + case CACHE_REQ_GROUP_BY_FILTER: + ret = cache_req_domain_lookup_name(tmp_ctx, cr, domain, rctx, + &name, &debugobj); + if (ret != EOK) { + goto done; + } + + break; + + case CACHE_REQ_USER_BY_UPN: + case CACHE_REQ_INITGROUPS_BY_UPN: + if (cr->data->name.name == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "Bug: parsed UPN is NULL?\n"); + ret = ERR_INTERNAL; + goto done; + } + + /* When looking up UPNs we don't want to reverse-replace spaces, + * just search whatever the user passed in. strdup the name so we + * can safely steal it later. + */ + name = talloc_strdup(tmp_ctx, cr->data->name.name); if (name == NULL) { ret = ENOMEM; goto done; @@ -1315,8 +1385,7 @@ static errno_t cache_req_next_domain(struct tevent_req *req) break; } - ret = cache_req_set_domain(state->cr, state->domain, - state->rctx); + ret = cache_req_set_domain(state->cr, state->domain, state->rctx); if (ret != EOK) { return ret; } |