sysdb_subdomains.c revision 65393a294e635822c1d7a15fe5853dc457ad8a2a
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny/*
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SSSD
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny System Database - Sub-domain related calls
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny Copyright (C) 2012 Jan Zeleny <jzeleny@redhat.com>
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny Copyright (C) 2012 Sumit Bose <sbose@redhat.com>
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny This program is free software; you can redistribute it and/or modify
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny it under the terms of the GNU General Public License as published by
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny the Free Software Foundation; either version 3 of the License, or
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny (at your option) any later version.
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny This program is distributed in the hope that it will be useful,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny but WITHOUT ANY WARRANTY; without even the implied warranty of
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny GNU General Public License for more details.
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny You should have received a copy of the GNU General Public License
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny along with this program. If not, see <http://www.gnu.org/licenses/>.
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny*/
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny#include "util/util.h"
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny#include "db/sysdb_private.h"
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorceerrno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx,
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny size_t *subdomain_count,
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce struct sss_domain_info ***subdomain_list)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny{
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny int i;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny errno_t ret;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny TALLOC_CTX *tmp_ctx;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct ldb_result *res;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *attrs[] = {"cn",
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce SYSDB_SUBDOMAIN_REALM,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SYSDB_SUBDOMAIN_FLAT,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SYSDB_SUBDOMAIN_ID,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny NULL};
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce struct sss_domain_info **list;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct ldb_dn *basedn;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny tmp_ctx = talloc_new(NULL);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (tmp_ctx == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce basedn = ldb_dn_new(tmp_ctx, domain->sysdb->ldb, SYSDB_BASE);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (basedn == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = EIO;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny basedn, LDB_SCOPE_ONELEVEL,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny attrs, "objectclass=%s", SYSDB_SUBDOMAIN_CLASS);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != LDB_SUCCESS) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = EIO;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce list = talloc_zero_array(tmp_ctx, struct sss_domain_info *,
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce res->count + 1);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (list == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny for (i = 0; i < res->count; i++) {
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce const char *name;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce const char *realm;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce const char *flat;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce const char *id;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce name = ldb_msg_find_attr_as_string(res->msgs[i], "cn", NULL);
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce if (name == NULL) {
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce DEBUG(SSSDBG_MINOR_FAILURE,
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce ("The object [%s] doesn't have a name\n",
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce ldb_dn_get_linearized(res->msgs[i]->dn)));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = EINVAL;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce realm = ldb_msg_find_attr_as_string(res->msgs[i],
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce SYSDB_SUBDOMAIN_REALM, NULL);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce flat = ldb_msg_find_attr_as_string(res->msgs[i],
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce SYSDB_SUBDOMAIN_FLAT, NULL);
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce id = ldb_msg_find_attr_as_string(res->msgs[i],
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce SYSDB_SUBDOMAIN_ID, NULL);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce list[i] = new_subdomain(list, domain, name, realm, flat, id);
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce if (list[i] == NULL) {
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = ENOMEM;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
6a8999bf933f72923a271831d85a01ef88a81f39Jakub Hrozek list[res->count] = NULL;
6a8999bf933f72923a271831d85a01ef88a81f39Jakub Hrozek
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny *subdomain_count = res->count;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny *subdomain_list = talloc_steal(mem_ctx, list);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = EOK;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenydone:
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny talloc_free(tmp_ctx);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return ret;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny}
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorceerrno_t sysdb_master_domain_update(struct sss_domain_info *domain)
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny{
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny errno_t ret;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny TALLOC_CTX *tmp_ctx;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny const char *tmp_str;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny struct ldb_dn *basedn;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny struct ldb_result *res;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny const char *attrs[] = {"cn",
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce SYSDB_SUBDOMAIN_REALM,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny SYSDB_SUBDOMAIN_FLAT,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny SYSDB_SUBDOMAIN_ID,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny NULL};
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny tmp_ctx = talloc_new(NULL);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (tmp_ctx == NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny return ENOMEM;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce SYSDB_DOM_BASE, domain->name);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (basedn == NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = EIO;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res,
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce basedn, LDB_SCOPE_BASE, attrs, NULL);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (ret != LDB_SUCCESS) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = EIO;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
cb388d52f49f54963379cc20a25e14d17fe6e9a3Simo Sorce if (res->count == 0) {
cb388d52f49f54963379cc20a25e14d17fe6e9a3Simo Sorce ret = ENOENT;
cb388d52f49f54963379cc20a25e14d17fe6e9a3Simo Sorce goto done;
cb388d52f49f54963379cc20a25e14d17fe6e9a3Simo Sorce }
cb388d52f49f54963379cc20a25e14d17fe6e9a3Simo Sorce
cb388d52f49f54963379cc20a25e14d17fe6e9a3Simo Sorce if (res->count > 1) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("Base search returned [%d] results, "
cb388d52f49f54963379cc20a25e14d17fe6e9a3Simo Sorce "expected 1.\n", res->count));
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = EINVAL;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_REALM,
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce NULL);
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce if (tmp_str != NULL &&
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce (domain->realm == NULL || strcasecmp(tmp_str, domain->realm) != 0)) {
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce talloc_free(domain->realm);
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce domain->realm = talloc_strdup(domain, tmp_str);
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce if (domain->realm == NULL) {
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = ENOMEM;
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce goto done;
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce }
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce }
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_FLAT,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny NULL);
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce if (tmp_str != NULL &&
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce (domain->flat_name == NULL ||
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce strcasecmp(tmp_str, domain->flat_name) != 0)) {
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce talloc_free(domain->flat_name);
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce domain->flat_name = talloc_strdup(domain, tmp_str);
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce if (domain->flat_name == NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = ENOMEM;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_ID,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny NULL);
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce if (tmp_str != NULL &&
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce (domain->domain_id == NULL ||
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce strcasecmp(tmp_str, domain->domain_id) != 0)) {
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce talloc_free(domain->domain_id);
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce domain->domain_id = talloc_strdup(domain, tmp_str);
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce if (domain->domain_id == NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = ENOMEM;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zelenydone:
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny talloc_free(tmp_ctx);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny return ret;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny}
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zelenyerrno_t sysdb_master_domain_add_info(struct sysdb_ctx *sysdb,
0754ff886f909f0404038eb9c99dd61be1acf5b9Simo Sorce struct sss_domain_info *domain,
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce struct sysdb_subdom *domain_info)
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny{
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny TALLOC_CTX *tmp_ctx;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny struct ldb_message *msg;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny int ret;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny bool do_update = false;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny tmp_ctx = talloc_new(NULL);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (tmp_ctx == NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny return ENOMEM;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce ret = sysdb_master_domain_update(domain);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (ret != EOK) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny msg = ldb_msg_new(tmp_ctx);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (msg == NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = ENOMEM;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
0754ff886f909f0404038eb9c99dd61be1acf5b9Simo Sorce msg->dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
0754ff886f909f0404038eb9c99dd61be1acf5b9Simo Sorce SYSDB_DOM_BASE, domain->name);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (msg->dn == NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = EIO;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce if (domain_info->realm != NULL &&
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce (domain->realm == NULL ||
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce strcmp(domain->realm, domain_info->realm) != 0) ) {
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_REALM,
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce LDB_FLAG_MOD_REPLACE, NULL);
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce if (ret != LDB_SUCCESS) {
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = sysdb_error_to_errno(ret);
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce goto done;
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce }
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_REALM,
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce domain_info->realm);
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce if (ret != LDB_SUCCESS) {
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = sysdb_error_to_errno(ret);
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce goto done;
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce }
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce do_update = true;
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce }
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (domain_info->flat_name != NULL &&
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce (domain->flat_name == NULL ||
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce strcmp(domain->flat_name, domain_info->flat_name) != 0) ) {
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT,
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce LDB_FLAG_MOD_REPLACE, NULL);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (ret != LDB_SUCCESS) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = sysdb_error_to_errno(ret);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
7616a65d63d3bd0f669a871fd0ed89185956e9ceSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_FLAT,
7616a65d63d3bd0f669a871fd0ed89185956e9ceSimo Sorce domain_info->flat_name);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (ret != LDB_SUCCESS) {
c03b28a38b14fdb59f74864ae4dc56affe256508Simo Sorce ret = sysdb_error_to_errno(ret);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny do_update = true;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (domain_info->id != NULL &&
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce (domain->domain_id == NULL ||
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce strcmp(domain->domain_id, domain_info->id) != 0) ) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_ID, LDB_FLAG_MOD_REPLACE,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny NULL);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (ret != LDB_SUCCESS) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = sysdb_error_to_errno(ret);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
7616a65d63d3bd0f669a871fd0ed89185956e9ceSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_ID, domain_info->id);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (ret != LDB_SUCCESS) {
c03b28a38b14fdb59f74864ae4dc56affe256508Simo Sorce ret = sysdb_error_to_errno(ret);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny do_update = true;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (do_update == false) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = EOK;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = ldb_modify(sysdb->ldb, msg);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (ret != LDB_SUCCESS) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add subdomain attributes to "
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny "[%s]: [%d][%s]!\n",
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny domain_info->name, ret,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ldb_errstring(sysdb->ldb)));
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = sysdb_error_to_errno(ret);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = EOK;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zelenydone:
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny talloc_free(tmp_ctx);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny return ret;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny}
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenystatic errno_t sysdb_add_subdomain_attributes(struct sysdb_ctx *sysdb,
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce struct sysdb_subdom *domain_info)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny{
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny TALLOC_CTX *tmp_ctx;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct ldb_message *msg;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny int ret;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny tmp_ctx = talloc_new(NULL);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (tmp_ctx == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny msg = ldb_msg_new(tmp_ctx);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (msg == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny msg->dn = ldb_dn_new_fmt(msg, sysdb->ldb, SYSDB_DOM_BASE,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny domain_info->name);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (msg->dn == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_empty(msg, SYSDB_OBJECTCLASS, LDB_FLAG_MOD_ADD, NULL);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != LDB_SUCCESS) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_error_to_errno(ret);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
7616a65d63d3bd0f669a871fd0ed89185956e9ceSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_OBJECTCLASS, SYSDB_SUBDOMAIN_CLASS);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != LDB_SUCCESS) {
c03b28a38b14fdb59f74864ae4dc56affe256508Simo Sorce ret = sysdb_error_to_errno(ret);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce if (domain_info->realm != NULL) {
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_REALM, LDB_FLAG_MOD_ADD,
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce NULL);
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce if (ret != LDB_SUCCESS) {
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = sysdb_error_to_errno(ret);
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce goto done;
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce }
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_REALM,
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce domain_info->realm);
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce if (ret != LDB_SUCCESS) {
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = sysdb_error_to_errno(ret);
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce goto done;
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce }
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce }
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (domain_info->flat_name != NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT, LDB_FLAG_MOD_ADD,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny NULL);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != LDB_SUCCESS) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_error_to_errno(ret);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
7616a65d63d3bd0f669a871fd0ed89185956e9ceSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_FLAT,
7616a65d63d3bd0f669a871fd0ed89185956e9ceSimo Sorce domain_info->flat_name);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != LDB_SUCCESS) {
c03b28a38b14fdb59f74864ae4dc56affe256508Simo Sorce ret = sysdb_error_to_errno(ret);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (domain_info->id != NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_ID, LDB_FLAG_MOD_ADD,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny NULL);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != LDB_SUCCESS) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_error_to_errno(ret);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
7616a65d63d3bd0f669a871fd0ed89185956e9ceSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_ID, domain_info->id);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != LDB_SUCCESS) {
c03b28a38b14fdb59f74864ae4dc56affe256508Simo Sorce ret = sysdb_error_to_errno(ret);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_modify(sysdb->ldb, msg);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != LDB_SUCCESS) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add subdomain attributes to "
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny "[%s]: [%d][%s]!\n",
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny domain_info->name, ret,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ldb_errstring(sysdb->ldb)));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_error_to_errno(ret);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = EOK;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenydone:
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny talloc_free(tmp_ctx);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return ret;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny}
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorceerrno_t sysdb_update_subdomains(struct sss_domain_info *domain,
efea50efda58be66638e5d38c8e57fdf9992f204Simo Sorce int num_subdoms,
efea50efda58be66638e5d38c8e57fdf9992f204Simo Sorce struct sysdb_subdom *subdoms)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny{
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny int ret;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny int sret;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny size_t c;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny size_t d;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny TALLOC_CTX *tmp_ctx = NULL;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny size_t cur_subdomains_count;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce struct sss_domain_info **cur_subdomains;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct ldb_dn *dn;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny bool in_transaction = false;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny bool *keep_subdomain;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny tmp_ctx = talloc_new(NULL);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (tmp_ctx == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny /* Retrieve all subdomains that are currently in sysdb */
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = sysdb_get_subdomains(tmp_ctx, domain, &cur_subdomains_count,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny &cur_subdomains);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != EOK) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("sysdb_get_subdomains failed.\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny keep_subdomain = talloc_zero_array(tmp_ctx, bool, cur_subdomains_count);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (keep_subdomain == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("talloc_zero_array failed.\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = sysdb_transaction_start(domain->sysdb);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != EOK) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("sysdb_transaction_start failed.\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny in_transaction = true;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny /* Go through a list of retrieved subdomains and:
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny * - if a subdomain already exists in sysdb, mark it for preservation
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny * - if the subdomain doesn't exist in sysdb, create its bare structure
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny */
efea50efda58be66638e5d38c8e57fdf9992f204Simo Sorce for (c = 0; c < num_subdoms; c++) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny for (d = 0; d < cur_subdomains_count; d++) {
efea50efda58be66638e5d38c8e57fdf9992f204Simo Sorce if (strcasecmp(subdoms[c].name,
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce cur_subdomains[d]->name) == 0) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny keep_subdomain[d] = true;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny /* sub-domain already in cache, nothing to do */
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny break;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (d == cur_subdomains_count) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_TRACE_FUNC, ("Adding sub-domain [%s].\n",
efea50efda58be66638e5d38c8e57fdf9992f204Simo Sorce subdoms[c].name));
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = sysdb_domain_create(domain->sysdb, subdoms[c].name);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != EOK) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("sysdb_domain_create failed.\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = sysdb_add_subdomain_attributes(domain->sysdb, &subdoms[c]);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != EOK) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ("sysdb_add_subdomain_attributes failed.\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny /* Now delete all subdomains that have been in sysdb prior to
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny * refreshing the list and are not marked for preservation
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny * (i.e. they are not in the new list of subdomains)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny */
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny for (d = 0; d < cur_subdomains_count; d++) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (!keep_subdomain[d]) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_TRACE_FUNC, ("Removing sub-domain [%s].\n",
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny cur_subdomains[d]->name));
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce dn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb, SYSDB_DOM_BASE,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny cur_subdomains[d]->name);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (dn == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = sysdb_delete_recursive(domain->sysdb, dn, true);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret != EOK) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("sysdb_delete_recursive failed.\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = sysdb_transaction_commit(domain->sysdb);
3a59cbd0b7b9c5dd3c62ac1679876070c264d80fMichal Zidek if (ret != EOK) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_MINOR_FAILURE, ("Could not commit transaction\n"));
3a59cbd0b7b9c5dd3c62ac1679876070c264d80fMichal Zidek goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
3a59cbd0b7b9c5dd3c62ac1679876070c264d80fMichal Zidek in_transaction = false;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenydone:
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (in_transaction) {
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce sret = sysdb_transaction_cancel(domain->sysdb);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (sret != EOK) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny talloc_free(tmp_ctx);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return ret;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny}