Blame SOURCES/0048-IPA-Get-ipaDomainsResolutionOrder-from-ipaConfig.patch

ecf709
From 4ff821a9a37cb43f9c34faef4b5ccbdc8dc6a7e8 Mon Sep 17 00:00:00 2001
ecf709
From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= <fidencio@redhat.com>
ecf709
Date: Wed, 22 Mar 2017 13:40:20 +0100
ecf709
Subject: [PATCH 48/54] IPA: Get ipaDomainsResolutionOrder from ipaConfig
ecf709
MIME-Version: 1.0
ecf709
Content-Type: text/plain; charset=UTF-8
ecf709
Content-Transfer-Encoding: 8bit
ecf709
ecf709
ipaDomainsResolutionOrder provides a list of domains that have to be
ecf709
looked up firstly during cache_req searches.
ecf709
ecf709
This commit only fetches this list from the server and stores its value
ecf709
at sysdb so we can make use of it later on this patch series.
ecf709
ecf709
There are no tests for newly introduced sysdb methods are those are
ecf709
basically only calling sysdb_update_domain_resolution_order(),
ecf709
sysdb_get_domain_resolution_order() and
ecf709
sysdb_get_use_domain_resolution_order() which are have tests written
ecf709
for.
ecf709
ecf709
Related:
ecf709
https://pagure.io/SSSD/sssd/issue/3001
ecf709
ecf709
Signed-off-by: Fabiano Fidêncio <fidencio@redhat.com>
ecf709
ecf709
Reviewed-by: Sumit Bose <sbose@redhat.com>
ecf709
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
ecf709
---
ecf709
 src/db/sysdb.h                     |  11 +++
ecf709
 src/db/sysdb_subdomains.c          |  67 +++++++++++++++
ecf709
 src/providers/ipa/ipa_subdomains.c | 168 ++++++++++++++++++++++++++++++++++---
ecf709
 3 files changed, 234 insertions(+), 12 deletions(-)
ecf709
ecf709
diff --git a/src/db/sysdb.h b/src/db/sysdb.h
ecf709
index 42d2857ed7765c17e7d84b0da93ed07758fbe012..75a07d4d2effb028ec654342113f8478e1eba10e 100644
ecf709
--- a/src/db/sysdb.h
ecf709
+++ b/src/db/sysdb.h
ecf709
@@ -489,6 +489,17 @@ int sysdb_transaction_cancel(struct sysdb_ctx *sysdb);
ecf709
 /* functions related to subdomains */
ecf709
 errno_t sysdb_domain_create(struct sysdb_ctx *sysdb, const char *domain_name);
ecf709
 
