sysdb_subdomains.c revision c03b28a38b14fdb59f74864ae4dc56affe256508
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny System Database - Sub-domain related calls
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny Copyright (C) 2012 Jan Zeleny <jzeleny@redhat.com>
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny Copyright (C) 2012 Sumit Bose <sbose@redhat.com>
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 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 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 Zelenyerrno_t sysdb_get_subdomains(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny basedn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE);
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce list = talloc_zero_array(tmp_ctx, struct sysdb_subdom *, res->count);
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce list[i] = talloc_zero(list, struct sysdb_subdom);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny tmp_str = ldb_msg_find_attr_as_string(res->msgs[i], "cn", NULL);
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce ("The object [%s] doesn't have a name\n",
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce tmp_str = ldb_msg_find_attr_as_string(res->msgs[i],
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny list[i]->flat_name = talloc_strdup(list, tmp_str);
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce tmp_str = ldb_msg_find_attr_as_string(res->msgs[i],
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zelenyerrno_t sysdb_master_domain_get_info(TALLOC_CTX *mem_ctx,
b58460076fe843c11d736ae244c1ac979a6473a4Simo Sorce info = talloc_zero(tmp_ctx, struct sysdb_subdom);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = ldb_search(sysdb->ldb, tmp_ctx, &res, basedn, LDB_SCOPE_BASE, attrs,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("Base search returned [%d] results, "
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny "expected 1.\n"));
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_FLAT,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_ID,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zelenyerrno_t sysdb_master_domain_add_info(struct sysdb_ctx *sysdb,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny bool do_update = false;
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = sysdb_master_domain_get_info(tmp_ctx, sysdb, ¤t_info);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny msg->dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny strcmp(current_info->flat_name, domain_info->flat_name) != 0) ) {
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny ret = ldb_msg_add_fmt(msg, SYSDB_SUBDOMAIN_FLAT, "%s",
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 ret = ldb_msg_add_fmt(msg, SYSDB_SUBDOMAIN_ID, "%s",
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny if (do_update == false) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add subdomain attributes to "
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny "[%s]: [%d][%s]!\n",
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenystatic errno_t sysdb_add_subdomain_attributes(struct sysdb_ctx *sysdb,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny msg->dn = ldb_dn_new_fmt(msg, sysdb->ldb, SYSDB_DOM_BASE,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_empty(msg, SYSDB_OBJECTCLASS, LDB_FLAG_MOD_ADD, NULL);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_fmt(msg, SYSDB_OBJECTCLASS, "%s", SYSDB_SUBDOMAIN_CLASS);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT, LDB_FLAG_MOD_ADD,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_fmt(msg, SYSDB_SUBDOMAIN_FLAT, "%s",
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_ID, LDB_FLAG_MOD_ADD,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_fmt(msg, SYSDB_SUBDOMAIN_ID, "%s",
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add subdomain attributes to "
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny "[%s]: [%d][%s]!\n",
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_update_subdomains(struct sysdb_ctx *sysdb,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny /* Retrieve all subdomains that are currently in sysdb */
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_get_subdomains(tmp_ctx, sysdb, &cur_subdomains_count,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("sysdb_get_subdomains failed.\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny keep_subdomain = talloc_zero_array(tmp_ctx, bool, cur_subdomains_count);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("talloc_zero_array failed.\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("sysdb_transaction_start failed.\n"));
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 for (d = 0; d < cur_subdomains_count; d++) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny /* sub-domain already in cache, nothing to do */
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_TRACE_FUNC, ("Adding sub-domain [%s].\n",
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_domain_create(sysdb, subdomains[c]->name);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("sysdb_domain_create failed.\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = sysdb_add_subdomain_attributes(sysdb, subdomains[c]);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ("sysdb_add_subdomain_attributes failed.\n"));
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 for (d = 0; d < cur_subdomains_count; d++) {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_TRACE_FUNC, ("Removing sub-domain [%s].\n",
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("sysdb_delete_recursive failed.\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_MINOR_FAILURE, ("Could not commit transaction\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_get_subdomain_context(TALLOC_CTX *mem_ctx,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny new_ctx = talloc_zero(mem_ctx, struct sysdb_ctx);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny if (dom_info == NULL || dom_info->sysdb == NULL) { \
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("Invalid domain info.\n")); \
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_search_domuser_by_name(TALLOC_CTX *mem_ctx,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *name,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char **attrs,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_search_user_by_name(mem_ctx, domain->sysdb, name, attrs, msg);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_search_domuser_by_uid(TALLOC_CTX *mem_ctx,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char **attrs,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_search_user_by_uid(mem_ctx, domain->sysdb, uid, attrs, msg);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_store_domuser(struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *name,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *pwd,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *gecos,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *shell,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_store_user(domain->sysdb, name, pwd, uid, gid, gecos, homedir,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_delete_domuser(struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_delete_user(domain->sysdb, name, uid);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_search_domgroup_by_name(TALLOC_CTX *mem_ctx,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *name,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char **attrs,
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce return sysdb_search_group_by_name(mem_ctx, domain->sysdb,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_search_domgroup_by_gid(TALLOC_CTX *mem_ctx,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char **attrs,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_search_group_by_gid(mem_ctx, domain->sysdb, gid, attrs, msg);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_store_domgroup(struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *name,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny return sysdb_store_group(domain->sysdb, name, gid, attrs, cache_timeout,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyerrno_t sysdb_delete_domgroup(struct sss_domain_info *domain,