diff options
Diffstat (limited to 'src/providers')
-rw-r--r-- | src/providers/ipa/ipa_subdomains.c | 72 |
1 files changed, 46 insertions, 26 deletions
diff --git a/src/providers/ipa/ipa_subdomains.c b/src/providers/ipa/ipa_subdomains.c index b8d07201..6c7efbbe 100644 --- a/src/providers/ipa/ipa_subdomains.c +++ b/src/providers/ipa/ipa_subdomains.c @@ -42,6 +42,9 @@ #define IPA_SECONDARY_BASE_RID "ipaSecondaryBaseRID" #define OBJECTCLASS "objectClass" +/* do not refresh more often than every 5 seconds for now */ +#define IPA_SUBDOMAIN_REFRESH_LIMIT 5 + enum ipa_subdomains_req_type { IPA_SUBDOMAINS_MASTER, IPA_SUBDOMAINS_SLAVE, @@ -63,7 +66,7 @@ struct ipa_subdomains_ctx { struct sdap_search_base **ranges_search_bases; /* subdomain map cache */ - time_t last_retrieved; + time_t last_refreshed; int num_subdoms; struct sysdb_subdom *subdoms; }; @@ -344,8 +347,11 @@ static errno_t ipa_subdomains_refresh(struct ipa_subdomains_ctx *ctx, done: if (ret != EOK) { + ctx->last_refreshed = 0; ctx->num_subdoms = 0; talloc_zfree(ctx->subdoms); + } else { + ctx->last_refreshed = time(NULL); } return ret; @@ -395,49 +401,63 @@ static struct ipa_subdomains_req_params subdomain_requests[] = { void ipa_subdomains_handler(struct be_req *be_req) { struct tevent_req *req; - struct ipa_subdomains_req_ctx *ctx = NULL; + struct ipa_subdomains_req_ctx *req_ctx = NULL; + struct ipa_subdomains_ctx *ctx; + int dp_error = DP_ERR_FATAL; int ret; - ctx = talloc(be_req, struct ipa_subdomains_req_ctx); - if (ctx == NULL) { + ctx = talloc_get_type(be_req->be_ctx->bet_info[BET_SUBDOMAINS].pvt_bet_data, + struct ipa_subdomains_ctx); + if (!ctx) { + ret = EINVAL; + goto done; + } + + if (ctx->last_refreshed > time(NULL) - IPA_SUBDOMAIN_REFRESH_LIMIT) { + ret = EOK; + goto done; + } + + req_ctx = talloc(be_req, struct ipa_subdomains_req_ctx); + if (req_ctx == NULL) { ret = ENOMEM; - goto fail; + goto done; } - ctx->be_req = be_req; - ctx->sd_ctx = talloc_get_type( - be_req->be_ctx->bet_info[BET_SUBDOMAINS].pvt_bet_data, - struct ipa_subdomains_ctx); - ctx->sd_data = talloc_get_type(be_req->req_data, struct be_subdom_req); + req_ctx->be_req = be_req; + req_ctx->sd_ctx = ctx; + req_ctx->sd_data = talloc_get_type(be_req->req_data, struct be_subdom_req); + req_ctx->search_base_iter = 0; + req_ctx->search_bases = ctx->search_bases; + req_ctx->current_filter = NULL; + req_ctx->reply_count = 0; + req_ctx->reply = NULL; - ctx->search_base_iter = 0; - ctx->search_bases = ctx->sd_ctx->search_bases; - ctx->current_filter = NULL; - ctx->reply_count = 0; - ctx->reply = NULL; - - ctx->sdap_op = sdap_id_op_create(ctx, - ctx->sd_ctx->sdap_id_ctx->conn_cache); - if (ctx->sdap_op == NULL) { + req_ctx->sdap_op = sdap_id_op_create(req_ctx, + ctx->sdap_id_ctx->conn_cache); + if (req_ctx->sdap_op == NULL) { DEBUG(SSSDBG_OP_FAILURE, ("sdap_id_op_create failed.\n")); ret = ENOMEM; - goto fail; + goto done; } - req = sdap_id_op_connect_send(ctx->sdap_op, ctx, &ret); + req = sdap_id_op_connect_send(req_ctx->sdap_op, req_ctx, &ret); if (req == NULL) { DEBUG(SSSDBG_OP_FAILURE, ("sdap_id_op_connect_send failed: %d(%s).\n", ret, strerror(ret))); - goto fail; + goto done; } - tevent_req_set_callback(req, ipa_subdomains_get_conn_done, ctx); + tevent_req_set_callback(req, ipa_subdomains_get_conn_done, req_ctx); return; -fail: - talloc_free(ctx); - ipa_subdomains_reply(be_req, DP_ERR_FATAL, ret); +done: + talloc_free(req_ctx); + if (ret == EOK) { + dp_error = DP_ERR_OK; + } + ipa_subdomains_reply(be_req, dp_error, ret); } static void ipa_subdomains_get_conn_done(struct tevent_req *req) |