ecf709
+errno_t sysdb_domain_get_domain_resolution_order(
ecf709
+                                        TALLOC_CTX *mem_ctx,
ecf709
+                                        struct sysdb_ctx *sysdb,
ecf709
+                                        const char *domain_name,
ecf709
+                                        const char **_domain_resolution_order);
ecf709
+
ecf709
+errno_t sysdb_domain_update_domain_resolution_order(
ecf709
+                                        struct sysdb_ctx *sysdb,
ecf709
+                                        const char *domain_name,
ecf709
+                                        const char *domain_resolution_order);
ecf709
+
ecf709
 errno_t sysdb_subdomain_store(struct sysdb_ctx *sysdb,
ecf709
                               const char *name, const char *realm,
ecf709
                               const char *flat_name, const char *domain_id,
ecf709
diff --git a/src/db/sysdb_subdomains.c b/src/db/sysdb_subdomains.c
ecf709
index 916dbba153d8c08837425f6fd29a20f5a6aa9fc9..e2a4f7bb1fcdf20b6b7e04efc7f396d1c3d08f0f 100644
ecf709
--- a/src/db/sysdb_subdomains.c
ecf709
+++ b/src/db/sysdb_subdomains.c
ecf709
@@ -22,6 +22,7 @@
ecf709
 
ecf709
 #include "util/util.h"
ecf709
 #include "db/sysdb_private.h"
ecf709
+#include "db/sysdb_domain_resolution_order.h"
ecf709
 
ecf709
 static errno_t
ecf709
 check_subdom_config_file(struct confdb_ctx *confdb,
ecf709
@@ -1210,3 +1211,69 @@ done:
ecf709
     talloc_free(tmp_ctx);
ecf709
     return ret;
ecf709
 }
ecf709
+
ecf709
+errno_t
ecf709
+sysdb_domain_get_domain_resolution_order(TALLOC_CTX *mem_ctx,
ecf709
+                                         struct sysdb_ctx *sysdb,
ecf709
+                                         const char *domain_name,
ecf709
+                                         const char **_domain_resolution_order)
ecf709
+{
ecf709
+    TALLOC_CTX *tmp_ctx;
ecf709
+    struct ldb_dn *dn;
ecf709
+    errno_t ret;
ecf709
+
ecf709
+    tmp_ctx = talloc_new(NULL);
ecf709
+    if (tmp_ctx == NULL) {
ecf709
+        return ENOMEM;
ecf709
+    }
ecf709
+
ecf709
+    dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE, domain_name);
ecf709
+    if (dn == NULL) {
ecf709
+        ret = ENOMEM;
ecf709
+        goto done;
ecf709
+    }
ecf709
+
ecf709
+    ret = sysdb_get_domain_resolution_order(mem_ctx, sysdb, dn,
ecf709
+                                            _domain_resolution_order);
ecf709
+
ecf709
+done:
ecf709
+    talloc_free(tmp_ctx);
ecf709
+    return ret;
ecf709
+}
ecf709
+
ecf709
+errno_t
ecf709
+sysdb_domain_update_domain_resolution_order(struct sysdb_ctx *sysdb,
ecf709
+                                            const char *domain_name,
ecf709
+                                            const char *domain_resolution_order)
ecf709
+{
ecf709
+
ecf709
+    TALLOC_CTX *tmp_ctx;
ecf709
+    struct ldb_dn *dn;
ecf709
+    errno_t ret;
ecf709
+
ecf709
+    tmp_ctx = talloc_new(NULL);
ecf709
+    if (tmp_ctx == NULL) {
ecf709
+        return ENOMEM;
ecf709
+    }
ecf709
+
ecf709
+    dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE, domain_name);
ecf709
+    if (dn == NULL) {
ecf709
+        ret = ENOMEM;
ecf709
+        goto done;
ecf709
+    }
ecf709
+
ecf709
+    ret = sysdb_update_domain_resolution_order(sysdb, dn,
ecf709
+                                               domain_resolution_order);
ecf709
+    if (ret != EOK) {
ecf709
+        DEBUG(SSSDBG_OP_FAILURE,
ecf709
+              "sysdb_update_domain_resolution_order() failed [%d]: [%s].\n",
ecf709
+              ret, sss_strerror(ret));
ecf709
+        goto done;
ecf709
+    }
ecf709
+
ecf709
+    ret = EOK;
ecf709
+
ecf709
+done:
ecf709
+    talloc_free(tmp_ctx);
ecf709
+    return ret;
ecf709
+}
ecf709
diff --git a/src/providers/ipa/ipa_subdomains.c b/src/providers/ipa/ipa_subdomains.c
ecf709
index a07b88fe2f499353293ba90345552413c9792f4b..01a0ce812d861b24565d2f71f27d6b8ceb2965bc 100644
ecf709
--- a/src/providers/ipa/ipa_subdomains.c
ecf709
+++ b/src/providers/ipa/ipa_subdomains.c
ecf709
@@ -29,6 +29,7 @@
ecf709
 #include "providers/ipa/ipa_common.h"
ecf709
 #include "providers/ipa/ipa_id.h"
ecf709
 #include "providers/ipa/ipa_opts.h"
ecf709
+#include "providers/ipa/ipa_config.h"
ecf709
 
ecf709
 #include <ctype.h>
ecf709
 
ecf709
@@ -51,6 +52,8 @@
ecf709
 
ecf709
 #define IPA_ASSIGNED_ID_VIEW "ipaAssignedIDView"
ecf709
 
ecf709
+#define IPA_DOMAIN_RESOLUTION_ORDER "ipaDomainResolutionOrder"
ecf709
+
ecf709
 /* do not refresh more often than every 5 seconds for now */
ecf709
 #define IPA_SUBDOMAIN_REFRESH_LIMIT 5
ecf709
 
ecf709
@@ -1681,6 +1684,117 @@ static errno_t ipa_subdomains_view_name_recv(struct tevent_req *req)
ecf709
     return EOK;
ecf709
 }
ecf709
 
