diff options
Diffstat (limited to 'src/responder/common/responder_common.c')
-rw-r--r-- | src/responder/common/responder_common.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/src/responder/common/responder_common.c b/src/responder/common/responder_common.c index 66148387..2c1ae28b 100644 --- a/src/responder/common/responder_common.c +++ b/src/responder/common/responder_common.c @@ -633,16 +633,43 @@ int sss_dp_get_domain_conn(struct resp_ctx *rctx, const char *domain, } struct sss_domain_info * -responder_get_domain(struct sss_domain_info *doms, const char *domain) +responder_get_domain(TALLOC_CTX *sd_mem_ctx, struct resp_ctx *rctx, + const char *domain) { + time_t now = time(NULL); + time_t time_diff; struct sss_domain_info *dom; + struct sss_domain_info *ret_dom = NULL; + int i; - for (dom = doms; dom; dom = dom->next) { - if (strcasecmp(dom->name, domain) == 0) break; + for (dom = rctx->domains; dom; dom = dom->next) { + if (strcasecmp(dom->name, domain) == 0) { + ret_dom = dom; + break; + } + + for (i = 0; i < dom->subdomain_count; i++) { + if (strcasecmp(dom->subdomains[i]->name, domain) == 0 || + (dom->subdomains[i]->flat_name != NULL && + strcasecmp(dom->subdomains[i]->flat_name, domain) == 0)) { + /* Sub-domains may come and go, so we better copy the struct + * for each request. */ + ret_dom = copy_subdomain(sd_mem_ctx, dom->subdomains[i]); + break; + } + } + + time_diff = now - dom->subdomains_last_checked.tv_sec; + if (i < dom->subdomain_count && time_diff < rctx->domains_timeout) break; + } + /* FIXME: we might want to return a real error, e.g. if copy_subdomain + * fails. */ + if (!ret_dom) { + DEBUG(SSSDBG_OP_FAILURE, ("Unknown domain [%s], checking for" + "possible subdomains!\n", domain)); } - if (!dom) DEBUG(SSSDBG_CRIT_FAILURE, ("Unknown domain [%s]!\n", domain)); - return dom; + return ret_dom; } int responder_logrotate(DBusMessage *message, |