2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio/*
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio Authors:
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio Fabiano Fidêncio <fidencio@redhat.com>
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio Copyright (C) 2017 Red Hat
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio This program is free software; you can redistribute it and/or modify
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio it under the terms of the GNU General Public License as published by
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio the Free Software Foundation; either version 3 of the License, or
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio (at your option) any later version.
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio This program is distributed in the hope that it will be useful,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio but WITHOUT ANY WARRANTY; without even the implied warranty of
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio GNU General Public License for more details.
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio You should have received a copy of the GNU General Public License
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio along with this program. If not, see <http://www.gnu.org/licenses/>.
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio*/
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio#include <ldb.h>
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio#include "db/sysdb.h"
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio#include "db/sysdb_private.h"
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidênciostatic errno_t
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidênciosysdb_get_domain_resolution_order_string_attr(TALLOC_CTX *mem_ctx,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio struct sysdb_ctx *sysdb,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio struct ldb_dn *dn,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio const char *const *attrs,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio const char **_attr)
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio{
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio TALLOC_CTX *tmp_ctx;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio struct ldb_result *res;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio const char *attr;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio errno_t ret;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio tmp_ctx = talloc_new(NULL);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (tmp_ctx == NULL) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio return ENOMEM;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = ldb_search(sysdb->ldb, tmp_ctx, &res, dn, LDB_SCOPE_BASE, attrs,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio NULL);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (ret != LDB_SUCCESS) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = EIO;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio goto done;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (res->count > 1) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio DEBUG(SSSDBG_OP_FAILURE,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio "Base search returned [%d] results, expected 1.\n", res->count);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = EINVAL;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio goto done;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio } else if (res->count == 0) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = ENOENT;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio goto done;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio } else {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio /* res->count == 1 */
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio attr = ldb_msg_find_attr_as_string(res->msgs[0], attrs[0], NULL);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (attr == NULL) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = ENOENT;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio goto done;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio *_attr = talloc_steal(mem_ctx, attr);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = EOK;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidênciodone:
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio talloc_free(tmp_ctx);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio return ret;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio}
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncioerrno_t
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidênciosysdb_get_domain_resolution_order(TALLOC_CTX *mem_ctx,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio struct sysdb_ctx *sysdb,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio struct ldb_dn *dn,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio const char **_domain_resolution_order)
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio{
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio TALLOC_CTX *tmp_ctx;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio const char *domain_resolution_order = NULL;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio const char *attrs[] = { SYSDB_DOMAIN_RESOLUTION_ORDER, NULL };
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio errno_t ret;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio tmp_ctx = talloc_new(NULL);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (tmp_ctx == NULL) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio return ENOMEM;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = sysdb_get_domain_resolution_order_string_attr(
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio tmp_ctx, sysdb, dn, attrs, &domain_resolution_order);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (ret != EOK && ret != ENOENT) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio DEBUG(SSSDBG_OP_FAILURE,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio "sysdb_get_domain_resolution_order_string_attr() failed "
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio "[%d]: [%s]",
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret, sss_strerror(ret));
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio goto done;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio } else if (ret == ENOENT) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio *_domain_resolution_order = NULL;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio goto done;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio } else {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio /* ret == EOK */
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio *_domain_resolution_order = talloc_steal(mem_ctx,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio domain_resolution_order);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = EOK;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidênciodone:
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio talloc_free(tmp_ctx);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio return ret;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio}
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncioerrno_t
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidênciosysdb_update_domain_resolution_order(struct sysdb_ctx *sysdb,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio struct ldb_dn *dn,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio const char *domain_resolution_order)
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio{
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio TALLOC_CTX *tmp_ctx;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio struct ldb_message *msg;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio errno_t ret;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio tmp_ctx = talloc_new(NULL);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (tmp_ctx == NULL) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio return ENOMEM;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio msg = ldb_msg_new(tmp_ctx);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (msg == NULL) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = ENOMEM;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio goto done;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio msg->dn = dn;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = ldb_msg_add_empty(msg, SYSDB_DOMAIN_RESOLUTION_ORDER,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio LDB_FLAG_MOD_REPLACE, NULL);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (ret != LDB_SUCCESS) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = sysdb_error_to_errno(ret);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio goto done;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (domain_resolution_order != NULL) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = ldb_msg_add_string(msg, SYSDB_DOMAIN_RESOLUTION_ORDER,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio domain_resolution_order);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (ret != LDB_SUCCESS) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = sysdb_error_to_errno(ret);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio goto done;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = ldb_modify(sysdb->ldb, msg);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio if (ret != LDB_SUCCESS) {
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio DEBUG(SSSDBG_OP_FAILURE,
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio "ldb_modify()_failed: [%s][%d][%s]\n",
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb));
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = sysdb_error_to_errno(ret);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio goto done;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio }
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio ret = EOK;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidênciodone:
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio talloc_free(tmp_ctx);
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio return ret;
2e85b015d8dd231094a09eab69b86e8b6fcc8b2bFabiano Fidêncio}