ecf709
+struct ipa_domain_resolution_order_state {
ecf709
+    struct sss_domain_info *domain;
ecf709
+};
ecf709
+
ecf709
+static void ipa_domain_resolution_order_done(struct tevent_req *subreq);
ecf709
+
ecf709
+static struct tevent_req *
ecf709
+ipa_domain_resolution_order_send(TALLOC_CTX *mem_ctx,
ecf709
+                                 struct tevent_context *ev,
ecf709
+                                 struct ipa_subdomains_ctx *sd_ctx,
ecf709
+                                 struct sdap_handle *sh)
ecf709
+{
ecf709
+    struct ipa_domain_resolution_order_state *state;
ecf709
+    struct tevent_req *subreq;
ecf709
+    struct tevent_req *req;
ecf709
+    const char *attrs[] = {IPA_DOMAIN_RESOLUTION_ORDER, NULL};
ecf709
+    errno_t ret;
ecf709
+
ecf709
+    req = tevent_req_create(mem_ctx, &state,
ecf709
+                            struct ipa_domain_resolution_order_state);
ecf709
+    if (req == NULL) {
ecf709
+        DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
ecf709
+        return NULL;
ecf709
+    }
ecf709
+
ecf709
+    state->domain = sd_ctx->be_ctx->domain;
ecf709
+
ecf709
+    subreq = ipa_get_config_send(state, ev, sh, sd_ctx->sdap_id_ctx->opts,
ecf709
+                                 state->domain->name, attrs);
ecf709
+    if (subreq == NULL) {
ecf709
+        ret = ENOMEM;
ecf709
+        goto immediately;
ecf709
+    }
ecf709
+
ecf709
+    tevent_req_set_callback(subreq, ipa_domain_resolution_order_done, req);
ecf709
+
ecf709
+    return req;
ecf709
+
ecf709
+immediately:
ecf709
+    if (ret == EOK) {
ecf709
+        tevent_req_done(req);
ecf709
+    } else {
ecf709
+        tevent_req_error(req, ret);
ecf709
+    }
ecf709
+    tevent_req_post(req, ev);
ecf709
+
ecf709
+    return req;
ecf709
+}
ecf709
+
ecf709
+static void ipa_domain_resolution_order_done(struct tevent_req *subreq)
ecf709
+{
ecf709
+    struct ipa_domain_resolution_order_state *state;
ecf709
+    struct tevent_req *req;
ecf709
+    struct sysdb_attrs *config = NULL;
ecf709
+    const char *domain_resolution_order = NULL;
ecf709
+    errno_t ret;
ecf709
+
ecf709
+    req = tevent_req_callback_data(subreq, struct tevent_req);
ecf709
+    state = tevent_req_data(req, struct ipa_domain_resolution_order_state);
ecf709
+
ecf709
+    ret = ipa_get_config_recv(subreq, state, &config);
ecf709
+    talloc_zfree(subreq);
ecf709
+    if (ret != EOK) {
ecf709
+        DEBUG(SSSDBG_OP_FAILURE,
ecf709
+              "Failed to get the domains' resolution order configuration "
ecf709
+              "from the server [%d]: %s\n",
ecf709
+              ret, sss_strerror(ret));
ecf709
+        goto done;
ecf709
+    }
ecf709
+
ecf709
+    if (config != NULL) {
ecf709
+        ret = sysdb_attrs_get_string(config, IPA_DOMAIN_RESOLUTION_ORDER,
ecf709
+                                     &domain_resolution_order);
ecf709
+        if (ret != EOK && ret != ENOENT) {
ecf709
+            DEBUG(SSSDBG_OP_FAILURE,
ecf709
+                  "Failed to get the domains' resolution order configuration "
ecf709
+                  "value [%d]: %s\n",
ecf709
+                  ret, sss_strerror(ret));
ecf709
+            goto done;
ecf709
+        } else if (ret == ENOENT) {
ecf709
+            domain_resolution_order = NULL;
ecf709
+        }
ecf709
+    }
ecf709
+
ecf709
+    ret = sysdb_domain_update_domain_resolution_order(
ecf709
+                        state->domain->sysdb, state->domain->name,
ecf709
+                        domain_resolution_order);
ecf709
+    if (ret != EOK) {
ecf709
+        DEBUG(SSSDBG_OP_FAILURE,
ecf709
+              "sysdb_domain_update_resolution_order() [%d]: [%s].\n",
ecf709
+              ret, sss_strerror(ret));
ecf709
+        goto done;
ecf709
+    }
ecf709
+
ecf709
+    ret = EOK;
ecf709
+
ecf709
+done:
ecf709
+    if (ret != EOK) {
ecf709
+        tevent_req_error(req, ret);
ecf709
+        return;
ecf709
+    }
ecf709
+
ecf709
+    tevent_req_done(req);
ecf709
+}
ecf709
+
ecf709
+static errno_t ipa_domain_resolution_order_recv(struct tevent_req *req)
ecf709
+{
ecf709
+    TEVENT_REQ_RETURN_ON_ERROR(req);
ecf709
+
ecf709
+    return EOK;
ecf709
+}
ecf709
 
