diff options
Diffstat (limited to 'src/responder')
-rw-r--r-- | src/responder/common/responder_common.c | 31 | ||||
-rw-r--r-- | src/responder/common/responder_get_domains.c | 68 | ||||
-rw-r--r-- | src/responder/pac/pacsrv_utils.c | 11 |
3 files changed, 32 insertions, 78 deletions
diff --git a/src/responder/common/responder_common.c b/src/responder/common/responder_common.c index 3a634e03..877181f8 100644 --- a/src/responder/common/responder_common.c +++ b/src/responder/common/responder_common.c @@ -886,41 +886,32 @@ int sss_dp_get_domain_conn(struct resp_ctx *rctx, const char *domain, struct sss_domain_info * responder_get_domain(TALLOC_CTX *sd_mem_ctx, struct resp_ctx *rctx, - const char *domain) + const char *name) { 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 = rctx->domains; dom; dom = get_next_domain(dom, false)) { - if (strcasecmp(dom->name, domain) == 0 || + for (dom = rctx->domains; dom; dom = get_next_domain(dom, true)) { + if (!dom->parent) { + time_diff = now - dom->subdomains_last_checked.tv_sec; + } + if (strcasecmp(dom->name, name) == 0 || (dom->flat_name != NULL && - strcasecmp(dom->flat_name, domain) == 0)) { + strcasecmp(dom->flat_name, name) == 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]); + if (!dom->parent || + (dom->parent && time_diff < rctx->domains_timeout)) { 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)); + "possible subdomains!\n", name)); } return ret_dom; diff --git a/src/responder/common/responder_get_domains.c b/src/responder/common/responder_get_domains.c index 77e2b146..b69875e1 100644 --- a/src/responder/common/responder_get_domains.c +++ b/src/responder/common/responder_get_domains.c @@ -280,32 +280,6 @@ static errno_t process_subdomains(struct sss_domain_info *domain) { int ret; - size_t c; - size_t subdomain_count; - struct sss_domain_info **subdomains; - - /* Retrieve all subdomains of this domain from sysdb - * and create their struct sss_domain_info representations - */ - ret = sysdb_get_subdomains(domain, domain, - &subdomain_count, &subdomains); - if (ret != EOK) { - DEBUG(SSSDBG_FUNC_DATA, ("sysdb_get_subdomains failed.\n")); - goto done; - } - - if (subdomain_count == 0) { - talloc_zfree(domain->subdomains); - domain->subdomain_count = 0; - goto done; - } - - /* Link all subdomains into single-linked list - * (the list is used when processing all domains) - */ - for (c = 0; c < subdomain_count - 1; c++) { - subdomains[c]->next = subdomains[c + 1]; - } if (domain->realm == NULL || domain->flat_name == NULL || @@ -318,6 +292,15 @@ process_subdomains(struct sss_domain_info *domain) } } + /* Retrieve all subdomains of this domain from sysdb + * and create their struct sss_domain_info representations + */ + ret = sysdb_update_subdomains(domain); + if (ret != EOK) { + DEBUG(SSSDBG_FUNC_DATA, ("sysdb_update_subdomains failed.\n")); + goto done; + } + errno = 0; ret = gettimeofday(&domain->subdomains_last_checked, NULL); if (ret == -1) { @@ -325,17 +308,12 @@ process_subdomains(struct sss_domain_info *domain) goto done; } - talloc_zfree(domain->subdomains); - domain->subdomain_count = subdomain_count; - domain->subdomains = subdomains; - ret = EOK; done: if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, ("Failed to update sub-domains " "of domain [%s].\n", domain->name)); - talloc_free(subdomains); } return ret; @@ -366,32 +344,26 @@ static errno_t check_last_request(struct resp_ctx *rctx, const char *hint) struct sss_domain_info *dom; time_t now = time(NULL); time_t diff; - int i; - diff = now-rctx->get_domains_last_call.tv_sec; + diff = now - rctx->get_domains_last_call.tv_sec; if (diff >= rctx->domains_timeout) { /* Timeout, expired, fetch domains again */ return EAGAIN; } if (hint != NULL) { - dom = rctx->domains; - while (dom) { - for (i = 0; i< dom->subdomain_count; i++) { - if (strcasecmp(dom->subdomains[i]->name, hint) == 0) { - diff = now-dom->subdomains_last_checked.tv_sec; - if (diff >= rctx->domains_timeout) { - /* Timeout, expired, fetch domains again */ - return EAGAIN; - } - /* Skip the rest of this domain, but check other domains - * perhaps this subdomain will be also a part of another - * domain where it will need refreshing - */ - break; + for (dom = rctx->domains; dom; dom = get_next_domain(dom, true)) { + if (dom->parent == NULL) { + diff = now - dom->subdomains_last_checked.tv_sec; + /* not a subdomain */ + continue; + } + if (strcasecmp(dom->name, hint) == 0) { + if (diff >= rctx->domains_timeout) { + /* Timeout, expired, fetch domains again */ + return EAGAIN; } } - dom = get_next_domain(dom, false); } } diff --git a/src/responder/pac/pacsrv_utils.c b/src/responder/pac/pacsrv_utils.c index cab58264..2708e5a2 100644 --- a/src/responder/pac/pacsrv_utils.c +++ b/src/responder/pac/pacsrv_utils.c @@ -76,14 +76,13 @@ struct sss_domain_info *find_domain_by_id(struct sss_domain_info *domains, { struct sss_domain_info *dom; struct sss_domain_info *ret_dom = NULL; - size_t c; if (id_str == NULL) { DEBUG(SSSDBG_OP_FAILURE, ("Missing domain id.\n")); return NULL; } - for (dom = domains; dom; dom = get_next_domain(dom, false)) { + for (dom = domains; dom; dom = get_next_domain(dom, true)) { if (dom->domain_id == NULL) { continue; } @@ -92,14 +91,6 @@ struct sss_domain_info *find_domain_by_id(struct sss_domain_info *domains, ret_dom = dom; break; } - - for (c = 0; c < dom->subdomain_count; c++) { - if (strcasecmp(dom->subdomains[c]->domain_id, id_str) == 0) { - ret_dom = dom->subdomains[c]; - break; - } - } - } if (!ret_dom) { |