ipa_common.c revision db15d9fc8252f05d705083b4798a492566284293
5ab2ee0b9b7ad3867fcfd2a31fda0790370fbbbdTimo Sirainen IPA Provider Common Functions
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen Simo Sorce <ssorce@redhat.com>
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen Copyright (C) 2009 Red Hat
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen This program is free software; you can redistribute it and/or modify
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen it under the terms of the GNU General Public License as published by
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen the Free Software Foundation; either version 3 of the License, or
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen (at your option) any later version.
06b0c3be9905099038964b068216bbed155701deTimo Sirainen This program is distributed in the hope that it will be useful,
06b0c3be9905099038964b068216bbed155701deTimo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen GNU General Public License for more details.
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen You should have received a copy of the GNU General Public License
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen opts = talloc_zero(memctx, struct ipa_options);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen domain = dp_opt_get_string(opts->basic, IPA_DOMAIN);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen ret = dp_opt_set_string(opts->basic, IPA_DOMAIN, dom->name);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen server = dp_opt_get_string(opts->basic, IPA_SERVER);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen DEBUG(1, ("No ipa server set, will use service discovery!\n"));
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen ipa_hostname = dp_opt_get_string(opts->basic, IPA_HOSTNAME);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen DEBUG(1, ("gethostname failed [%d][%s].\n", errno,
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen DEBUG(9, ("Setting ipa_hostname to [%s].\n", hostname));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = dp_opt_set_string(opts->basic, IPA_HOSTNAME, hostname);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* First check whether the realm has been manually specified */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen realm = dp_opt_get_string(opts->basic, IPA_KRB5_REALM);
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen /* No explicit krb5_realm, use the IPA domain, transform to upper-case */
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen ret = dp_opt_set_string(opts->basic, IPA_KRB5_REALM,
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainenstatic errno_t ipa_parse_search_base(TALLOC_CTX *mem_ctx,
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen /* Non-fatal */
a0b89f3b1df99b3a32f44623f13ad1893118825bTimo Sirainen unparsed_base = dp_opt_get_string(opts, class);
a0b89f3b1df99b3a32f44623f13ad1893118825bTimo Sirainen if (!unparsed_base || unparsed_base[0] == '\0') return ENOENT;
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen return common_parse_search_base(mem_ctx, unparsed_base,
5ab2ee0b9b7ad3867fcfd2a31fda0790370fbbbdTimo Sirainenint ipa_get_id_options(struct ipa_options *ipa_opts,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ipa_opts->id = talloc_zero(ipa_opts, struct sdap_options);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* get sdap options */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = dp_get_options(ipa_opts->id, cdb, conf_path,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen dp_opt_get_string(ipa_opts->basic, IPA_KRB5_REALM),
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (NULL == dp_opt_get_string(ipa_opts->id->basic, SDAP_SEARCH_BASE)) {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* FIXME: get values by querying IPA */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* set search base */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen value = talloc_asprintf(tmpctx, "cn=accounts,%s", basedn);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ipa_opts->id->basic[SDAP_SEARCH_BASE].opt_name,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen dp_opt_get_string(ipa_opts->id->basic, SDAP_SEARCH_BASE)));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = sdap_parse_search_base(ipa_opts->id, ipa_opts->id->basic,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* set krb realm */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (NULL == dp_opt_get_string(ipa_opts->id->basic, SDAP_KRB5_REALM)) {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen realm = dp_opt_get_string(ipa_opts->basic, IPA_KRB5_REALM);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ipa_opts->id->basic[SDAP_KRB5_REALM].opt_name,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen dp_opt_get_string(ipa_opts->id->basic, SDAP_KRB5_REALM)));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("Cannot set the SASL-related options\n"));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* fix schema to IPAv1 for now */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ipa_opts->id->schema_type = SDAP_SCHEMA_IPA_V1;
5ab2ee0b9b7ad3867fcfd2a31fda0790370fbbbdTimo Sirainen /* set user/group search bases if they are not specified */
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen if (NULL == dp_opt_get_string(ipa_opts->id->basic,
5ab2ee0b9b7ad3867fcfd2a31fda0790370fbbbdTimo Sirainen ret = dp_opt_set_string(ipa_opts->id->basic, SDAP_USER_SEARCH_BASE,
ccffb125d94adff0ad776de5a96e22f864d6fb0aTimo Sirainen ipa_opts->id->basic[SDAP_USER_SEARCH_BASE].opt_name,
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen ret = sdap_parse_search_base(ipa_opts->id, ipa_opts->id->basic,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (NULL == dp_opt_get_string(ipa_opts->id->basic,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = dp_opt_set_string(ipa_opts->id->basic, SDAP_GROUP_SEARCH_BASE,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ipa_opts->id->basic[SDAP_GROUP_SEARCH_BASE].opt_name,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = sdap_parse_search_base(ipa_opts->id, ipa_opts->id->basic,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (NULL == dp_opt_get_string(ipa_opts->id->basic,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = dp_opt_set_string(ipa_opts->id->basic, SDAP_SUDO_SEARCH_BASE,
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen /* We don't yet have support for the representation
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen * of sudo in IPA. For now, we need to point at the
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen * compat tree
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen value = talloc_asprintf(tmpctx, "ou=SUDOers,%s", basedn);
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen ipa_opts->id->basic[SDAP_SUDO_SEARCH_BASE].opt_name,
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen ret = sdap_parse_search_base(ipa_opts->id, ipa_opts->id->basic,
5ab2ee0b9b7ad3867fcfd2a31fda0790370fbbbdTimo Sirainen if (NULL == dp_opt_get_string(ipa_opts->id->basic,
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen value = talloc_asprintf(tmpctx, "cn=ng,cn=alt,%s", basedn);
6bca3405636e3ec95724350c3a10d6fcb737782aTimo Sirainen ret = dp_opt_set_string(ipa_opts->id->basic, SDAP_NETGROUP_SEARCH_BASE,
24ce0c343cefe54af841871fa39dbc3464028b06Timo Sirainen ipa_opts->id->basic[SDAP_NETGROUP_SEARCH_BASE].opt_name,
c95fc202215d2451372599db7092b16459f360a3Timo Sirainen ret = sdap_parse_search_base(ipa_opts->id, ipa_opts->id->basic,
c95fc202215d2451372599db7092b16459f360a3Timo Sirainen if (NULL == dp_opt_get_string(ipa_opts->basic,
c95fc202215d2451372599db7092b16459f360a3Timo Sirainen ret = dp_opt_set_string(ipa_opts->basic, IPA_HOST_SEARCH_BASE,
c95fc202215d2451372599db7092b16459f360a3Timo Sirainen DEBUG(SSSDBG_CONF_SETTINGS, ("Option %s set to %s\n",
c95fc202215d2451372599db7092b16459f360a3Timo Sirainen ipa_opts->basic[IPA_HOST_SEARCH_BASE].opt_name,
c95fc202215d2451372599db7092b16459f360a3Timo Sirainen ret = ipa_parse_search_base(ipa_opts->basic, ipa_opts->basic,
c95fc202215d2451372599db7092b16459f360a3Timo Sirainen if (NULL == dp_opt_get_string(ipa_opts->basic,
24ce0c343cefe54af841871fa39dbc3464028b06Timo Sirainen value = talloc_asprintf(tmpctx, "cn=hbac,%s", basedn);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = dp_opt_set_string(ipa_opts->basic, IPA_HBAC_SEARCH_BASE, value);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ipa_opts->basic[IPA_HBAC_SEARCH_BASE].opt_name,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen ret = ipa_parse_search_base(ipa_opts->basic, ipa_opts->basic,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen if (NULL == dp_opt_get_string(ipa_opts->basic,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen value = talloc_asprintf(tmpctx, "cn=selinux,%s", basedn);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = dp_opt_set_string(ipa_opts->basic, IPA_SELINUX_SEARCH_BASE, value);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen DEBUG(SSSDBG_CONF_SETTINGS, ("Option %s set to %s\n",
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen ipa_opts->basic[IPA_SELINUX_SEARCH_BASE].opt_name,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = ipa_parse_search_base(ipa_opts->basic, ipa_opts->basic,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen value = dp_opt_get_string(ipa_opts->id->basic, SDAP_DEREF);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen DEBUG(1, ("Failed to verify ldap_deref option.\n"));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (NULL == dp_opt_get_string(ipa_opts->id->basic,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen ret = dp_opt_set_string(ipa_opts->id->basic, SDAP_SERVICE_SEARCH_BASE,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen ipa_opts->id->basic[SDAP_GROUP_SEARCH_BASE].opt_name,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen ret = sdap_parse_search_base(ipa_opts->id, ipa_opts->id->basic,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (NULL == dp_opt_get_string(ipa_opts->basic,
fedb73c7e918653877286ede0fe18029b3cce7d3Timo Sirainen value = talloc_asprintf(tmpctx, "cn=trusts,%s", basedn);
a2550844936da8b78d7565b905a4dc5ffb3eef0eTimo Sirainen ret = dp_opt_set_string(ipa_opts->basic, IPA_SUBDOMAINS_SEARCH_BASE, value);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen DEBUG(SSSDBG_CONF_SETTINGS, ("Option %s set to %s\n",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ipa_opts->basic[IPA_SUBDOMAINS_SEARCH_BASE].opt_name,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = ipa_parse_search_base(ipa_opts, ipa_opts->basic,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (NULL == dp_opt_get_string(ipa_opts->basic,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen value = talloc_asprintf(tmpctx, "cn=ad,cn=etc,%s", basedn);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = dp_opt_set_string(ipa_opts->basic, IPA_MASTER_DOMAIN_SEARCH_BASE, value);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen DEBUG(SSSDBG_CONF_SETTINGS, ("Option %s set to %s\n",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ipa_opts->basic[IPA_MASTER_DOMAIN_SEARCH_BASE].opt_name,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = ipa_parse_search_base(ipa_opts, ipa_opts->basic,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (NULL == dp_opt_get_string(ipa_opts->basic,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen value = talloc_asprintf(tmpctx, "cn=ranges,cn=etc,%s", basedn);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = dp_opt_set_string(ipa_opts->basic, IPA_RANGES_SEARCH_BASE, value);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen DEBUG(SSSDBG_CONF_SETTINGS, ("Option %s set to %s\n",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ipa_opts->basic[IPA_RANGES_SEARCH_BASE].opt_name,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = ipa_parse_search_base(ipa_opts, ipa_opts->basic,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = sdap_get_map(ipa_opts->id, cdb, conf_path,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainenint ipa_get_auth_options(struct ipa_options *ipa_opts,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen ipa_opts->auth = talloc_zero(ipa_opts, struct dp_option);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen /* get krb5 options */
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen ret = dp_get_options(ipa_opts, cdb, conf_path,
ccffb125d94adff0ad776de5a96e22f864d6fb0aTimo Sirainen /* If there is no KDC, try the deprecated krb5_kdcip option, too */
a0b89f3b1df99b3a32f44623f13ad1893118825bTimo Sirainen /* FIXME - this can be removed in a future version */
24ce0c343cefe54af841871fa39dbc3464028b06Timo Sirainen ret = krb5_try_kdcip(cdb, conf_path, ipa_opts->auth, KRB5_KDC);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen /* set krb realm */
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen if (NULL == dp_opt_get_string(ipa_opts->auth, KRB5_REALM)) {
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen value = dp_opt_get_string(ipa_opts->basic, IPA_KRB5_REALM);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ret = dp_opt_set_string(ipa_opts->auth, KRB5_REALM, copy);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen dp_opt_get_string(ipa_opts->auth, KRB5_REALM)));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void ipa_resolve_callback(void *private_data, struct fo_server *server)
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainen service = talloc_get_type(private_data, struct ipa_service);
if (!srvaddr) {
if (!new_uri) {
address);
const char *servers,
bool primary)
char *ipa_domain;
int ret = 0;
if (!tmp_ctx) {
return ENOMEM;
goto done;
for (i = 0; list[i]; i++) {
if (!primary) {
list[i]));
if (ret) {
goto done;
goto done;
goto done;
done:
return ret;
const char *primary_servers,
const char *backup_servers,
char *realm;
int ret;
if (!tmp_ctx) {
return ENOMEM;
if (!service) {
goto done;
goto done;
goto done;
goto done;
goto done;
goto done;
if (!realm) {
goto done;
goto done;
if (!primary_servers) {
goto done;
if (backup_servers) {
goto done;
goto done;
done:
return ret;
const char *conf_path,
char *basedn;
char *autofs_base;
if (!tmp_ctx) {
return ENOMEM;
&basedn);
goto done;
basedn);
if (!autofs_base) {
goto done;
goto done;
goto done;
goto done;
goto done;
done:
return ret;