summaryrefslogtreecommitdiffstats
path: root/src/responder/common/responder_common.c
diff options
context:
space:
mode:
authorJan Zeleny <jzeleny@redhat.com>2012-03-28 07:54:26 -0400
committerStephen Gallagher <sgallagh@redhat.com>2012-04-24 09:19:42 -0400
commit6fdde3913a11cd6148627696fa8717c34e8460fc (patch)
tree43ef914846cb2c9b2c2854e08d6ece5d3bc17c91 /src/responder/common/responder_common.c
parentc0f9698cd951b7223f251ff2511c4b22a6e4ba60 (diff)
downloadsssd-6fdde3913a11cd6148627696fa8717c34e8460fc.tar.gz
sssd-6fdde3913a11cd6148627696fa8717c34e8460fc.tar.xz
sssd-6fdde3913a11cd6148627696fa8717c34e8460fc.zip
Modified responder_get_domain()
Now it checks for subdomains as well as for the domain itself
Diffstat (limited to 'src/responder/common/responder_common.c')
-rw-r--r--src/responder/common/responder_common.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/src/responder/common/responder_common.c b/src/responder/common/responder_common.c
index 661483872..2c1ae28be 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,