ipa_subdomains.c revision b58460076fe843c11d736ae244c1ac979a6473a4
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen IPA Subdomains Module
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen Sumit Bose <sbose@redhat.com>
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen Copyright (C) 2011 Red Hat
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 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.
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/>.
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen#define SUBDOMAINS_FILTER "objectclass=ipaNTTrustedDomain"
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen#define MASTER_DOMAIN_FILTER "objectclass=ipaNTDomainAttrs"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#define IPA_TRUSTED_DOMAIN_SID "ipaNTTrustedDomainSID"
ec047a9c54a02338e85fb1767120b0923f6d4148Timo Sirainen#define IPA_SECONDARY_BASE_RID "ipaSecondaryBaseRID"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenstatic void ipa_subdomains_reply(struct be_req *be_req, int dp_err, int result)
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenstatic errno_t ipa_ranges_parse_results(TALLOC_CTX *mem_ctx,
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen range_list = talloc_array(mem_ctx, struct range_info *, count + 1);
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_array failed.\n"));
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen for (c = 0; c < count; c++) {
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen range_list[c] = talloc_zero(range_list, struct range_info);
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_zero failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_attrs_get_string(reply[c], IPA_CN, &value);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen range_list[c]->name = talloc_strdup(range_list[c], value);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_strdup failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_attrs_get_string(reply[c], IPA_TRUSTED_DOMAIN_SID, &value);
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen range_list[c]->trusted_dom_sid = talloc_strdup(range_list[c],
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_strdup failed.\n"));
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen ret = sysdb_attrs_get_uint32_t(reply[c], IPA_BASE_ID,
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen ret = sysdb_attrs_get_uint32_t(reply[c], IPA_ID_RANGE_SIZE,
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen ret = sysdb_attrs_get_uint32_t(reply[c], IPA_BASE_RID,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_attrs_get_uint32_t(reply[c], IPA_SECONDARY_BASE_RID,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen new_domain_list = talloc_array(sd_data, struct sysdb_subdom *, count + 1);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_array failed.\n"));
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen for (c = 0; c < count; c++) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen new_domain_list[c] = talloc_zero(new_domain_list,
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_zero failed.\n"));
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen ret = sysdb_attrs_get_string(reply[c], IPA_CN, &value);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen new_domain_list[c]->name = talloc_strdup(new_domain_list[c], value);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_strdup failed.\n"));
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen ret = sysdb_attrs_get_string(reply[c], IPA_FLATNAME, &value);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen new_domain_list[c]->flat_name = talloc_strdup(new_domain_list[c],
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_strdup failed.\n"));
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_attrs_get_string(reply[c], IPA_TRUSTED_DOMAIN_SID, &value);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen new_domain_list[c]->id = talloc_strdup(new_domain_list[c], value);
efeb13303798b47d2c4295468d233c1bcfd79c94Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("talloc_strdup failed.\n"));
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_attrs_get_string failed.\n"));
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainenstatic void ipa_subdomains_get_conn_done(struct tevent_req *req);
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainenipa_subdomains_handler_get(struct ipa_subdomains_req_ctx *ctx,
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 Sirainenstatic struct ipa_subdomains_req_params subdomain_requests[] = {
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen { MASTER_DOMAIN_FILTER, ipa_subdomains_handler_master_done,
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 }}
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainenvoid ipa_subdomains_handler(struct be_req *be_req)
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ctx = talloc(be_req, struct ipa_subdomains_req_ctx);
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen be_req->be_ctx->bet_info[BET_SUBDOMAINS].pvt_bet_data,
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ctx->sd_data = talloc_get_type(be_req->req_data,
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen ctx->search_bases = ctx->sd_ctx->search_bases;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sdap_id_op_create failed.\n"));
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen req = sdap_id_op_connect_send(ctx->sdap_op, ctx, &ret);
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sdap_id_op_connect_send failed: %d(%s).\n",
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen tevent_req_set_callback(req, ipa_subdomains_get_conn_done, ctx);
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainen ipa_subdomains_reply(be_req, DP_ERR_FATAL, ret);
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainenstatic void ipa_subdomains_get_conn_done(struct tevent_req *req)
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen struct ipa_subdomains_req_ctx *ctx = tevent_req_callback_data(req,
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ret = sdap_id_op_connect_recv(req, &dp_error);
3561c7bb472a78af74d755219cc0fc71c85ff5c2Timo Sirainen ("No IPA server is available, cannot get the "
ae949831f1f668b5501b4b125e7f7b1767fb109bTimo Sirainen "subdomain list while offline\n"));
45af47783693b3ba2768c5ad34eeff68132382d0Timo Sirainen/* FIXME: return saved results ?? */
03af8e5325a7b4fec36414ac35949457bc426c0bTimo Sirainen ("Failed to connect to IPA server: [%d](%s)\n",
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ret = ipa_subdomains_handler_get(ctx, IPA_SUBDOMAINS_SLAVE);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenipa_subdomains_handler_get(struct ipa_subdomains_req_ctx *ctx,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen base = ctx->search_bases[ctx->search_base_iter];
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen ctx->current_filter = sdap_get_id_specific_filter(ctx, params->filter, base->filter);
805d7834412465268486c50711962407ad13fbf6Timo Sirainen req = sdap_get_generic_send(ctx, ctx->be_req->be_ctx->ev,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen dp_opt_get_int(ctx->sd_ctx->sdap_id_ctx->opts->basic,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sdap_get_generic_send failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen tevent_req_set_callback(req, params->cb, ctx);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenstatic void ipa_subdomains_handler_done(struct tevent_req *req)
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct ipa_subdomains_req_ctx *ctx = tevent_req_callback_data(req,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen sysdb = (be_req->sysdb)?be_req->sysdb:be_req->be_ctx->sysdb;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sdap_get_generic_recv(req, ctx, &reply_count, &reply);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sdap_get_generic_send request failed.\n"));
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen ctx->reply = talloc_realloc(ctx, ctx->reply, struct sysdb_attrs *,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = ipa_subdomains_handler_get(ctx, IPA_SUBDOMAINS_SLAVE);
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen ret = ipa_subdomains_parse_results(ctx->sd_data, ctx->reply_count, ctx->reply);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("ipa_subdomains_parse_results request failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_update_subdomains(sysdb, ctx->sd_data->domain_list);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_update_subdomains failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ctx->search_bases = ctx->sd_ctx->ranges_search_bases;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = ipa_subdomains_handler_get(ctx, IPA_SUBDOMAINS_RANGES);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("No search base for ranges available.\n"));
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen ipa_subdomains_reply(be_req, DP_ERR_FATAL, ret);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainenstatic void ipa_subdomains_handler_ranges_done(struct tevent_req *req)
fbd671a3f51a5f92535923fcaf05fed1e5712ae4Timo Sirainen struct ipa_subdomains_req_ctx *ctx = tevent_req_callback_data(req,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen sysdb = (be_req->sysdb)?be_req->sysdb:be_req->be_ctx->sysdb;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sdap_get_generic_recv(req, ctx, &reply_count, &reply);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sdap_get_generic_send request failed.\n"));
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen ret = ipa_ranges_parse_results(ctx, reply_count, reply, &range_list);
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("ipa_ranges_parse_results request failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sysdb_update_ranges failed.\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_master_domain_get_info(ctx, sysdb, &domain_info);
7d315281ae13a66e13da2b1ad006bdb883018278Timo Sirainen ctx->search_bases = ctx->sd_ctx->master_search_bases;
7d315281ae13a66e13da2b1ad006bdb883018278Timo Sirainen ret = ipa_subdomains_handler_get(ctx, IPA_SUBDOMAINS_MASTER);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ipa_subdomains_reply(be_req, (ret == EOK ? DP_ERR_OK : DP_ERR_FATAL), ret);
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainenstatic void ipa_subdomains_handler_master_done(struct tevent_req *req)
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct ipa_subdomains_req_ctx *ctx = tevent_req_callback_data(req,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sdap_get_generic_recv(req, ctx, &reply_count, &reply);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("sdap_get_generic_send request failed.\n"));
a0ebe2a2271759599686f3480aee6a6fe445d16eTimo Sirainen domain_info = talloc_zero(ctx, struct sysdb_subdom);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_attrs_get_string(reply[0], IPA_FLATNAME, &tmp_str);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen domain_info->flat_name = talloc_strdup(domain_info, tmp_str);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = sysdb_attrs_get_string(reply[0], IPA_SID, &tmp_str);
b8e6e314eb2f9f1fc8ce2999034321bfeb7a2269Timo Sirainen domain_info->id = talloc_strdup(domain_info, tmp_str);
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen ret = sysdb_master_domain_add_info(be_req->be_ctx->sysdb, domain_info);
f48fdb57185ca68e8c079e174f3e04da36646880Timo Sirainen ret = ipa_subdomains_handler_get(ctx, IPA_SUBDOMAINS_MASTER);
f48fdb57185ca68e8c079e174f3e04da36646880Timo Sirainen /* Right now we know there has been an error
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen * and we don't have the master domain record
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Master domain record not found!\n"));