domain_info_utils.c revision 58dd26b1c5b60ee992dd5d1214bb168aebb42d54
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny/*
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny Authors:
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny Sumit Bose <sbose@redhat.com>
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny Copyright (C) 2012 Red Hat
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny This program is free software; you can redistribute it and/or modify
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny it under the terms of the GNU General Public License as published by
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny the Free Software Foundation; either version 3 of the License, or
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny (at your option) any later version.
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny This program is distributed in the hope that it will be useful,
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny but WITHOUT ANY WARRANTY; without even the implied warranty of
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny GNU General Public License for more details.
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny You should have received a copy of the GNU General Public License
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny along with this program. If not, see <http://www.gnu.org/licenses/>.
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny*/
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek#include <utime.h>
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny#include "confdb/confdb.h"
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny#include "db/sysdb.h"
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny#include "util/util.h"
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek/* the directory domain - realm mappings are written to */
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek#define KRB5_MAPPING_DIR PUBCONF_PATH"/krb5.include.d"
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
0232747f04b650796db56fd7b487aee8a96fab03Simo Sorcestruct sss_domain_info *get_next_domain(struct sss_domain_info *domain,
0232747f04b650796db56fd7b487aee8a96fab03Simo Sorce bool descend)
0232747f04b650796db56fd7b487aee8a96fab03Simo Sorce{
0232747f04b650796db56fd7b487aee8a96fab03Simo Sorce struct sss_domain_info *dom;
0232747f04b650796db56fd7b487aee8a96fab03Simo Sorce
0232747f04b650796db56fd7b487aee8a96fab03Simo Sorce dom = domain;
1f800ebb0f190854b8296146174f3d696a426333Simo Sorce while (dom) {
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce if (descend && dom->subdomains) {
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce dom = dom->subdomains;
1f800ebb0f190854b8296146174f3d696a426333Simo Sorce } else if (dom->next) {
1f800ebb0f190854b8296146174f3d696a426333Simo Sorce dom = dom->next;
07b92f78d1751d8a2a538a440e1fdb24c59021e0Pavel Březina } else if (descend && IS_SUBDOMAIN(dom) && dom->parent->next) {
1f800ebb0f190854b8296146174f3d696a426333Simo Sorce dom = dom->parent->next;
1f800ebb0f190854b8296146174f3d696a426333Simo Sorce } else {
850ca620611f65115ee95e1d919be8443f95c14cLukas Slebodnik dom = NULL;
1f800ebb0f190854b8296146174f3d696a426333Simo Sorce }
850ca620611f65115ee95e1d919be8443f95c14cLukas Slebodnik if (dom && !dom->disabled) break;
0232747f04b650796db56fd7b487aee8a96fab03Simo Sorce }
1f800ebb0f190854b8296146174f3d696a426333Simo Sorce
0232747f04b650796db56fd7b487aee8a96fab03Simo Sorce return dom;
0232747f04b650796db56fd7b487aee8a96fab03Simo Sorce}
0232747f04b650796db56fd7b487aee8a96fab03Simo Sorce
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorcestruct sss_domain_info *find_subdomain_by_name(struct sss_domain_info *domain,
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce const char *name,
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce bool match_any)
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce{
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce struct sss_domain_info *dom = domain;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce while (dom && dom->disabled) {
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce dom = get_next_domain(dom, true);
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce }
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce while (dom) {
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce if (strcasecmp(dom->name, name) == 0 ||
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce ((match_any == true) && (dom->flat_name != NULL) &&
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce (strcasecmp(dom->flat_name, name) == 0))) {
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce return dom;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce }
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce dom = get_next_domain(dom, true);
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce }
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce return NULL;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce}
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zelenystruct sss_domain_info *new_subdomain(TALLOC_CTX *mem_ctx,
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny struct sss_domain_info *parent,
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny const char *name,
b8dcd1216e5ea7065213c750a92dabfe01fa3b70Simo Sorce const char *realm,
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny const char *flat_name,
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny const char *id)
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny{
f91e4aacb78d33791efcd744000597d5254dac4bSimo Sorce struct sss_domain_info *dom;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce DEBUG(SSSDBG_TRACE_FUNC,
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ("Creating [%s] as subdomain of [%s]!\n", name, parent->name));
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom = talloc_zero(mem_ctx, struct sss_domain_info);
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny if (dom == NULL) {
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("talloc_zero failed.\n"));
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny return NULL;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny }
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->parent = parent;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->name = talloc_strdup(dom, name);
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny if (dom->name == NULL) {
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("Failed to copy domain name.\n"));
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny goto fail;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny }
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->provider = talloc_strdup(dom, parent->provider);
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny if (dom->provider == NULL) {
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("Failed to copy provider name.\n"));
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny goto fail;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny }
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
d3f2fd9cb21cc10dce663a2f7d0deda07074e44eJan Zeleny dom->conn_name = talloc_strdup(dom, parent->conn_name);
d3f2fd9cb21cc10dce663a2f7d0deda07074e44eJan Zeleny if (dom->conn_name == NULL) {
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("Failed to copy connection name.\n"));
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny goto fail;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny }
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
b8dcd1216e5ea7065213c750a92dabfe01fa3b70Simo Sorce if (realm != NULL) {
b8dcd1216e5ea7065213c750a92dabfe01fa3b70Simo Sorce dom->realm = talloc_strdup(dom, realm);
b8dcd1216e5ea7065213c750a92dabfe01fa3b70Simo Sorce if (dom->realm == NULL) {
b8dcd1216e5ea7065213c750a92dabfe01fa3b70Simo Sorce DEBUG(SSSDBG_OP_FAILURE, ("Failed to copy realm name.\n"));
b8dcd1216e5ea7065213c750a92dabfe01fa3b70Simo Sorce goto fail;
b8dcd1216e5ea7065213c750a92dabfe01fa3b70Simo Sorce }
b8dcd1216e5ea7065213c750a92dabfe01fa3b70Simo Sorce }
b8dcd1216e5ea7065213c750a92dabfe01fa3b70Simo Sorce
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny if (flat_name != NULL) {
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->flat_name = talloc_strdup(dom, flat_name);
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny if (dom->flat_name == NULL) {
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("Failed to copy flat name.\n"));
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny goto fail;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny }
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny }
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny if (id != NULL) {
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->domain_id = talloc_strdup(dom, id);
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny if (dom->domain_id == NULL) {
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("Failed to copy id.\n"));
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny goto fail;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny }
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny }
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->enumerate = false;
58fd3aa25c5292bc67432647ab7e5059439fcc6dSimo Sorce dom->fqnames = true;
c14184c07634801cda7864aa17c6fa8dc9ab43d1Simo Sorce dom->mpg = true;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny /* FIXME: get ranges from the server */
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->id_min = 0;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->id_max = 0xffffffff;
bf8cce77a35cb0a3cdb0d21fb9c39b7b6372bc11Jan Zeleny dom->pwd_expiration_warning = parent->pwd_expiration_warning;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->cache_credentials = parent->cache_credentials;
ac7a7ee3d1e138818a1ed78758f7dd3c3306a56bSumit Bose dom->case_sensitive = false;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->user_timeout = parent->user_timeout;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->group_timeout = parent->group_timeout;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->netgroup_timeout = parent->netgroup_timeout;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->service_timeout = parent->service_timeout;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny dom->override_homedir = parent->override_homedir;
3c60433641ce2e86b9b04778c8f8652ef0d097e4Stef Walter dom->names = parent->names;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
8ccb0de226ccb9330f5a6865de487d6f0313902dJan Zeleny dom->subdomain_homedir = parent->subdomain_homedir;
8ccb0de226ccb9330f5a6865de487d6f0313902dJan Zeleny
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny if (parent->sysdb == NULL) {
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("Missing sysdb context in parent domain.\n"));
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny goto fail;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny }
f91e4aacb78d33791efcd744000597d5254dac4bSimo Sorce dom->sysdb = parent->sysdb;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny return dom;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zelenyfail:
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny talloc_free(dom);
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny return NULL;
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny}
20d0bc6d587f346238062df4da5edfde815e59b1Jan Zeleny
234958be042980242fff6da936af674da877c5efSimo Sorceerrno_t sssd_domain_init(TALLOC_CTX *mem_ctx,
234958be042980242fff6da936af674da877c5efSimo Sorce struct confdb_ctx *cdb,
234958be042980242fff6da936af674da877c5efSimo Sorce const char *domain_name,
234958be042980242fff6da936af674da877c5efSimo Sorce const char *db_path,
234958be042980242fff6da936af674da877c5efSimo Sorce struct sss_domain_info **_domain)
234958be042980242fff6da936af674da877c5efSimo Sorce{
234958be042980242fff6da936af674da877c5efSimo Sorce int ret;
234958be042980242fff6da936af674da877c5efSimo Sorce struct sss_domain_info *dom;
234958be042980242fff6da936af674da877c5efSimo Sorce struct sysdb_ctx *sysdb;
234958be042980242fff6da936af674da877c5efSimo Sorce
234958be042980242fff6da936af674da877c5efSimo Sorce ret = confdb_get_domain(cdb, domain_name, &dom);
234958be042980242fff6da936af674da877c5efSimo Sorce if (ret != EOK) {
234958be042980242fff6da936af674da877c5efSimo Sorce DEBUG(SSSDBG_OP_FAILURE, ("Error retrieving domain configuration.\n"));
234958be042980242fff6da936af674da877c5efSimo Sorce return ret;
234958be042980242fff6da936af674da877c5efSimo Sorce }
234958be042980242fff6da936af674da877c5efSimo Sorce
234958be042980242fff6da936af674da877c5efSimo Sorce if (dom->sysdb != NULL) {
234958be042980242fff6da936af674da877c5efSimo Sorce DEBUG(SSSDBG_OP_FAILURE, ("Sysdb context already initialized.\n"));
234958be042980242fff6da936af674da877c5efSimo Sorce return EEXIST;
234958be042980242fff6da936af674da877c5efSimo Sorce }
234958be042980242fff6da936af674da877c5efSimo Sorce
234958be042980242fff6da936af674da877c5efSimo Sorce ret = sysdb_domain_init(mem_ctx, dom, db_path, &sysdb);
234958be042980242fff6da936af674da877c5efSimo Sorce if (ret != EOK) {
234958be042980242fff6da936af674da877c5efSimo Sorce DEBUG(SSSDBG_OP_FAILURE, ("Error opening cache database.\n"));
234958be042980242fff6da936af674da877c5efSimo Sorce return ret;
234958be042980242fff6da936af674da877c5efSimo Sorce }
234958be042980242fff6da936af674da877c5efSimo Sorce
234958be042980242fff6da936af674da877c5efSimo Sorce dom->sysdb = talloc_steal(dom, sysdb);
234958be042980242fff6da936af674da877c5efSimo Sorce
234958be042980242fff6da936af674da877c5efSimo Sorce *_domain = dom;
234958be042980242fff6da936af674da877c5efSimo Sorce
234958be042980242fff6da936af674da877c5efSimo Sorce return EOK;
234958be042980242fff6da936af674da877c5efSimo Sorce}
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozekstatic errno_t
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozeksss_krb5_touch_config(void)
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek{
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek const char *config = NULL;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek errno_t ret;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek config = getenv("KRB5_CONFIG");
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (config == NULL) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek config = KRB5_CONF_PATH;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = utime(config, NULL);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (ret == -1) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = errno;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("Unable to change mtime of \"%s\" "
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek "[%d]: %s\n", config, strerror(ret)));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek return ret;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek return EOK;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek}
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozekerrno_t
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozeksss_write_domain_mappings(struct sss_domain_info *domain)
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek{
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek struct sss_domain_info *dom;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek errno_t ret;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek errno_t err;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek TALLOC_CTX *tmp_ctx;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek const char *mapping_file;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek char *sanitized_domain;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek char *tmp_file = NULL;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek int fd = -1;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek mode_t old_mode;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek FILE *fstream = NULL;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek int i;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (domain == NULL || domain->name == NULL) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("No domain name provided\n"));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek return EINVAL;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek tmp_ctx = talloc_new(NULL);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (!tmp_ctx) return ENOMEM;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek sanitized_domain = talloc_strdup(tmp_ctx, domain->name);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (sanitized_domain == NULL) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("talloc_strdup() failed\n"));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek return ENOMEM;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek /* only alpha-numeric chars, dashes and underscores are allowed in
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek * krb5 include directory */
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek for (i = 0; sanitized_domain[i] != '\0'; i++) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (!isalnum(sanitized_domain[i])
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek && sanitized_domain[i] != '-' && sanitized_domain[i] != '_') {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek sanitized_domain[i] = '_';
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek mapping_file = talloc_asprintf(tmp_ctx, "%s/domain_realm_%s",
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek KRB5_MAPPING_DIR, sanitized_domain);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (!mapping_file) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = ENOMEM;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek goto done;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_FUNC_DATA, ("Mapping file for domain [%s] is [%s]\n",
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek domain->name, mapping_file));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek tmp_file = talloc_asprintf(tmp_ctx, "%sXXXXXX", mapping_file);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (tmp_file == NULL) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = ENOMEM;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek goto done;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek old_mode = umask(077);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek fd = mkstemp(tmp_file);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek umask(old_mode);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (fd < 0) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("creating the temp file [%s] for domain-realm "
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek "mappings failed.", tmp_file));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = EIO;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek talloc_zfree(tmp_ctx);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek goto done;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek fstream = fdopen(fd, "a");
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (!fstream) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = errno;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("fdopen failed [%d]: %s\n",
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret, strerror(ret)));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = close(fd);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (ret != 0) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = errno;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ("fclose failed [%d][%s].\n", ret, strerror(ret)));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek /* Nothing to do here, just report the failure */
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = EIO;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek goto done;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = fprintf(fstream, "[domain_realm]\n");
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (ret < 0) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("fprintf failed\n"));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = EIO;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek goto done;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek for (dom = get_next_domain(domain, true);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek dom && IS_SUBDOMAIN(dom); /* if we get back to a parent, stop */
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek dom = get_next_domain(dom, false)) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = fprintf(fstream, ".%s = %s\n%s = %s\n",
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek dom->name, dom->realm, dom->name, dom->realm);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (ret < 0) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("fprintf failed\n"));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek goto done;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = fclose(fstream);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek fstream = NULL;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (ret != 0) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = errno;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ("fclose failed [%d][%s].\n", ret, strerror(ret)));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek goto done;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = rename(tmp_file, mapping_file);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (ret == -1) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = errno;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ("rename failed [%d][%s].\n", ret, strerror(ret)));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek goto done;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek talloc_zfree(tmp_file);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = chmod(mapping_file, 0644);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (ret == -1) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = errno;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ("fchmod failed [%d][%s].\n", ret, strerror(ret)));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek goto done;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ret = EOK;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozekdone:
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek err = sss_krb5_touch_config();
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (err != EOK) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("Unable to change last modification time "
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek "of krb5.conf. Created mappings may not be loaded.\n"));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek /* Ignore */
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (fstream) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek err = fclose(fstream);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (err != 0) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek err = errno;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ("fclose failed [%d][%s].\n", err, strerror(err)));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek /* Nothing to do here, just report the failure */
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (tmp_file) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek err = unlink(tmp_file);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek if (err < 0) {
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek err = errno;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek ("Could not remove file [%s]: [%d]: %s",
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek tmp_file, err, strerror(err)));
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek }
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek talloc_free(tmp_ctx);
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek return ret;
58dd26b1c5b60ee992dd5d1214bb168aebb42d54Jakub Hrozek}