ecf709
 struct ipa_subdomains_refresh_state {
ecf709
     struct tevent_context *ev;
ecf709
@@ -1695,6 +1809,7 @@ static void ipa_subdomains_refresh_certmap_done(struct tevent_req *subreq);
ecf709
 static void ipa_subdomains_refresh_master_done(struct tevent_req *subreq);
ecf709
 static void ipa_subdomains_refresh_slave_done(struct tevent_req *subreq);
ecf709
 static void ipa_subdomains_refresh_view_done(struct tevent_req *subreq);
ecf709
+static void ipa_domain_refresh_resolution_order_done(struct tevent_req *subreq);
ecf709
 
ecf709
 static struct tevent_req *
ecf709
 ipa_subdomains_refresh_send(TALLOC_CTX *mem_ctx,
ecf709
@@ -1916,7 +2031,6 @@ static void ipa_subdomains_refresh_view_done(struct tevent_req *subreq)
ecf709
 {
ecf709
     struct ipa_subdomains_refresh_state *state;
ecf709
     struct tevent_req *req;
ecf709
-    int dp_error;
ecf709
     errno_t ret;
ecf709
 
ecf709
     req = tevent_req_callback_data(subreq, struct tevent_req);
ecf709
@@ -1924,24 +2038,55 @@ static void ipa_subdomains_refresh_view_done(struct tevent_req *subreq)
ecf709
 
ecf709
     ret = ipa_subdomains_view_name_recv(subreq);
ecf709
     talloc_zfree(subreq);
ecf709
+    if (ret != EOK) {
ecf709
+        DEBUG(SSSDBG_CRIT_FAILURE,
ecf709
+              "Unable to get view name [%d]: %s\n",
ecf709
+              ret, sss_strerror(ret));
ecf709
+        tevent_req_error(req, ret);
ecf709
+        return;
ecf709
+    }
ecf709
+
ecf709
+    subreq = ipa_domain_resolution_order_send(state, state->ev, state->sd_ctx,
ecf709
+                                            sdap_id_op_handle(state->sdap_op));
ecf709
+    if (subreq == NULL) {
ecf709
+        tevent_req_error(req, ENOMEM);
ecf709
+        return;
ecf709
+    }
ecf709
+
ecf709
+    tevent_req_set_callback(subreq,
ecf709
+                            ipa_domain_refresh_resolution_order_done,
ecf709
+                            req);
ecf709
+}
ecf709
+
ecf709
+static void
ecf709
+ipa_domain_refresh_resolution_order_done(struct tevent_req *subreq)
ecf709
+{
ecf709
+    struct ipa_subdomains_refresh_state *state;
ecf709
+    struct tevent_req *req;
ecf709
+    int dp_error;
ecf709
+    errno_t ret;
ecf709
+
ecf709
+    req = tevent_req_callback_data(subreq, struct tevent_req);
ecf709
+    state = tevent_req_data(req, struct ipa_subdomains_refresh_state);
ecf709
+
ecf709
+    ret = ipa_domain_resolution_order_recv(subreq);
ecf709
+    talloc_zfree(subreq);
ecf709
+    if (ret != EOK) {
ecf709
+        DEBUG(SSSDBG_MINOR_FAILURE,
ecf709
+              "Unable to get the domains order resolution [%d]: %s\n",
ecf709
+              ret, sss_strerror(ret));
ecf709
+        tevent_req_error(req, ret);
ecf709
+        return;
ecf709
+    }
ecf709
+
ecf709
     ret = sdap_id_op_done(state->sdap_op, ret, &dp_error);
ecf709
     if (dp_error == DP_ERR_OK && ret != EOK) {
ecf709
         /* retry */
ecf709
         ret = ipa_subdomains_refresh_retry(req);
ecf709
-        if (ret != EOK) {
ecf709
-            goto done;
ecf709
-        }
ecf709
-        return;
ecf709
     } else if (dp_error == DP_ERR_OFFLINE) {
ecf709
         ret = ERR_OFFLINE;
ecf709
-        goto done;
ecf709
-    } else if (ret != EOK) {
ecf709
-        DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get view name "
ecf709
-              "[%d]: %s\n", ret, sss_strerror(ret));
ecf709
-        goto done;
ecf709
     }
ecf709
 
ecf709
-done:
ecf709
     if (ret != EOK) {
ecf709
         DEBUG(SSSDBG_TRACE_FUNC, "Unable to refresh subdomains [%d]: %s\n",
ecf709
               ret, sss_strerror(ret));
ecf709
@@ -1949,7 +2094,6 @@ done:
ecf709
         return;
ecf709
     }
ecf709
 
ecf709
-    DEBUG(SSSDBG_TRACE_FUNC, "Subdomains refreshed.\n");
ecf709
     tevent_req_done(req);
ecf709
 }
ecf709
 
ecf709
-- 
ecf709
2.9.3
ecf709