ipa_rules_common.c revision 9a18f78f38e274f4906af6ef8e1a82d844fde4cc
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio/*
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio SSSD
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio Authors:
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio Stephen Gallagher <sgallagh@redhat.com>
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio Copyright (C) 2011 Red Hat
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio This program is free software; you can redistribute it and/or modify
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio it under the terms of the GNU General Public License as published by
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio the Free Software Foundation; either version 3 of the License, or
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio (at your option) any later version.
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio This program is distributed in the hope that it will be useful,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio but WITHOUT ANY WARRANTY; without even the implied warranty of
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio GNU General Public License for more details.
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio You should have received a copy of the GNU General Public License
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio along with this program. If not, see <http://www.gnu.org/licenses/>.
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio*/
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio#include "providers/ipa/ipa_rules_common.h"
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidênciostatic errno_t
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncioipa_common_save_list(struct sss_domain_info *domain,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio bool delete_subdir,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio const char *subdir,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio const char *naming_attribute,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio size_t count,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio struct sysdb_attrs **list)
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio{
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio int ret;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio size_t c;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio struct ldb_dn *base_dn;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio const char *object_name;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio struct ldb_message_element *el;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio TALLOC_CTX *tmp_ctx;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio tmp_ctx = talloc_new(NULL);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (tmp_ctx == NULL) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new failed.\n");
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio return ENOMEM;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (delete_subdir) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio base_dn = sysdb_custom_subtree_dn(tmp_ctx, domain, subdir);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (base_dn == NULL) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio ret = ENOMEM;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio goto done;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio ret = sysdb_delete_recursive(domain->sysdb, base_dn, true);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (ret != EOK) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "sysdb_delete_recursive failed.\n");
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio goto done;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio for (c = 0; c < count; c++) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio ret = sysdb_attrs_get_el(list[c], naming_attribute, &el);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (ret != EOK) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "sysdb_attrs_get_el failed.\n");
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio goto done;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (el->num_values == 0) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "[%s] not found.\n", naming_attribute);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio ret = EINVAL;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio goto done;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio object_name = talloc_strndup(tmp_ctx, (const char *)el->values[0].data,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio el->values[0].length);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (object_name == NULL) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "talloc_strndup failed.\n");
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio ret = ENOMEM;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio goto done;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_TRACE_ALL, "Object name: [%s].\n", object_name);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio ret = sysdb_store_custom(domain, object_name, subdir, list[c]);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (ret != EOK) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "sysdb_store_custom failed.\n");
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio goto done;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio ret = EOK;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidênciodone:
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio talloc_free(tmp_ctx);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio return ret;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio}
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncioerrno_t
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncioipa_common_entries_and_groups_sysdb_save(struct sss_domain_info *domain,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio const char *primary_subdir,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio const char *attr_name,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio size_t primary_count,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio struct sysdb_attrs **primary,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio const char *group_subdir,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio const char *groupattr_name,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio size_t group_count,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio struct sysdb_attrs **groups)
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio{
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio errno_t ret, sret;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio bool in_transaction = false;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if ((primary_count == 0 || primary == NULL)
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio || (group_count > 0 && groups == NULL)) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio /* There always has to be at least one
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio * primary entry.
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio */
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio return EINVAL;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio /* Save the entries and groups to the cache */
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio ret = sysdb_transaction_start(domain->sysdb);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (ret != EOK) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "Failed to start transaction\n");
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio goto done;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio };
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio in_transaction = true;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio /* First, save the specific entries */
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio ret = ipa_common_save_list(domain, true, primary_subdir,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio attr_name, primary_count, primary);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (ret != EOK) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "Could not save %s. [%d][%s]\n",
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio primary_subdir, ret, strerror(ret));
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio goto done;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio /* Second, save the groups */
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (group_count > 0) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio ret = ipa_common_save_list(domain, true, group_subdir,
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio groupattr_name, group_count, groups);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (ret != EOK) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "Could not save %s. [%d][%s]\n",
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio group_subdir, ret, strerror(ret));
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio goto done;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio ret = sysdb_transaction_commit(domain->sysdb);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (ret != EOK) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "Failed to commit transaction\n");
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio goto done;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio in_transaction = false;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidênciodone:
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (in_transaction) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio sret = sysdb_transaction_cancel(domain->sysdb);
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (sret != EOK) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_FATAL_FAILURE, "Could not cancel sysdb transaction\n");
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if (ret != EOK) {
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio DEBUG(SSSDBG_MINOR_FAILURE, "Error [%d][%s]\n", ret, strerror(ret));
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio }
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio return ret;
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio}