sysdb_subdomains.c revision 65393a294e635822c1d7a15fe5853dc457ad8a2a
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/>.
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce basedn = ldb_dn_new(tmp_ctx, domain->sysdb->ldb, SYSDB_BASE);
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res,
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce list = talloc_zero_array(tmp_ctx, struct sss_domain_info *,
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce const char *name;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce const char *realm;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce const char *flat;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce const char *id;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce name = ldb_msg_find_attr_as_string(res->msgs[i], "cn", NULL);
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce ("The object [%s] doesn't have a name\n",
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce realm = ldb_msg_find_attr_as_string(res->msgs[i],
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce list[i] = new_subdomain(list, domain, name, realm, flat, id);
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorceerrno_t sysdb_master_domain_update(struct sss_domain_info *domain)
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb,
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("Base search returned [%d] results, "
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_REALM,
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce (domain->realm == NULL || strcasecmp(tmp_str, domain->realm) != 0)) {
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_FLAT,
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce domain->flat_name = talloc_strdup(domain, tmp_str);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_SUBDOMAIN_ID,
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce domain->domain_id = talloc_strdup(domain, tmp_str);
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zelenyerrno_t sysdb_master_domain_add_info(struct sysdb_ctx *sysdb,
84c611c1b7c04cc7735ab54d4e5f48284b79e6fbJan Zeleny bool do_update = false;
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce strcmp(domain->realm, domain_info->realm) != 0) ) {
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_REALM,
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_REALM,
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce strcmp(domain->flat_name, domain_info->flat_name) != 0) ) {
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT,
7616a65d63d3bd0f669a871fd0ed89185956e9ceSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_FLAT,
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,
7616a65d63d3bd0f669a871fd0ed89185956e9ceSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_ID, domain_info->id);
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);
7616a65d63d3bd0f669a871fd0ed89185956e9ceSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_OBJECTCLASS, SYSDB_SUBDOMAIN_CLASS);
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_REALM, LDB_FLAG_MOD_ADD,
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_REALM,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_FLAT, LDB_FLAG_MOD_ADD,
7616a65d63d3bd0f669a871fd0ed89185956e9ceSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_FLAT,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ret = ldb_msg_add_empty(msg, SYSDB_SUBDOMAIN_ID, LDB_FLAG_MOD_ADD,
7616a65d63d3bd0f669a871fd0ed89185956e9ceSimo Sorce ret = ldb_msg_add_string(msg, SYSDB_SUBDOMAIN_ID, domain_info->id);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_FATAL_FAILURE, ("Failed to add subdomain attributes to "
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny "[%s]: [%d][%s]!\n",
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorceerrno_t sysdb_update_subdomains(struct sss_domain_info *domain,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny /* Retrieve all subdomains that are currently in sysdb */
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = sysdb_get_subdomains(tmp_ctx, domain, &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
efea50efda58be66638e5d38c8e57fdf9992f204Simo Sorce for (c = 0; c < num_subdoms; c++) {
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",
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = sysdb_domain_create(domain->sysdb, subdoms[c].name);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny DEBUG(SSSDBG_OP_FAILURE, ("sysdb_domain_create failed.\n"));
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = sysdb_add_subdomain_attributes(domain->sysdb, &subdoms[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",
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce dn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb, SYSDB_DOM_BASE,
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce ret = sysdb_delete_recursive(domain->sysdb, dn, true);
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"));