ad_common.c revision 59415636c92c6e9764ddc65a85ad61002310519d
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/*
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SSSD
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen Authors:
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen Stephen Gallagher <sgallagh@redhat.com>
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen Copyright (C) 2012 Red Hat
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen This program is free software; you can redistribute it and/or modify
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen it under the terms of the GNU General Public License as published by
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen the Free Software Foundation; either version 3 of the License, or
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen (at your option) any later version.
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen This program is distributed in the hope that it will be useful,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen GNU General Public License for more details.
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen You should have received a copy of the GNU General Public License
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen*/
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen#include <ctype.h>
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen#include "providers/ad/ad_common.h"
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen#include "providers/ad/ad_opts.h"
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen#include "providers/dp_dyndns.h"
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstruct ad_server_data {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen bool gc;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen};
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenerrno_t ad_set_search_bases(struct sdap_options *id_opts);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstatic errno_t ad_set_ad_id_options(struct ad_options *ad_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct sdap_options *id_opts);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstatic struct sdap_options *
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_create_default_sdap_options(TALLOC_CTX *mem_ctx)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct sdap_options *id_opts;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen errno_t ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen id_opts = talloc_zero(mem_ctx, struct sdap_options);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!id_opts) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return NULL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_copy_options(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_def_ldap_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_OPTS_BASIC,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->basic);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto fail;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Get sdap option maps */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* General Attribute Map */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_copy_map(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_2008r2_attr_map,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_AT_GENERAL,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->gen_map);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto fail;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* User map */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_copy_map(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_2008r2_user_map,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_OPTS_USER,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->user_map);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto fail;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Group map */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_copy_map(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_2008r2_group_map,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_OPTS_GROUP,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->group_map);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto fail;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Netgroup map */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_copy_map(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_netgroup_map,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_OPTS_NETGROUP,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->netgroup_map);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto fail;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Services map */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_copy_map(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_service_map,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_OPTS_SERVICES,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->service_map);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto fail;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return id_opts;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenfail:
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(id_opts);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return NULL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstruct ad_options *
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_create_default_options(TALLOC_CTX *mem_ctx,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *realm,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *hostname)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct ad_options *ad_options;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen errno_t ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_options = talloc_zero(mem_ctx, struct ad_options);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ad_options == NULL) return NULL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_copy_options(ad_options,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_basic_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen AD_OPTS_BASIC,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &ad_options->basic);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(ad_options);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return NULL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
ef5fb27361cc5e15766e85e28355750ff04b13c9Timo Sirainen
ef5fb27361cc5e15766e85e28355750ff04b13c9Timo Sirainen ad_options->id = ad_create_default_sdap_options(ad_options);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ad_options->id == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("Cannot initialize AD LDAP options\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(ad_options);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return NULL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_opt_set_string(ad_options->basic, AD_KRB5_REALM, realm);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("Cannot set AD domain\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(ad_options);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return NULL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_opt_set_string(ad_options->basic, AD_HOSTNAME, hostname);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("Cannot set AD domain\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(ad_options);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return NULL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ad_set_ad_id_options(ad_options, ad_options->id);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(ad_options);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return NULL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ad_options;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstatic errno_t
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_create_sdap_options(TALLOC_CTX *mem_ctx,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct confdb_ctx *cdb,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *conf_path,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct sdap_options **_id_opts)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct sdap_options *id_opts;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen errno_t ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen id_opts = talloc_zero(mem_ctx, struct sdap_options);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!id_opts) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_get_options(id_opts, cdb, conf_path,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_def_ldap_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_OPTS_BASIC,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->basic);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Get sdap option maps */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* General Attribute Map */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_get_map(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen cdb, conf_path,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_2008r2_attr_map,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_AT_GENERAL,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->gen_map);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* User map */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_get_map(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen cdb, conf_path,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_2008r2_user_map,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_OPTS_USER,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->user_map);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Group map */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_get_map(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen cdb, conf_path,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_2008r2_group_map,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_OPTS_GROUP,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->group_map);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Netgroup map */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_get_map(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen cdb, conf_path,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_netgroup_map,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_OPTS_NETGROUP,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->netgroup_map);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Services map */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_get_map(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen cdb, conf_path,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_service_map,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_OPTS_SERVICES,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->service_map);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EOK;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen *_id_opts = id_opts;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainendone:
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenerrno_t
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_get_common_options(TALLOC_CTX *mem_ctx,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct confdb_ctx *cdb,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *conf_path,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct sss_domain_info *dom,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct ad_options **_opts)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen errno_t ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen int gret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct ad_options *opts = NULL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen char *domain;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen char *server;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen char *realm;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen char *ad_hostname;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen char hostname[HOST_NAME_MAX + 1];
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen opts = talloc_zero(mem_ctx, struct ad_options);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!opts) return ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_get_options(opts, cdb, conf_path,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_basic_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen AD_OPTS_BASIC,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &opts->basic);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* If the AD domain name wasn't explicitly set, assume that it
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen * matches the SSSD domain name
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen domain = dp_opt_get_string(opts->basic, AD_DOMAIN);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!domain) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_opt_set_string(opts->basic, AD_DOMAIN, dom->name);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen domain = dom->name;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Did we get an explicit server name, or are we discovering it? */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen server = dp_opt_get_string(opts->basic, AD_SERVER);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!server) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("No AD server set, will use service discovery!\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Set the machine's hostname to the local host name if it
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen * wasn't explicitly specified.
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_hostname = dp_opt_get_string(opts->basic, AD_HOSTNAME);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ad_hostname == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen gret = gethostname(hostname, HOST_NAME_MAX);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (gret != 0) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = errno;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_FATAL_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("gethostname failed [%s].\n",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen strerror(ret)));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen hostname[HOST_NAME_MAX] = '\0';
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Setting ad_hostname to [%s].\n", hostname));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_opt_set_string(opts->basic, AD_HOSTNAME, hostname);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_FATAL_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Setting ad_hostname failed [%s].\n",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen strerror(ret)));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Always use the upper-case AD domain for the kerberos realm */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen realm = get_uppercase_realm(opts, domain);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!realm) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_opt_set_string(opts->basic, AD_KRB5_REALM, realm);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Active Directory is always case-insensitive */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen dom->case_sensitive = false;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Set this in the confdb so that the responders pick it
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen * up when they start up.
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = confdb_set_bool(cdb, conf_path, "case_sensitive",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen dom->case_sensitive);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Could not set domain case-sensitive: [%s]\n",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen strerror(ret)));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Setting domain case-insensitive\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EOK;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen *_opts = opts;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainendone:
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_zfree(opts);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstatic void
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_resolve_callback(void *private_data, struct fo_server *server);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstatic errno_t
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen_ad_servers_init(TALLOC_CTX *mem_ctx,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct ad_service *service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct be_ctx *bectx,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *fo_service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *fo_gc_service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *servers,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *ad_domain,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen bool primary)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen size_t i;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen errno_t ret = 0;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen char **list;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct ad_server_data *sdata;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen TALLOC_CTX *tmp_ctx;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen tmp_ctx = talloc_new(NULL);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!tmp_ctx) return ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Split the server list */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = split_on_separator(tmp_ctx, servers, ',', true, true, &list, NULL);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to parse server list!\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Add each of these servers to the failover service */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen for (i = 0; list[i]; i++) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (be_fo_is_srv_identifier(list[i])) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!primary) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_MINOR_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Failed to add server [%s] to failover service: "
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen "SRV resolution only allowed for primary servers!\n",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen list[i]));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen continue;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sdata = talloc(service, struct ad_server_data);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (sdata == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sdata->gc = true;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = be_fo_add_srv_server(bectx, fo_gc_service, "gc",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_domain, BE_FO_PROTO_TCP,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen false, sdata);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_FATAL_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Failed to add service discovery to failover: [%s]",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen strerror(ret)));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sdata = talloc(service, struct ad_server_data);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (sdata == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sdata->gc = false;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = be_fo_add_srv_server(bectx, fo_service, "ldap",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_domain, BE_FO_PROTO_TCP,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen false, sdata);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_FATAL_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Failed to add service discovery to failover: [%s]",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen strerror(ret)));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS, ("Added service discovery for AD\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen continue;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* It could be ipv6 address in square brackets. Remove
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen * the brackets if needed. */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = remove_ipv6_brackets(list[i]);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sdata = talloc(service, struct ad_server_data);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (sdata == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sdata->gc = true;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = be_fo_add_server(bectx, fo_service, list[i], 0, sdata, primary);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret && ret != EEXIST) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add server\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sdata = talloc(service, struct ad_server_data);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (sdata == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sdata->gc = false;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = be_fo_add_server(bectx, fo_service, list[i], 0, sdata, primary);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret && ret != EEXIST) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add server\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS, ("Added failover server %s\n", list[i]));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainendone:
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(tmp_ctx);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstatic inline errno_t
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_primary_servers_init(TALLOC_CTX *mem_ctx, struct ad_service *service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct be_ctx *bectx, const char *servers,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *fo_service, const char *fo_gc_service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *ad_domain)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return _ad_servers_init(mem_ctx, service, bectx, fo_service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen fo_gc_service, servers, ad_domain, true);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstatic inline errno_t
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_backup_servers_init(TALLOC_CTX *mem_ctx, struct ad_service *service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct be_ctx *bectx, const char *servers,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *fo_service, const char *fo_gc_service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *ad_domain)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return _ad_servers_init(mem_ctx, service, bectx, fo_service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen fo_gc_service, servers, ad_domain, false);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstatic int ad_user_data_cmp(void *ud1, void *ud2)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct ad_server_data *sd1, *sd2;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sd1 = talloc_get_type(ud1, struct ad_server_data);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sd2 = talloc_get_type(ud2, struct ad_server_data);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (sd1 == NULL || sd2 == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_TRACE_FUNC, ("No user data\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return sd1 == sd2 ? 0 : 1;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_TRACE_LIBS, ("Comparing %s with %s\n",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sd1->gc ? "GC" : "LDAP",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sd2->gc ? "GC" : "LDAP"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (sd1->gc == sd2->gc) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return 0;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return 1;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstatic void ad_online_cb(void *pvt)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct ad_service *service = talloc_get_type(pvt, struct ad_service);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (service == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Invalid private pointer\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_TRACE_FUNC, ("The AD provider is online\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenerrno_t
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_failover_init(TALLOC_CTX *mem_ctx, struct be_ctx *bectx,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *primary_servers,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *backup_servers,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *krb5_realm,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *ad_service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *ad_gc_service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *ad_domain,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct ad_service **_service)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen errno_t ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen TALLOC_CTX *tmp_ctx;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct ad_service *service;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen tmp_ctx = talloc_new(mem_ctx);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!tmp_ctx) return ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service = talloc_zero(tmp_ctx, struct ad_service);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!service) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->sdap = talloc_zero(service, struct sdap_service);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->gc = talloc_zero(service, struct sdap_service);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!service->sdap || !service->gc) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->sdap->name = talloc_strdup(service->sdap, ad_service);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->gc->name = talloc_strdup(service->gc, ad_gc_service);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!service->sdap->name || !service->gc->name) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->krb5_service = talloc_zero(service, struct krb5_service);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!service->krb5_service) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = be_fo_add_service(bectx, ad_service, ad_user_data_cmp);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to create failover service!\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = be_fo_add_service(bectx, ad_gc_service, ad_user_data_cmp);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to create GC failover service!\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->krb5_service->name = talloc_strdup(service->krb5_service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_service);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!service->krb5_service->name) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->sdap->kinit_service_name = service->krb5_service->name;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->gc->kinit_service_name = service->krb5_service->name;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!krb5_realm) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("No Kerberos realm set\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EINVAL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->krb5_service->realm =
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_strdup(service->krb5_service, krb5_realm);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!service->krb5_service->realm) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!primary_servers) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("No primary servers defined, using service discovery\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen primary_servers = BE_SRV_IDENTIFIER;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ad_primary_servers_init(mem_ctx, service, bectx,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen primary_servers, ad_service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_gc_service, ad_domain);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (backup_servers) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ad_backup_servers_init(mem_ctx, service, bectx,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen backup_servers, ad_service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_gc_service, ad_domain);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = be_add_online_cb(bectx, bectx, ad_online_cb, service, NULL);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Could not set up AD online callback\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = be_fo_service_add_callback(mem_ctx, bectx, ad_service,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_resolve_callback, service);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_FATAL_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Failed to add failover callback! [%s]\n", strerror(ret)));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen ret = be_fo_service_add_callback(mem_ctx, bectx, ad_gc_service,
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen ad_resolve_callback, service);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_FATAL_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Failed to add failover callback! [%s]\n", strerror(ret)));
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen goto done;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen }
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen *_service = talloc_steal(mem_ctx, service);
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen ret = EOK;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainendone:
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen talloc_free(tmp_ctx);
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen return ret;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen}
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainenstatic void
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainenad_resolve_callback(void *private_data, struct fo_server *server)
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen{
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen errno_t ret;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen TALLOC_CTX *tmp_ctx;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen struct ad_service *service;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen struct resolv_hostent *srvaddr;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen struct sockaddr_storage *sockaddr;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen char *address;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen const char *safe_address;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen char *new_uri;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen const char *srv_name;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen struct ad_server_data *sdata = NULL;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen tmp_ctx = talloc_new(NULL);
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen if (!tmp_ctx) {
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory\n"));
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen return;
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen }
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen sdata = fo_get_server_user_data(server);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (fo_is_srv_lookup(server) == false && sdata == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("No user data?\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service = talloc_get_type(private_data, struct ad_service);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!service) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EINVAL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen srvaddr = fo_get_server_hostent(server);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!srvaddr) {
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen ("No hostent available for server (%s)\n",
39413f6b07f7e4f4c1aeeecab73a2c454c84e308Timo Sirainen fo_get_server_str_name(server)));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EINVAL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen address = resolv_get_string_address(tmp_ctx, srvaddr);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (address == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("resolv_get_string_address failed.\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EIO;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen srv_name = fo_get_server_name(server);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (srv_name == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Could not get server host name\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EINVAL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen new_uri = talloc_asprintf(service->sdap, "ldap://%s", srv_name);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!new_uri) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to copy URI\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS, ("Constructed uri '%s'\n", new_uri));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sockaddr = resolv_get_sockaddr_address(tmp_ctx, srvaddr, LDAP_PORT);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (sockaddr == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("resolv_get_sockaddr_address failed.\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EIO;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* free old one and replace with new one */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_zfree(service->sdap->uri);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->sdap->uri = new_uri;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_zfree(service->sdap->sockaddr);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->sdap->sockaddr = talloc_steal(service->sdap, sockaddr);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_zfree(service->gc->uri);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_zfree(service->gc->sockaddr);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (sdata && sdata->gc) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->gc->uri = talloc_asprintf(service->gc, "%s:%d",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen new_uri, AD_GC_PORT);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->gc->sockaddr = resolv_get_sockaddr_address(service->gc,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen srvaddr,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen AD_GC_PORT);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen } else {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Make sure there always is an URI even if we know that this
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen * server doesn't support GC. That way the lookup would go through
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen * just not return anything
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->gc->uri = talloc_strdup(service->gc, service->sdap->uri);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->gc->sockaddr = talloc_memdup(service->gc, service->sdap->sockaddr,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sizeof(struct sockaddr_storage));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!service->gc->uri) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to append to URI\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS, ("Constructed GC uri '%s'\n", service->gc->uri));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (service->gc->sockaddr == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("resolv_get_sockaddr_address failed.\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EIO;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Only write kdcinfo files for local servers */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if ((sdata == NULL || sdata->gc == false) &&
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen service->krb5_service->write_kdcinfo) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Write krb5 info files */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen safe_address = sss_escape_ip_address(tmp_ctx,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen srvaddr->family,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen address);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (safe_address == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("sss_escape_ip_address failed.\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = write_krb5info_file(service->krb5_service->realm, safe_address,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SSS_KRB5KDC_FO_SRV);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_MINOR_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("write_krb5info_file failed, authentication might fail.\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EOK;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainendone:
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Error: [%s]\n", strerror(ret)));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(tmp_ctx);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstatic errno_t
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_set_ad_id_options(struct ad_options *ad_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct sdap_options *id_opts)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen errno_t ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen char *krb5_realm;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen char *keytab_path;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* We only support Kerberos password policy with AD, so
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen * force that on.
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_opt_set_string(id_opts->basic,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_PWD_POLICY,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen PWD_POL_OPT_MIT);
b6dff2ba7a4640c1c4fa8fcad5602d236c31a2e4Timo Sirainen if (ret != EOK) {
b6dff2ba7a4640c1c4fa8fcad5602d236c31a2e4Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, ("Could not set password policy\n"));
b6dff2ba7a4640c1c4fa8fcad5602d236c31a2e4Timo Sirainen goto done;
b6dff2ba7a4640c1c4fa8fcad5602d236c31a2e4Timo Sirainen }
b6dff2ba7a4640c1c4fa8fcad5602d236c31a2e4Timo Sirainen
b6dff2ba7a4640c1c4fa8fcad5602d236c31a2e4Timo Sirainen /* Set the Kerberos Realm for GSSAPI */
b6dff2ba7a4640c1c4fa8fcad5602d236c31a2e4Timo Sirainen krb5_realm = dp_opt_get_string(ad_opts->basic, AD_KRB5_REALM);
b6dff2ba7a4640c1c4fa8fcad5602d236c31a2e4Timo Sirainen if (!krb5_realm) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Should be impossible, this is set in ad_get_common_options() */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, ("No Kerberos realm\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EINVAL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_opt_set_string(id_opts->basic, SDAP_KRB5_REALM, krb5_realm);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Option %s set to %s\n",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen id_opts->basic[SDAP_KRB5_REALM].opt_name,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen krb5_realm));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen keytab_path = dp_opt_get_string(ad_opts->basic, AD_KEYTAB);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (keytab_path) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_opt_set_string(id_opts->basic, SDAP_KRB5_KEYTAB,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen keytab_path);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Option %s set to %s\n",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen id_opts->basic[SDAP_KRB5_KEYTAB].opt_name,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen keytab_path));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_set_sasl_options(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen dp_opt_get_string(ad_opts->basic,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen AD_HOSTNAME),
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen dp_opt_get_string(ad_opts->basic,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen AD_KRB5_REALM),
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen keytab_path);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("Cannot set the SASL-related options\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* fix schema to AD */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen id_opts->schema_type = SDAP_SCHEMA_AD;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_opts->id = id_opts;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EOK;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainendone:
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenerrno_t
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_get_id_options(struct ad_options *ad_opts,
b6dff2ba7a4640c1c4fa8fcad5602d236c31a2e4Timo Sirainen struct confdb_ctx *cdb,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *conf_path,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct sdap_options **_opts)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct sdap_options *id_opts;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen errno_t ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ad_create_sdap_options(ad_opts, cdb, conf_path, &id_opts);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ad_set_ad_id_options(ad_opts, id_opts);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(id_opts);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_domain_add(id_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_opts->id_ctx->sdap_id_ctx->be->domain,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen NULL);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(id_opts);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Set up search bases if they were assigned explicitly */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = ad_set_search_bases(id_opts);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(id_opts);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen *_opts = id_opts;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return EOK;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenerrno_t
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_set_search_bases(struct sdap_options *id_opts)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen errno_t ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen char *default_search_base;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen size_t o;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const int search_base_options[] = { SDAP_USER_SEARCH_BASE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_GROUP_SEARCH_BASE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_NETGROUP_SEARCH_BASE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_SERVICE_SEARCH_BASE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen -1 };
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* AD servers provide defaultNamingContext, so we will
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen * rely on that to specify the search base unless it has
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen * been specifically overridden.
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen default_search_base =
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen dp_opt_get_string(id_opts->basic, SDAP_SEARCH_BASE);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (default_search_base) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* set search bases if they are not */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen for (o = 0; search_base_options[o] != -1; o++) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (NULL == dp_opt_get_string(id_opts->basic,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen search_base_options[o])) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_opt_set_string(id_opts->basic,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen search_base_options[o],
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen default_search_base);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Option %s set to %s\n",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen id_opts->basic[search_base_options[o]].opt_name,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen dp_opt_get_string(id_opts->basic,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen search_base_options[o])));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen } else {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Search base not set. SSSD will attempt to discover it later, "
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen "when connecting to the LDAP server.\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Default search */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_parse_search_base(id_opts, id_opts->basic,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_SEARCH_BASE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->sdom->search_bases);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK && ret != ENOENT) goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* User search */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_parse_search_base(id_opts, id_opts->basic,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_USER_SEARCH_BASE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->sdom->user_search_bases);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK && ret != ENOENT) goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Group search base */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_parse_search_base(id_opts, id_opts->basic,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_GROUP_SEARCH_BASE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->sdom->group_search_bases);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK && ret != ENOENT) goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Netgroup search */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_parse_search_base(id_opts, id_opts->basic,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_NETGROUP_SEARCH_BASE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->sdom->netgroup_search_bases);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK && ret != ENOENT) goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Service search */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = sdap_parse_search_base(id_opts, id_opts->basic,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen SDAP_SERVICE_SEARCH_BASE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &id_opts->sdom->service_search_bases);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK && ret != ENOENT) goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EOK;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainendone:
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenerrno_t
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_get_auth_options(TALLOC_CTX *mem_ctx,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct ad_options *ad_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct be_ctx *bectx,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct dp_option **_opts)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen errno_t ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct dp_option *krb5_options;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *ad_servers;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen const char *krb5_realm;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen TALLOC_CTX *tmp_ctx = talloc_new(NULL);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!tmp_ctx) return ENOMEM;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Get krb5 options */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_get_options(tmp_ctx, bectx->cdb, bectx->conf_path,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_def_krb5_opts, KRB5_OPTS,
b1e7bc754b8be7974aea48cb97c5ce866f9b2029Timo Sirainen &krb5_options);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Could not read Kerberos options from the configuration\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen ad_servers = dp_opt_get_string(ad_opts->basic, AD_SERVER);
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen /* Force the krb5_servers to match the ad_servers */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_opt_set_string(krb5_options, KRB5_KDC, ad_servers);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Option %s set to %s\n",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen krb5_options[KRB5_KDC].opt_name,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_servers));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Set krb5 realm */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Set the Kerberos Realm for GSSAPI */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen krb5_realm = dp_opt_get_string(ad_opts->basic, AD_KRB5_REALM);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (!krb5_realm) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Should be impossible, this is set in ad_get_common_options() */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, ("No Kerberos realm\n"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EINVAL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Force the kerberos realm to match the AD_KRB5_REALM (which may have
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen * been upper-cased in ad_common_options()
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = dp_opt_set_string(krb5_options, KRB5_REALM, krb5_realm);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) goto done;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Option %s set to %s\n",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen krb5_options[KRB5_REALM].opt_name,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen krb5_realm));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen /* Set flag that controls whether we want to write the
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen * kdcinfo files at all
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen */
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_opts->service->krb5_service->write_kdcinfo = \
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen dp_opt_get_bool(krb5_options, KRB5_USE_KDCINFO);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_CONF_SETTINGS, ("Option %s set to %s\n",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen krb5_options[KRB5_USE_KDCINFO].opt_name,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_opts->service->krb5_service->write_kdcinfo ? "true" : "false"));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen *_opts = talloc_steal(mem_ctx, krb5_options);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = EOK;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainendone:
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(tmp_ctx);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenerrno_t ad_get_dyndns_options(struct be_ctx *be_ctx,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct ad_options *ad_opts)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen errno_t ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret = be_nsupdate_init(ad_opts, be_ctx, ad_dyndns_opts,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen &ad_opts->dyndns_ctx);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ret != EOK) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen DEBUG(SSSDBG_OP_FAILURE,
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ("Cannot initialize AD dyndns opts [%d]: %s\n",
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ret, sss_strerror(ret)));
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ret;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return EOK;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenstruct ad_id_ctx *
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainenad_id_ctx_init(struct ad_options *ad_opts, struct be_ctx *bectx)
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen{
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct sdap_id_ctx *sdap_ctx;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen struct ad_id_ctx *ad_ctx;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_ctx = talloc_zero(ad_opts, struct ad_id_ctx);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ad_ctx == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return NULL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_ctx->ad_options = ad_opts;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen sdap_ctx = sdap_id_ctx_new(ad_ctx, bectx, ad_opts->service->sdap);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (sdap_ctx == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(ad_ctx);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return NULL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_ctx->sdap_id_ctx = sdap_ctx;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_ctx->ldap_ctx = sdap_ctx->conn;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen ad_ctx->gc_ctx = sdap_id_ctx_conn_add(sdap_ctx, ad_opts->service->gc);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen if (ad_ctx->gc_ctx == NULL) {
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen talloc_free(ad_ctx);
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return NULL;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen }
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen return ad_ctx;
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen}
a914bff43644dd9b3977244203839ca74161e40cTimo Sirainen