ipa_subdomains.c revision b58460076fe843c11d736ae244c1ac979a6473a4
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/*
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen SSSD
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen IPA Subdomains Module
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen Authors:
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen Sumit Bose <sbose@redhat.com>
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen Copyright (C) 2011 Red Hat
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen This program is free software; you can redistribute it and/or modify
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen it under the terms of the GNU General Public License as published by
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen the Free Software Foundation; either version 3 of the License, or
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen (at your option) any later version.
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen This program is distributed in the hope that it will be useful,
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen GNU General Public License for more details.
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen You should have received a copy of the GNU General Public License
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen*/
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#include "providers/ldap/sdap_async.h"
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen#include "providers/ipa/ipa_subdomains.h"
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen#include "providers/ipa/ipa_common.h"
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen#define SUBDOMAINS_FILTER "objectclass=ipaNTTrustedDomain"
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen#define MASTER_DOMAIN_FILTER "objectclass=ipaNTDomainAttrs"
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen#define RANGE_FILTER "objectclass=ipaIDRange"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#define IPA_CN "cn"
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen#define IPA_FLATNAME "ipaNTFlatName"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#define IPA_SID "ipaNTSecurityIdentifier"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#define IPA_TRUSTED_DOMAIN_SID "ipaNTTrustedDomainSID"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#define IPA_BASE_ID "ipaBaseID"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#define IPA_ID_RANGE_SIZE "ipaIDRangeSize"
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen#define IPA_BASE_RID "ipaBaseRID"
ec047a9c54a02338e85fb1767120b0923f6d4148Timo Sirainen#define IPA_SECONDARY_BASE_RID "ipaSecondaryBaseRID"
ec047a9c54a02338e85fb1767120b0923f6d4148Timo Sirainen#define OBJECTCLASS "objectClass"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenenum ipa_subdomains_req_type {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen IPA_SUBDOMAINS_MASTER,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen IPA_SUBDOMAINS_SLAVE,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen IPA_SUBDOMAINS_RANGES,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen IPA_SUBDOMAINS_MAX /* Counter */
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen};
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenstruct ipa_subdomains_req_params {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen const char *filter;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen tevent_req_fn cb;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen const char *attrs[8];
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen};
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenstatic void ipa_subdomains_reply(struct be_req *be_req, int dp_err, int result)
3c73d884362b72c86753939551c94f8baa5702f8Timo Sirainen{
3c73d884362b72c86753939551c94f8baa5702f8Timo Sirainen be_req->fn(be_req, dp_err, result, NULL);
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen}
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenstatic errno_t ipa_ranges_parse_results(TALLOC_CTX *mem_ctx,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen size_t count,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct sysdb_attrs **reply,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct range_info ***_range_list)
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen{
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen struct range_info **range_list = NULL;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen const char *value;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen size_t c;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen int ret;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen range_list = talloc_array(mem_ctx, struct range_info *, count + 1);
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen if (range_list == NULL) {
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_array failed.\n"));
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen return ENOMEM;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen }
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen for (c = 0; c < count; c++) {
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen range_list[c] = talloc_zero(range_list, struct range_info);
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen if (range_list[c] == NULL) {
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_zero failed.\n"));
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen ret = ENOMEM;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen goto done;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_attrs_get_string(reply[c], IPA_CN, &value);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen range_list[c]->name = talloc_strdup(range_list[c], value);
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen if (range_list[c]->name == NULL) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_strdup failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = ENOMEM;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_attrs_get_string(reply[c], IPA_TRUSTED_DOMAIN_SID, &value);
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen if (ret == EOK) {
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen range_list[c]->trusted_dom_sid = talloc_strdup(range_list[c],
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen value);
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen if (range_list[c]->trusted_dom_sid == NULL) {
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_strdup failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = ENOMEM;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen }
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen } else if (ret != ENOENT) {
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen goto done;
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen }
887a9fbbb2ca6afd53365ba2ccae0ef8728d6948Timo Sirainen
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen ret = sysdb_attrs_get_uint32_t(reply[c], IPA_BASE_ID,
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen &range_list[c]->base_id);
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen if (ret != EOK && ret != ENOENT) {
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
887a9fbbb2ca6afd53365ba2ccae0ef8728d6948Timo Sirainen goto done;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen }
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen ret = sysdb_attrs_get_uint32_t(reply[c], IPA_ID_RANGE_SIZE,
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen &range_list[c]->id_range_size);
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen if (ret != EOK && ret != ENOENT) {
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen goto done;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen }
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen ret = sysdb_attrs_get_uint32_t(reply[c], IPA_BASE_RID,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen &range_list[c]->base_rid);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK && ret != ENOENT) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_attrs_get_uint32_t(reply[c], IPA_SECONDARY_BASE_RID,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen &range_list[c]->secondary_base_rid);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK && ret != ENOENT) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen range_list[c] = NULL;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen *_range_list = range_list;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen ret = EOK;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen
e83126866761632b437e532dfdc30be01d14039dTimo Sirainendone:
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK) {
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen talloc_free(range_list);
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen }
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen return ret;
33bd898e7756b289e65f43133312d9637afc1371Timo Sirainen}
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainenstatic errno_t ipa_subdomains_parse_results(
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen struct be_get_subdomains_req *sd_data,
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen size_t count,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct sysdb_attrs **reply)
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen{
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct sysdb_subdom **new_domain_list = NULL;
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen const char *value;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen size_t c;
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen int ret;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen new_domain_list = talloc_array(sd_data, struct sysdb_subdom *, count + 1);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (new_domain_list == NULL) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_array failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen return ENOMEM;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen for (c = 0; c < count; c++) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen new_domain_list[c] = talloc_zero(new_domain_list,
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen struct sysdb_subdom);
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen if (new_domain_list[c] == NULL) {
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_zero failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = ENOMEM;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen ret = sysdb_attrs_get_string(reply[c], IPA_CN, &value);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen new_domain_list[c]->name = talloc_strdup(new_domain_list[c], value);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (new_domain_list[c]->name == NULL) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_strdup failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = ENOMEM;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen }
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen ret = sysdb_attrs_get_string(reply[c], IPA_FLATNAME, &value);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret == EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen new_domain_list[c]->flat_name = talloc_strdup(new_domain_list[c],
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen value);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (new_domain_list[c]->flat_name == NULL) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_strdup failed.\n"));
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen ret = ENOMEM;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen } else if (ret != ENOENT) {
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
887a9fbbb2ca6afd53365ba2ccae0ef8728d6948Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_attrs_get_string(reply[c], IPA_TRUSTED_DOMAIN_SID, &value);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret == EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen new_domain_list[c]->id = talloc_strdup(new_domain_list[c], value);
36723cf206a7b64b9d972ab0719bbfaacc9316faTimo Sirainen if (new_domain_list[c]->id == NULL) {
efeb13303798b47d2c4295468d233c1bcfd79c94Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_strdup failed.\n"));
307ec6c2c319e3335ddb1a7aca2d2884fe17fae0Timo Sirainen ret = ENOMEM;
307ec6c2c319e3335ddb1a7aca2d2884fe17fae0Timo Sirainen goto done;
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen }
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen } else if (ret != ENOENT) {
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
975a784c2e02ecdcb56efb7a1db5e4769c7756d8Timo Sirainen goto done;
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen }
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen }
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen new_domain_list[c] = NULL;
14b1d2a2634e75b988078baee1e8ad678de28a04Timo Sirainen
14b1d2a2634e75b988078baee1e8ad678de28a04Timo Sirainen ret = EOK;
45af47783693b3ba2768c5ad34eeff68132382d0Timo Sirainen
45af47783693b3ba2768c5ad34eeff68132382d0Timo Sirainendone:
afd6d387ea65843b59fb6051fb567719d2a5279cAki Tuomi if (ret == EOK) {
afd6d387ea65843b59fb6051fb567719d2a5279cAki Tuomi talloc_free(sd_data->domain_list);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen sd_data->domain_list = new_domain_list;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen } else {
70df8f39fb3db7c49b18c855178f8172176a037aTimo Sirainen talloc_free(new_domain_list);
70df8f39fb3db7c49b18c855178f8172176a037aTimo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen return ret;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen}
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenstruct ipa_subdomains_req_ctx {
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen struct be_req *be_req;
3561c7bb472a78af74d755219cc0fc71c85ff5c2Timo Sirainen struct ipa_subdomains_ctx *sd_ctx;
ee8294dbc7bb549557f6ba1264d66b55fbef69b6Aki Tuomi struct sdap_id_op *sdap_op;
ae949831f1f668b5501b4b125e7f7b1767fb109bTimo Sirainen struct be_get_subdomains_req *sd_data;
2e652d2651b2800f99a17dcb3014a009fe4660d3Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen char *current_filter;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct sdap_search_base **search_bases;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen int search_base_iter;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen size_t reply_count;
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen struct sysdb_attrs **reply;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen};
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainenstatic void ipa_subdomains_get_conn_done(struct tevent_req *req);
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainenstatic errno_t
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainenipa_subdomains_handler_get(struct ipa_subdomains_req_ctx *ctx,
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen enum ipa_subdomains_req_type type);
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainenstatic void ipa_subdomains_handler_done(struct tevent_req *req);
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainenstatic void ipa_subdomains_handler_master_done(struct tevent_req *req);
237a6211c7fc4d6dbb58dd0467da6dba1b8f21f6Timo Sirainenstatic void ipa_subdomains_handler_ranges_done(struct tevent_req *req);
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainenstatic struct ipa_subdomains_req_params subdomain_requests[] = {
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen { MASTER_DOMAIN_FILTER, ipa_subdomains_handler_master_done,
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen {IPA_CN, IPA_FLATNAME, IPA_SID, NULL }},
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen { SUBDOMAINS_FILTER, ipa_subdomains_handler_done,
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen {IPA_CN, IPA_FLATNAME, IPA_TRUSTED_DOMAIN_SID, NULL }},
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen { RANGE_FILTER, ipa_subdomains_handler_ranges_done,
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen {OBJECTCLASS, IPA_CN, IPA_BASE_ID, IPA_ID_RANGE_SIZE, IPA_BASE_RID,
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen IPA_SECONDARY_BASE_RID, IPA_TRUSTED_DOMAIN_SID, NULL }}
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen};
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainenvoid ipa_subdomains_handler(struct be_req *be_req)
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen{
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen struct tevent_req *req;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen struct ipa_subdomains_req_ctx *ctx = NULL;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen int ret;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ctx = talloc(be_req, struct ipa_subdomains_req_ctx);
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen if (ctx == NULL) {
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ret = ENOMEM;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen goto fail;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen }
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ctx->be_req = be_req;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ctx->sd_ctx = talloc_get_type(
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen be_req->be_ctx->bet_info[BET_SUBDOMAINS].pvt_bet_data,
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen struct ipa_subdomains_ctx);
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ctx->sd_data = talloc_get_type(be_req->req_data,
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen struct be_get_subdomains_req);
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen ctx->search_base_iter = 0;
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen ctx->search_bases = ctx->sd_ctx->search_bases;
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen ctx->current_filter = NULL;
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen ctx->reply_count = 0;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ctx->reply = NULL;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ctx->sdap_op = sdap_id_op_create(ctx,
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ctx->sd_ctx->sdap_id_ctx->conn_cache);
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen if (ctx->sdap_op == NULL) {
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sdap_id_op_create failed.\n"));
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ret = ENOMEM;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen goto fail;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen }
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen req = sdap_id_op_connect_send(ctx->sdap_op, ctx, &ret);
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen if (req == NULL) {
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sdap_id_op_connect_send failed: %d(%s).\n",
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ret, strerror(ret)));
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen goto fail;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen }
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen tevent_req_set_callback(req, ipa_subdomains_get_conn_done, ctx);
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainen return;
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainen
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainenfail:
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen talloc_free(ctx);
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainen ipa_subdomains_reply(be_req, DP_ERR_FATAL, ret);
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainen}
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainen
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainenstatic void ipa_subdomains_get_conn_done(struct tevent_req *req)
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen{
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen int ret;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen int dp_error = DP_ERR_FATAL;
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen struct be_req *be_req;
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen struct ipa_subdomains_req_ctx *ctx = tevent_req_callback_data(req,
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen struct ipa_subdomains_req_ctx);
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ret = sdap_id_op_connect_recv(req, &dp_error);
d519a0449d0e536a32db93305516fdbd7db6773dTimo Sirainen talloc_zfree(req);
d519a0449d0e536a32db93305516fdbd7db6773dTimo Sirainen if (ret) {
ee8294dbc7bb549557f6ba1264d66b55fbef69b6Aki Tuomi if (dp_error == DP_ERR_OFFLINE) {
ee8294dbc7bb549557f6ba1264d66b55fbef69b6Aki Tuomi DEBUG(SSSDBG_MINOR_FAILURE,
3561c7bb472a78af74d755219cc0fc71c85ff5c2Timo Sirainen ("No IPA server is available, cannot get the "
ae949831f1f668b5501b4b125e7f7b1767fb109bTimo Sirainen "subdomain list while offline\n"));
ae949831f1f668b5501b4b125e7f7b1767fb109bTimo Sirainen
45af47783693b3ba2768c5ad34eeff68132382d0Timo Sirainen/* FIXME: return saved results ?? */
45af47783693b3ba2768c5ad34eeff68132382d0Timo Sirainen } else {
03af8e5325a7b4fec36414ac35949457bc426c0bTimo Sirainen DEBUG(SSSDBG_OP_FAILURE,
03af8e5325a7b4fec36414ac35949457bc426c0bTimo Sirainen ("Failed to connect to IPA server: [%d](%s)\n",
03af8e5325a7b4fec36414ac35949457bc426c0bTimo Sirainen ret, strerror(ret)));
03af8e5325a7b4fec36414ac35949457bc426c0bTimo Sirainen }
03af8e5325a7b4fec36414ac35949457bc426c0bTimo Sirainen
03af8e5325a7b4fec36414ac35949457bc426c0bTimo Sirainen goto fail;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen }
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ret = ipa_subdomains_handler_get(ctx, IPA_SUBDOMAINS_SLAVE);
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen if (ret != EOK && ret != EAGAIN) {
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen goto fail;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen }
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen return;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenfail:
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen be_req = ctx->be_req;
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen talloc_free(ctx);
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen ipa_subdomains_reply(be_req, dp_error, ret);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen}
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainenstatic errno_t
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenipa_subdomains_handler_get(struct ipa_subdomains_req_ctx *ctx,
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen enum ipa_subdomains_req_type type)
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen{
f43ce62fa945f597e8a48e09c53d46dcc95445d4Timo Sirainen struct tevent_req *req;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct sdap_search_base *base;
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen struct ipa_subdomains_req_params *params;
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen if (type >= IPA_SUBDOMAINS_MAX) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen return EINVAL;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7d315281ae13a66e13da2b1ad006bdb883018278Timo Sirainen
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen params = &subdomain_requests[type];
805d7834412465268486c50711962407ad13fbf6Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen base = ctx->search_bases[ctx->search_base_iter];
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (base == NULL) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen return EOK;
d9b9687bf8cae9cfb070b1b7aadefa683220269fTimo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen talloc_free(ctx->current_filter);
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen ctx->current_filter = sdap_get_id_specific_filter(ctx, params->filter, base->filter);
7d315281ae13a66e13da2b1ad006bdb883018278Timo Sirainen if (ctx->current_filter == NULL) {
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen return ENOMEM;
805d7834412465268486c50711962407ad13fbf6Timo Sirainen }
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen
805d7834412465268486c50711962407ad13fbf6Timo Sirainen req = sdap_get_generic_send(ctx, ctx->be_req->be_ctx->ev,
805d7834412465268486c50711962407ad13fbf6Timo Sirainen ctx->sd_ctx->sdap_id_ctx->opts,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen sdap_id_op_handle(ctx->sdap_op),
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen base->basedn, base->scope,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ctx->current_filter, params->attrs, NULL, 0,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen dp_opt_get_int(ctx->sd_ctx->sdap_id_ctx->opts->basic,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen SDAP_SEARCH_TIMEOUT), false);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (req == NULL) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sdap_get_generic_send failed.\n"));
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen return ENOMEM;
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen tevent_req_set_callback(req, params->cb, ctx);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen return EAGAIN;
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen}
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenstatic void ipa_subdomains_handler_done(struct tevent_req *req)
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen{
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen int ret;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen size_t reply_count;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct sysdb_attrs **reply = NULL;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct ipa_subdomains_req_ctx *ctx = tevent_req_callback_data(req,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct ipa_subdomains_req_ctx);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct be_req *be_req = ctx->be_req;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct sysdb_ctx *sysdb;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen sysdb = (be_req->sysdb)?be_req->sysdb:be_req->be_ctx->sysdb;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sdap_get_generic_recv(req, ctx, &reply_count, &reply);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen talloc_zfree(req);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sdap_get_generic_send request failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (reply_count) {
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen ctx->reply = talloc_realloc(ctx, ctx->reply, struct sysdb_attrs *,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ctx->reply_count + reply_count);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ctx->reply == NULL) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = ENOMEM;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen memcpy(ctx->reply+ctx->reply_count, reply,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen reply_count * sizeof(struct sysdb_attrs *));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ctx->reply_count += reply_count;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ctx->search_base_iter++;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = ipa_subdomains_handler_get(ctx, IPA_SUBDOMAINS_SLAVE);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret == EAGAIN) {
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen return;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen } else if (ret != EOK) {
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen goto done;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen }
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen ret = ipa_subdomains_parse_results(ctx->sd_data, ctx->reply_count, ctx->reply);
cce2c665bb24537bb691f6cad6a36f8080e4a552Timo Sirainen if (ret != EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("ipa_subdomains_parse_results request failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_update_subdomains(sysdb, ctx->sd_data->domain_list);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_update_subdomains failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ctx->search_base_iter = 0;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ctx->search_bases = ctx->sd_ctx->ranges_search_bases;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = ipa_subdomains_handler_get(ctx, IPA_SUBDOMAINS_RANGES);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret == EAGAIN) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen return;
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen } else if (ret != EOK) {
7d315281ae13a66e13da2b1ad006bdb883018278Timo Sirainen goto done;
7d315281ae13a66e13da2b1ad006bdb883018278Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("No search base for ranges available.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = EINVAL;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainendone:
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen talloc_free(ctx);
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen ipa_subdomains_reply(be_req, DP_ERR_FATAL, ret);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen}
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenstatic void ipa_subdomains_handler_ranges_done(struct tevent_req *req)
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen{
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen errno_t ret;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen size_t reply_count;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct sysdb_attrs **reply = NULL;
fbd671a3f51a5f92535923fcaf05fed1e5712ae4Timo Sirainen struct ipa_subdomains_req_ctx *ctx = tevent_req_callback_data(req,
fbd671a3f51a5f92535923fcaf05fed1e5712ae4Timo Sirainen struct ipa_subdomains_req_ctx);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct be_req *be_req = ctx->be_req;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct sysdb_subdom *domain_info;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct range_info **range_list = NULL;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct sysdb_ctx *sysdb;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen sysdb = (be_req->sysdb)?be_req->sysdb:be_req->be_ctx->sysdb;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sdap_get_generic_recv(req, ctx, &reply_count, &reply);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen talloc_zfree(req);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sdap_get_generic_send request failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen }
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen ret = ipa_ranges_parse_results(ctx, reply_count, reply, &range_list);
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen if (ret != EOK) {
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("ipa_ranges_parse_results request failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen }
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen ret = sysdb_update_ranges(sysdb, range_list);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen talloc_free(range_list);
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen if (ret != EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_update_ranges failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_master_domain_get_info(ctx, sysdb, &domain_info);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK) {
e475db821baf0c4680dec4441d033697ecebfe06Timo Sirainen goto done;
e475db821baf0c4680dec4441d033697ecebfe06Timo Sirainen }
7d315281ae13a66e13da2b1ad006bdb883018278Timo Sirainen
e475db821baf0c4680dec4441d033697ecebfe06Timo Sirainen if (domain_info->flat_name == NULL ||
e475db821baf0c4680dec4441d033697ecebfe06Timo Sirainen domain_info->id == NULL ||
e475db821baf0c4680dec4441d033697ecebfe06Timo Sirainen domain_info->name == NULL) {
e475db821baf0c4680dec4441d033697ecebfe06Timo Sirainen
e475db821baf0c4680dec4441d033697ecebfe06Timo Sirainen ctx->search_base_iter = 0;
7d315281ae13a66e13da2b1ad006bdb883018278Timo Sirainen ctx->search_bases = ctx->sd_ctx->master_search_bases;
7d315281ae13a66e13da2b1ad006bdb883018278Timo Sirainen ret = ipa_subdomains_handler_get(ctx, IPA_SUBDOMAINS_MASTER);
e475db821baf0c4680dec4441d033697ecebfe06Timo Sirainen if (ret == EAGAIN) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen return;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen } else if (ret != EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen } else {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = EOK;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainendone:
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen talloc_free(ctx);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ipa_subdomains_reply(be_req, (ret == EOK ? DP_ERR_OK : DP_ERR_FATAL), ret);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen}
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainenstatic void ipa_subdomains_handler_master_done(struct tevent_req *req)
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen{
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen errno_t ret;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen size_t reply_count;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct sysdb_attrs **reply = NULL;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct ipa_subdomains_req_ctx *ctx = tevent_req_callback_data(req,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct ipa_subdomains_req_ctx);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct be_req *be_req = ctx->be_req;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct sysdb_subdom *domain_info;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen const char *tmp_str;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sdap_get_generic_recv(req, ctx, &reply_count, &reply);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen talloc_zfree(req);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sdap_get_generic_send request failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (reply_count) {
a0ebe2a2271759599686f3480aee6a6fe445d16eTimo Sirainen domain_info = talloc_zero(ctx, struct sysdb_subdom);
a0ebe2a2271759599686f3480aee6a6fe445d16eTimo Sirainen if (domain_info == NULL) {
a0ebe2a2271759599686f3480aee6a6fe445d16eTimo Sirainen ret = ENOMEM;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_attrs_get_string(reply[0], IPA_FLATNAME, &tmp_str);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK) goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen domain_info->flat_name = talloc_strdup(domain_info, tmp_str);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (domain_info->flat_name == NULL) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = ENOMEM;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_attrs_get_string(reply[0], IPA_SID, &tmp_str);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
24bd831901b8fd59718e353b36eaef6a950f09a2Timo Sirainen }
b8e6e314eb2f9f1fc8ce2999034321bfeb7a2269Timo Sirainen domain_info->id = talloc_strdup(domain_info, tmp_str);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (domain_info->flat_name == NULL) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = ENOMEM;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen ret = sysdb_master_domain_add_info(be_req->be_ctx->sysdb, domain_info);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen } else {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ctx->search_base_iter++;
f48fdb57185ca68e8c079e174f3e04da36646880Timo Sirainen ret = ipa_subdomains_handler_get(ctx, IPA_SUBDOMAINS_MASTER);
f48fdb57185ca68e8c079e174f3e04da36646880Timo Sirainen if (ret == EAGAIN) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen return;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen } else if (ret != EOK) {
f48fdb57185ca68e8c079e174f3e04da36646880Timo Sirainen goto done;
f48fdb57185ca68e8c079e174f3e04da36646880Timo Sirainen }
f48fdb57185ca68e8c079e174f3e04da36646880Timo Sirainen
f48fdb57185ca68e8c079e174f3e04da36646880Timo Sirainen /* Right now we know there has been an error
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen * and we don't have the master domain record
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen */
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Master domain record not found!\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = EIO;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainendone:
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen talloc_free(ctx);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ipa_subdomains_reply(be_req, (ret == EOK ? DP_ERR_OK : DP_ERR_FATAL), ret);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen}
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen