diff options
author | Sumit Bose <sbose@redhat.com> | 2014-09-16 15:18:53 +0200 |
---|---|---|
committer | Sumit Bose <sbose@redhat.com> | 2014-09-16 15:27:48 +0200 |
commit | 8f902f4e188f742ca5572d68997b22b742c4013d (patch) | |
tree | 3e4e6431c9e643c35303ea582649c657c3a23dbf | |
parent | c98d5f1992bdee7b5f47b629e0c32b1662338131 (diff) | |
download | sssd-8f902f4e188f742ca5572d68997b22b742c4013d.tar.gz sssd-8f902f4e188f742ca5572d68997b22b742c4013d.tar.xz sssd-8f902f4e188f742ca5572d68997b22b742c4013d.zip |
sysdb: add sysdb_update_view_name()
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | src/db/sysdb.h | 8 | ||||
-rw-r--r-- | src/db/sysdb_views.c | 145 |
3 files changed, 154 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am index b19d69803..c5ea25f68 100644 --- a/Makefile.am +++ b/Makefile.am @@ -662,6 +662,7 @@ libsss_util_la_SOURCES = \ src/db/sysdb_services.c \ src/db/sysdb_autofs.c \ src/db/sysdb_subdomains.c \ + src/db/sysdb_views.c \ src/db/sysdb_ranges.c \ src/db/sysdb_idmap.c \ src/db/sysdb_gpo.c \ diff --git a/src/db/sysdb.h b/src/db/sysdb.h index 901b6129b..fca2aec2a 100644 --- a/src/db/sysdb.h +++ b/src/db/sysdb.h @@ -36,11 +36,13 @@ #define SYSDB_CUSTOM_CONTAINER "cn=custom" #define SYSDB_NETGROUP_CONTAINER "cn=Netgroups" #define SYSDB_RANGE_CONTAINER "cn=ranges" +#define SYSDB_VIEW_CONTAINER "cn=views" #define SYSDB_TMPL_USER_BASE SYSDB_USERS_CONTAINER","SYSDB_DOM_BASE #define SYSDB_TMPL_GROUP_BASE SYSDB_GROUPS_CONTAINER","SYSDB_DOM_BASE #define SYSDB_TMPL_CUSTOM_BASE SYSDB_CUSTOM_CONTAINER","SYSDB_DOM_BASE #define SYSDB_TMPL_NETGROUP_BASE SYSDB_NETGROUP_CONTAINER","SYSDB_DOM_BASE #define SYSDB_TMPL_RANGE_BASE SYSDB_RANGE_CONTAINER","SYSDB_BASE +#define SYSDB_TMPL_VIEW_BASE SYSDB_VIEW_CONTAINER","SYSDB_BASE #define SYSDB_SUBDOMAIN_CLASS "subdomain" #define SYSDB_USER_CLASS "user" @@ -138,6 +140,9 @@ #define SYSDB_DOMAIN_ID "domainID" #define SYSDB_ID_RANGE_TYPE "idRangeType" +#define SYSDB_VIEW_CLASS "view" +#define SYSDB_VIEW_NAME "viewName" + #define SYSDB_NEXTID_FILTER "("SYSDB_NEXTID"=*)" #define SYSDB_UC "objectclass="SYSDB_USER_CLASS @@ -403,6 +408,9 @@ errno_t sysdb_range_create(struct sysdb_ctx *sysdb, struct range_info *range); errno_t sysdb_update_ranges(struct sysdb_ctx *sysdb, struct range_info **ranges); +errno_t sysdb_update_view_name(struct sss_domain_info *domain, + const char *view_name); + /* Sysdb initialization. * call this function *only* once to initialize the database and get * the sysdb ctx */ diff --git a/src/db/sysdb_views.c b/src/db/sysdb_views.c new file mode 100644 index 000000000..fc088b474 --- /dev/null +++ b/src/db/sysdb_views.c @@ -0,0 +1,145 @@ +/* + SSSD + + System Database - View and Override related calls + + Copyright (C) 2014 Sumit Bose <sbose@redhat.com> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "util/util.h" +#include "db/sysdb_private.h" + +errno_t sysdb_update_view_name(struct sss_domain_info *domain, + const char *view_name) +{ + errno_t ret; + TALLOC_CTX *tmp_ctx; + const char *tmp_str; + struct ldb_dn *view_base_dn; + struct ldb_result *res; + const char *attrs[] = {SYSDB_VIEW_NAME, + NULL}; + bool add_view_container = false; + bool add_view_name = false; + struct ldb_message *msg; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + return ENOMEM; + } + + view_base_dn = ldb_dn_new(tmp_ctx, domain->sysdb->ldb, + SYSDB_TMPL_VIEW_BASE); + if (view_base_dn == NULL) { + ret = EIO; + goto done; + } + ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res, + view_base_dn, LDB_SCOPE_BASE, attrs, NULL); + if (ret != LDB_SUCCESS) { + ret = EIO; + goto done; + } + + if (res->count > 1) { + DEBUG(SSSDBG_OP_FAILURE, "Base search returned [%d] results, " + "expected 1.\n", res->count); + ret = EINVAL; + goto done; + } + + msg = ldb_msg_new(tmp_ctx); + if (msg == NULL) { + ret = ENOMEM; + goto done; + } + + msg->dn = view_base_dn; + + if (res->count == 0) { + add_view_container = true; + add_view_name = true; + DEBUG(SSSDBG_TRACE_ALL, "No view container found, adding new one.\n"); + + ret = ldb_msg_add_empty(msg, SYSDB_OBJECTCLASS, LDB_FLAG_MOD_ADD, NULL); + if (ret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(ret); + goto done; + } + + ret = ldb_msg_add_string(msg, SYSDB_OBJECTCLASS, SYSDB_VIEW_CLASS); + if (ret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(ret); + goto done; + } + } else { + tmp_str = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_VIEW_NAME, + NULL); + if (tmp_str == NULL) { + DEBUG(SSSDBG_TRACE_ALL, "No view name found, adding [%s].\n", + view_name); + add_view_container = false; + add_view_name = true; + } else { + if (strcmp(tmp_str, view_name) == 0) { + /* view name already known, mothing to do */ + DEBUG(SSSDBG_TRACE_ALL, "View name already in place.\n"); + ret = EOK; + goto done; + } else { + /* view name changed */ + /* not supported atm */ + DEBUG(SSSDBG_CRIT_FAILURE, + "View name changed from [%s] to [%s]. NOT SUPPORTED.\n", + tmp_str, view_name); + ret = ENOTSUP; + goto done; + } + } + } + + ret = ldb_msg_add_empty(msg, SYSDB_VIEW_NAME, + add_view_name ? LDB_FLAG_MOD_ADD + : LDB_FLAG_MOD_REPLACE, + NULL); + if (ret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(ret); + goto done; + } + + ret = ldb_msg_add_string(msg, SYSDB_VIEW_NAME, view_name); + if (ret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(ret); + goto done; + } + + if (add_view_container) { + ret = ldb_add(domain->sysdb->ldb, msg); + } else { + ret = ldb_modify(domain->sysdb->ldb, msg); + } + if (ret != LDB_SUCCESS) { + DEBUG(SSSDBG_FATAL_FAILURE, "Failed to %s view container", + add_view_container ? "add" : "modify"); + ret = sysdb_error_to_errno(ret); + goto done; + } + +done: + talloc_free(tmp_ctx); + return ret; +} + |