summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSumit Bose <sbose@redhat.com>2014-09-16 15:18:53 +0200
committerSumit Bose <sbose@redhat.com>2014-09-16 15:27:48 +0200
commit8f902f4e188f742ca5572d68997b22b742c4013d (patch)
tree3e4e6431c9e643c35303ea582649c657c3a23dbf
parentc98d5f1992bdee7b5f47b629e0c32b1662338131 (diff)
downloadsssd-8f902f4e188f742ca5572d68997b22b742c4013d.tar.gz
sssd-8f902f4e188f742ca5572d68997b22b742c4013d.tar.xz
sssd-8f902f4e188f742ca5572d68997b22b742c4013d.zip
sysdb: add sysdb_update_view_name()
-rw-r--r--Makefile.am1
-rw-r--r--src/db/sysdb.h8
-rw-r--r--src/db/sysdb_views.c145
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;
+}
+