ad_common.c revision 0051296f67bd7d8e2e3094638ddff4e641324d04
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina Stephen Gallagher <sgallagh@redhat.com>
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina Copyright (C) 2012 Red Hat
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina This program is free software; you can redistribute it and/or modify
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina it under the terms of the GNU General Public License as published by
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina the Free Software Foundation; either version 3 of the License, or
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina (at your option) any later version.
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina This program is distributed in the hope that it will be useful,
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina GNU General Public License for more details.
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina You should have received a copy of the GNU General Public License
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina opts = talloc_zero(mem_ctx, struct ad_options);
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina /* If the AD domain name wasn't explicitly set, assume that it
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina * matches the SSSD domain name
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina domain = dp_opt_get_string(opts->basic, AD_DOMAIN);
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina ret = dp_opt_set_string(opts->basic, AD_DOMAIN, dom->name);
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce /* Did we get an explicit server name, or are we discovering it? */
044868b388b4e47499f12a9105310b247bbe1ce2Simo Sorce server = dp_opt_get_string(opts->basic, AD_SERVER);
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina ("No AD server set, will use service discovery!\n"));
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina /* Set the machine's hostname to the local host name if it
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina * wasn't explicitly specified.
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina ad_hostname = dp_opt_get_string(opts->basic, AD_HOSTNAME);
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce ("gethostname failed [%s].\n",
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina ("Setting ad_hostname to [%s].\n", hostname));
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina ret = dp_opt_set_string(opts->basic, AD_HOSTNAME, hostname);
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina ("Setting ad_hostname failed [%s].\n",
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina /* Always use the upper-case AD domain for the kerberos realm */
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce ret = dp_opt_set_string(opts->basic, AD_KRB5_REALM, realm);
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce /* Active Directory is always case-insensitive */
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce /* Set this in the confdb so that the responders pick it
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce * up when they start up.
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce ret = confdb_set_bool(cdb, conf_path, "case_sensitive",
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce ("Could not set domain case-sensitive: [%s]\n",
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce ("Setting domain case-insensitive\n"));
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březinaad_resolve_callback(void *private_data, struct fo_server *server);
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce /* Split the server list */
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce ret = split_on_separator(tmp_ctx, servers, ',', true, &list, NULL);
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to parse server list!\n"));
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce ad_domain = dp_opt_get_string(options->basic, AD_DOMAIN);
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce /* Add each of these servers to the failover service */
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce for (i = 0; list[i]; i++) {
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina ("Failed to add server [%s] to failover service: "
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina "SRV resolution only allowed for primary servers!\n",
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina ret = be_fo_add_srv_server(bectx, AD_SERVICE_NAME, "ldap",
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina ("Failed to add service discovery to failover: [%s]",
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina DEBUG(SSSDBG_CONF_SETTINGS, ("Added service discovery for AD\n"));
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina ret = be_fo_add_server(bectx, AD_SERVICE_NAME, list[i], 0, NULL, primary);
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add server\n"));
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina DEBUG(SSSDBG_CONF_SETTINGS, ("Added failover server %s\n", list[i]));
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březinastatic int ad_user_data_cmp(void *ud1, void *ud2)
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březinaad_failover_init(TALLOC_CTX *mem_ctx, struct be_ctx *bectx,
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina service = talloc_zero(tmp_ctx, struct ad_service);
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina service->sdap = talloc_zero(service, struct sdap_service);
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce service->krb5_service = talloc_zero(service, struct krb5_service);
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce ret = be_fo_add_service(bectx, AD_SERVICE_NAME, ad_user_data_cmp);
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to create failover service!\n"));
044868b388b4e47499f12a9105310b247bbe1ce2Simo Sorce service->sdap->name = talloc_strdup(service, AD_SERVICE_NAME);
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce service->krb5_service->name = talloc_strdup(service, AD_SERVICE_NAME);
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina service->sdap->kinit_service_name = service->krb5_service->name;
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina realm = dp_opt_get_string(options->basic, AD_KRB5_REALM);
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, ("No Kerberos realm set\n"));
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce ("No primary servers defined but backup are present, "
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce "setting backup servers as primary\n"));
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce ("No primary or backup servers defined but backup are present, "
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce "setting backup servers as primary\n"));
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce ret = ad_servers_init(mem_ctx, bectx, primary_servers, options, true);
4c2cf6607ddc82c5061d805c11e163de4bc1bd82Simo Sorce ret = ad_servers_init(mem_ctx, bectx, backup_servers, options, false);
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina ret = be_fo_service_add_callback(mem_ctx, bectx, AD_SERVICE_NAME,
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březina ("Failed to add failover callback! [%s]\n", strerror(ret)));
41be4e3976cf66823ad2c6880671ac7fbafdc640Pavel Březinaad_resolve_callback(void *private_data, struct fo_server *server)
char *address;
const char *safe_address;
char *new_uri;
const char *srv_name;
if (!tmp_ctx) {
if (!service) {
goto done;
if (!srvaddr) {
goto done;
goto done;
goto done;
goto done;
if (!new_uri) {
goto done;
address);
goto done;
done:
const char *conf_path,
char *krb5_realm;
char *sasl_primary;
char *desired_primary;
char *sasl_realm;
char *desired_realm;
char *keytab_path;
bool primary_requested = true;
bool realm_requested = true;
if (!id_opts) {
goto done;
goto done;
goto done;
if (!krb5_realm) {
goto done;
krb5_realm));
if (!desired_primary) {
primary_requested = false;
if (!desired_realm) {
realm_requested = false;
if (keytab_path) {
keytab_path));
goto done;
sasl_primary));
sasl_realm));
goto done;
goto done;
goto done;
goto done;
goto done;
done:
return ret;
char *default_search_base;
size_t o;
if (default_search_base) {
search_base_options[o])) {
goto done;
search_base_options[o])));
done:
return ret;
const char *ad_servers;
const char *krb5_realm;
&krb5_options);
goto done;
ad_servers));
if (!krb5_realm) {
goto done;
krb5_realm));
done:
return ret;