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}
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncioerrno_t
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncioipa_common_get_cached_rules(TALLOC_CTX *mem_ctx,
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio struct sss_domain_info *domain,
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio const char *rule,
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio const char *subtree_name,
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio const char **attrs,
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio size_t *_rule_count,
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio struct sysdb_attrs ***_rules)
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio{
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio errno_t ret;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio struct ldb_message **msgs;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio struct sysdb_attrs **rules;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio size_t rule_count;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio TALLOC_CTX *tmp_ctx;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio char *filter;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio tmp_ctx = talloc_new(mem_ctx);
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio if (tmp_ctx == NULL) {
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio return ENOMEM;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio }
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio filter = talloc_asprintf(tmp_ctx, "(objectClass=%s)", rule);
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio if (filter == NULL) {
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio ret = ENOMEM;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio goto done;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio }
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio ret = sysdb_search_custom(tmp_ctx, domain, filter,
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio subtree_name, attrs,
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio &rule_count, &msgs);
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio if (ret != EOK && ret != ENOENT) {
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "Error looking up HBAC rules\n");
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio goto done;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio }
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio if (ret == ENOENT) {
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio rule_count = 0;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio }
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio ret = sysdb_msg2attrs(tmp_ctx, rule_count, msgs, &rules);
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio if (ret != EOK) {
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE,
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio "Could not convert ldb message to sysdb_attrs\n");
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio goto done;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio }
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio if (_rules) {
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio *_rules = talloc_steal(mem_ctx, rules);
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio }
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio if (_rule_count) {
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio *_rule_count = rule_count;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio }
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio ret = EOK;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidênciodone:
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio talloc_free(tmp_ctx);
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio return ret;
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio}
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncioerrno_t
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncioipa_common_purge_rules(struct sss_domain_info *domain,
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio const char *subtree_name)
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio{
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio TALLOC_CTX *tmp_ctx;
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio struct ldb_dn *base_dn;
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio errno_t ret;
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio tmp_ctx = talloc_new(NULL);
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio if (tmp_ctx == NULL) {
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio return ENOMEM;
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio }
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio base_dn = sysdb_custom_subtree_dn(tmp_ctx, domain, subtree_name);
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio if (base_dn == NULL) {
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio ret = ENOMEM;
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio goto done;
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio }
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio ret = sysdb_delete_recursive(domain->sysdb, base_dn, true);
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio if (ret != EOK) {
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "sysdb_delete_recursive failed.\n");
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio goto done;
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio }
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio ret = EOK;
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidênciodone:
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio talloc_free(tmp_ctx);
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio return ret;
d2a0b4a6a220bf9a58c7306c3f673891efc419ebFabiano Fidêncio}
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncioerrno_t ipa_common_save_rules(struct sss_domain_info *domain,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio struct ipa_common_entries *hosts,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio struct ipa_common_entries *services,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio struct ipa_common_entries *rules,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio time_t *last_update)
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio{
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio bool in_transaction = false;
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio errno_t ret;
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio errno_t sret;
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio ret = sysdb_transaction_start(domain->sysdb);
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio if (ret != EOK) {
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio DEBUG(SSSDBG_FATAL_FAILURE, "Could not start transaction\n");
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio goto done;
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio }
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio in_transaction = true;
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio /* Save the hosts */
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio if (hosts != NULL) {
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio ret = ipa_common_entries_and_groups_sysdb_save(domain,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio hosts->entry_subdir,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio SYSDB_FQDN,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio hosts->entry_count,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio hosts->entries,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio hosts->group_subdir,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio SYSDB_NAME,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio hosts->group_count,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio hosts->groups);
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio if (ret != EOK) {
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "Error saving hosts [%d]: %s\n",
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio ret, sss_strerror(ret));
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio goto done;
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio }
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio }
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio /* Save the services */
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio if (services != NULL) {
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio ret = ipa_common_entries_and_groups_sysdb_save(domain,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio services->entry_subdir,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio IPA_CN,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio services->entry_count,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio services->entries,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio services->group_subdir,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio IPA_CN,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio services->group_count,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio services->groups);
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio if (ret != EOK) {
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "Error saving services [%d]: %s\n",
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio ret, sss_strerror(ret));
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio goto done;
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio }
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio }
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio /* Save the rules */
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio if (rules != NULL) {
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio ret = ipa_common_entries_and_groups_sysdb_save(domain,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio rules->entry_subdir,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio IPA_UNIQUE_ID,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio rules->entry_count,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio rules->entries,
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio NULL, NULL, 0, NULL);
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio if (ret != EOK) {
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "Error saving rules [%d]: %s\n",
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio ret, sss_strerror(ret));
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio goto done;
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio }
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio }
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio ret = sysdb_transaction_commit(domain->sysdb);
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio if (ret != EOK) {
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio DEBUG(SSSDBG_CRIT_FAILURE, "Failed to commit transaction\n");
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio goto done;
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio }
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio in_transaction = false;
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio *last_update = time(NULL);
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio ret = EOK;
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidênciodone:
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio if (in_transaction) {
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio sret = sysdb_transaction_cancel(domain->sysdb);
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio if (sret != EOK) {
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio DEBUG(SSSDBG_OP_FAILURE, "Could not cancel transaction\n");
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio }
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio }
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio return ret;
0f623456437c96f50330fe0ff21afd9638d14e57Fabiano Fidêncio}
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncioerrno_t
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncioipa_common_get_hostgroupname(TALLOC_CTX *mem_ctx,
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio struct sysdb_ctx *sysdb,
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio const char *host_dn,
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio char **_hostgroupname)
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio{
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio errno_t ret;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio struct ldb_dn *dn;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio const char *rdn_name;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio const char *hostgroup_comp_name;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio const char *account_comp_name;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio const struct ldb_val *rdn_val;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio const struct ldb_val *hostgroup_comp_val;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio const struct ldb_val *account_comp_val;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* This is an IPA-specific hack. It may not
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio * work for non-IPA servers and will need to
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio * be changed if SSSD ever supports HBAC on
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio * a non-IPA server.
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio *_hostgroupname = NULL;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio dn = ldb_dn_new(mem_ctx, sysdb_ctx_get_ldb(sysdb), host_dn);
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio if (dn == NULL) {
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio ret = ENOMEM;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio goto done;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio }
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio if (!ldb_dn_validate(dn)) {
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio ret = ERR_MALFORMED_ENTRY;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio goto done;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio }
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio if (ldb_dn_get_comp_num(dn) < 4) {
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* RDN, hostgroups, accounts, and at least one DC= */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* If it's fewer, it's not a group DN */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio ret = ERR_UNEXPECTED_ENTRY_TYPE;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio goto done;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio }
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* If the RDN name is 'cn' */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio rdn_name = ldb_dn_get_rdn_name(dn);
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio if (rdn_name == NULL) {
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* Shouldn't happen if ldb_dn_validate()
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio * passed, but we'll be careful.
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio ret = ERR_MALFORMED_ENTRY;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio goto done;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio }
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio if (strcasecmp("cn", rdn_name) != 0) {
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* RDN has the wrong attribute name.
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio * It's not a host.
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio ret = ERR_UNEXPECTED_ENTRY_TYPE;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio goto done;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio }
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* and the second component is "cn=hostgroups" */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio hostgroup_comp_name = ldb_dn_get_component_name(dn, 1);
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio if (strcasecmp("cn", hostgroup_comp_name) != 0) {
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* The second component name is not "cn" */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio ret = ERR_UNEXPECTED_ENTRY_TYPE;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio goto done;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio }
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio hostgroup_comp_val = ldb_dn_get_component_val(dn, 1);
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio if (strncasecmp("hostgroups",
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio (const char *) hostgroup_comp_val->data,
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio hostgroup_comp_val->length) != 0) {
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* The second component value is not "hostgroups" */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio ret = ERR_UNEXPECTED_ENTRY_TYPE;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio goto done;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio }
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* and the third component is "accounts" */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio account_comp_name = ldb_dn_get_component_name(dn, 2);
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio if (strcasecmp("cn", account_comp_name) != 0) {
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* The third component name is not "cn" */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio ret = ERR_UNEXPECTED_ENTRY_TYPE;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio goto done;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio }
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio account_comp_val = ldb_dn_get_component_val(dn, 2);
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio if (strncasecmp("accounts",
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio (const char *) account_comp_val->data,
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio account_comp_val->length) != 0) {
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* The third component value is not "accounts" */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio ret = ERR_UNEXPECTED_ENTRY_TYPE;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio goto done;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio }
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio /* Then the value of the RDN is the group name */
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio rdn_val = ldb_dn_get_rdn_val(dn);
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio *_hostgroupname = talloc_strndup(mem_ctx,
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio (const char *)rdn_val->data,
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio rdn_val->length);
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio if (*_hostgroupname == NULL) {
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio ret = ENOMEM;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio goto done;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio }
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio ret = EOK;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidênciodone:
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio talloc_free(dn);
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio return ret;
ee164913f9c12a557044eb469f4498b9be9a8f50Fabiano Fidêncio}