sysdb_subdomains.c revision c03b28a38b14fdb59f74864ae4dc56affe256508
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
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny size_t *subdomain_count,
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce struct sysdb_subdom ***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",
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SYSDB_SUBDOMAIN_FLAT,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SYSDB_SUBDOMAIN_ID,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny NULL};
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce struct sysdb_subdom **list;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct ldb_dn *basedn;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *tmp_str;
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 basedn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (basedn == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = EIO;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_search(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
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce list = talloc_zero_array(tmp_ctx, struct sysdb_subdom *, res->count);
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++) {
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce list[i] = talloc_zero(list, struct sysdb_subdom);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (list[i] == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny tmp_str = ldb_msg_find_attr_as_string(res->msgs[i], "cn", NULL);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (tmp_str == 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
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny list[i]->name = talloc_strdup(list, tmp_str);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (list[i]->name == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce tmp_str = ldb_msg_find_attr_as_string(res->msgs[i],
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce SYSDB_SUBDOMAIN_FLAT, NULL);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (tmp_str != NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny list[i]->flat_name = talloc_strdup(list, tmp_str);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (list[i]->flat_name == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce tmp_str = ldb_msg_find_attr_as_string(res->msgs[i],
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce SYSDB_SUBDOMAIN_ID, NULL);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (tmp_str != NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny list[i]->id = talloc_strdup(list, tmp_str);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (list[i]->id == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny goto done;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
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
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zelenyerrno_t sysdb_master_domain_get_info(TALLOC_CTX *mem_ctx,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny struct sysdb_ctx *sysdb,
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce struct sysdb_subdom **_info)
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;
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce struct sysdb_subdom *info;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny struct ldb_result *res;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny const char *attrs[] = {"cn",
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
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce info = talloc_zero(tmp_ctx, struct sysdb_subdom);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (info == NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = ENOMEM;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny sysdb->domain->name);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (basedn == NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = EIO;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = ldb_search(sysdb->ldb, tmp_ctx, &res, basedn, LDB_SCOPE_BASE, attrs,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny NULL);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (ret != LDB_SUCCESS) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = EIO;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (res->count != 1) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("Base search returned [%d] results, "
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny "expected 1.\n"));
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = EINVAL;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_FLAT,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny NULL);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (tmp_str != NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny info->flat_name = talloc_strdup(info, tmp_str);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (info->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);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (tmp_str != NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny info->flat_name = talloc_strdup(info, tmp_str);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (info->flat_name == NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = ENOMEM;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny *_info = talloc_steal(mem_ctx, info);
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,
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;
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce struct sysdb_subdom *current_info;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny tmp_ctx = talloc_new(NULL);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (tmp_ctx == NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny return ENOMEM;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = sysdb_master_domain_get_info(tmp_ctx, sysdb, &current_info);
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
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny msg->dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny sysdb->domain->name);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (msg->dn == NULL) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = EIO;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny goto done;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny }
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (domain_info->flat_name != NULL &&
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny (current_info->flat_name == NULL ||
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny strcmp(current_info->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
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = ldb_msg_add_fmt(msg, SYSDB_SUBDOMAIN_FLAT, "%s",
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny 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 &&
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny (current_info->flat_name == NULL ||
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny strcmp(current_info->flat_name, 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
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = ldb_msg_add_fmt(msg, SYSDB_SUBDOMAIN_ID, "%s",
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny 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
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_fmt(msg, SYSDB_OBJECTCLASS, "%s", 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
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
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_fmt(msg, SYSDB_SUBDOMAIN_FLAT, "%s",
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny 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
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_fmt(msg, SYSDB_SUBDOMAIN_ID, "%s",
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny 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
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb,
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce struct sysdb_subdom **subdomains)
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;
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce struct sysdb_subdom **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 */
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_get_subdomains(tmp_ctx, sysdb, &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
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_transaction_start(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 */
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny for (c = 0; subdomains[c] != NULL; c++) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny for (d = 0; d < cur_subdomains_count; d++) {
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce if (strcasecmp(subdomains[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",
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny subdomains[c]->name));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_domain_create(sysdb, subdomains[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
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_add_subdomain_attributes(sysdb, subdomains[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));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny dn = ldb_dn_new_fmt(tmp_ctx, 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
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_delete_recursive(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
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_transaction_commit(sysdb);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (ret == EOK) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny in_transaction = false;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny } else {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_MINOR_FAILURE, ("Could not commit transaction\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenydone:
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (in_transaction) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny sret = sysdb_transaction_cancel(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}
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_get_subdomain_context(TALLOC_CTX *mem_ctx,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct sysdb_ctx *sysdb,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct sss_domain_info *subdomain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct sysdb_ctx **subdomain_ctx)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny{
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct sysdb_ctx *new_ctx;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny new_ctx = talloc_zero(mem_ctx, struct sysdb_ctx);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (new_ctx == NULL) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return ENOMEM;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny }
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny new_ctx->domain = subdomain;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny new_ctx->mpg = true;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny new_ctx->ldb = sysdb->ldb;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny new_ctx->ldb_file = sysdb->ldb_file;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny *subdomain_ctx = new_ctx;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return EOK;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny}
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny#define CHECK_DOMAIN_INFO(dom_info) do { \
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (dom_info == NULL || dom_info->sysdb == NULL) { \
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("Invalid domain info.\n")); \
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return EINVAL; \
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny } \
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny} while(0)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_search_domuser_by_name(TALLOC_CTX *mem_ctx,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *name,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char **attrs,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct ldb_message **msg)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny{
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny CHECK_DOMAIN_INFO(domain);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_search_user_by_name(mem_ctx, domain->sysdb, name, attrs, msg);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny}
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_search_domuser_by_uid(TALLOC_CTX *mem_ctx,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny uid_t uid,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char **attrs,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct ldb_message **msg)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny{
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny CHECK_DOMAIN_INFO(domain);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_search_user_by_uid(mem_ctx, domain->sysdb, uid, attrs, msg);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny}
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_store_domuser(struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *name,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *pwd,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny uid_t uid, gid_t gid,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *gecos,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *homedir,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *shell,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct sysdb_attrs *attrs,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny char **remove_attrs,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny uint64_t cache_timeout,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny time_t now)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny{
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny CHECK_DOMAIN_INFO(domain);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_store_user(domain->sysdb, name, pwd, uid, gid, gecos, homedir,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny shell, attrs, remove_attrs, cache_timeout, now);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny}
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_delete_domuser(struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *name, uid_t uid)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny{
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny CHECK_DOMAIN_INFO(domain);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_delete_user(domain->sysdb, name, uid);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny}
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_search_domgroup_by_name(TALLOC_CTX *mem_ctx,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *name,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char **attrs,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct ldb_message **msg)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny{
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny CHECK_DOMAIN_INFO(domain);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce return sysdb_search_group_by_name(mem_ctx, domain->sysdb,
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce name, attrs, msg);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny}
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_search_domgroup_by_gid(TALLOC_CTX *mem_ctx,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny gid_t gid,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char **attrs,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct ldb_message **msg)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny{
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny CHECK_DOMAIN_INFO(domain);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_search_group_by_gid(mem_ctx, domain->sysdb, gid, attrs, msg);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny}
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_store_domgroup(struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *name,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny gid_t gid,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct sysdb_attrs *attrs,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny uint64_t cache_timeout,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny time_t now)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny{
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny CHECK_DOMAIN_INFO(domain);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_store_group(domain->sysdb, name, gid, attrs, cache_timeout,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny now);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny}
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_delete_domgroup(struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *name, gid_t gid)
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny{
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny CHECK_DOMAIN_INFO(domain);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_delete_group(domain->sysdb, name, gid);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny}