From d74f759845e544772feb32779a85bd37bb66c86f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= Date: Tue, 20 Dec 2011 14:02:42 +0100 Subject: [PATCH 3/4] SUDO Integration - functions for manipulating with 'refreshed' attribute https://fedorahosted.org/sssd/ticket/1110 --- src/db/sysdb_sudo.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/db/sysdb_sudo.h | 10 ++++ 2 files changed, 150 insertions(+), 0 deletions(-) diff --git a/src/db/sysdb_sudo.c b/src/db/sysdb_sudo.c index 1703e78..76a4911 100644 --- a/src/db/sysdb_sudo.c +++ b/src/db/sysdb_sudo.c @@ -21,6 +21,7 @@ #include #include "db/sysdb.h" +#include "db/sysdb_private.h" #include "db/sysdb_sudo.h" #define NULL_CHECK(val, rval, label) do { \ @@ -331,3 +332,142 @@ done: talloc_free(tmp_ctx); return ret; } + +errno_t sysdb_sudo_set_refreshed(struct sysdb_ctx *sysdb, + bool refreshed) +{ + TALLOC_CTX *tmp_ctx = NULL; + struct ldb_message *msg = NULL; + struct ldb_result *res = NULL; + struct ldb_dn *dn = NULL; + errno_t ret; + int lret; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + return ENOMEM; + } + + dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_TMPL_CUSTOM_SUBTREE, + SUDORULE_SUBDIR, sysdb->domain->name); + if (dn == NULL) { + ret = ENOMEM; + goto done; + } + + lret = ldb_search(sysdb->ldb, tmp_ctx, &res, dn, LDB_SCOPE_BASE, + NULL, NULL); + if (lret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(lret); + goto done; + } + + msg = ldb_msg_new(tmp_ctx); + if (msg == NULL) { + ret = ENOMEM; + goto done; + } + msg->dn = dn; + + if (res->count == 0) { + lret = ldb_msg_add_string(msg, "cn", SUDORULE_SUBDIR); + if (lret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(lret); + goto done; + } + } else if (res->count != 1) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Got more than one reply for base search!\n")); + ret = EIO; + goto done; + } else { + lret = ldb_msg_add_empty(msg, SYSDB_SUDO_AT_REFRESHED, + LDB_FLAG_MOD_REPLACE, NULL); + if (lret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(lret); + goto done; + } + } + + lret = ldb_msg_add_fmt(msg, SYSDB_SUDO_AT_REFRESHED, "%s", + refreshed ? "TRUE" : "FALSE"); + if (lret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(lret); + goto done; + } + + if (res->count) { + lret = ldb_modify(sysdb->ldb, msg); + } else { + lret = ldb_add(sysdb->ldb, msg); + } + + ret = sysdb_error_to_errno(lret); + +done: + talloc_free(tmp_ctx); + return ret; +} + +errno_t sysdb_sudo_get_refreshed(struct sysdb_ctx *sysdb, + bool *refreshed) +{ + TALLOC_CTX *tmp_ctx; + struct ldb_dn *dn; + struct ldb_result *res; + errno_t ret; + int lret; + const char *attrs[2] = {SYSDB_SUDO_AT_REFRESHED, NULL}; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + return ENOMEM; + } + + dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_TMPL_CUSTOM_SUBTREE, + SUDORULE_SUBDIR, sysdb->domain->name); + if (dn == NULL) { + ret = ENOMEM; + goto done; + } + + lret = ldb_search(sysdb->ldb, tmp_ctx, &res, dn, LDB_SCOPE_BASE, + attrs, NULL); + if (lret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(lret); + goto done; + } + + if (lret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(lret); + goto done; + } + + if (res->count == 0) { + /* This entry has not been populated in LDB + * This is a common case, as unlike LDAP, + * LDB does not need to have all of its parent + * objects actually exist. + * This object in the sysdb exists mostly just + * to contain this attribute. + */ + *refreshed = false; + ret = EOK; + goto done; + } else if (res->count != 1) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Got more than one reply for base search!\n")); + ret = EIO; + goto done; + } + + *refreshed = ldb_msg_find_attr_as_bool(res->msgs[0], + SYSDB_SUDO_AT_REFRESHED, + false); + + ret = EOK; + +done: + talloc_free(tmp_ctx); + return ret; +} diff --git a/src/db/sysdb_sudo.h b/src/db/sysdb_sudo.h index 70ee1f4..67f9e91 100644 --- a/src/db/sysdb_sudo.h +++ b/src/db/sysdb_sudo.h @@ -27,6 +27,10 @@ * b/c it's not name-service-switch data */ #define SUDORULE_SUBDIR "sudorules" +/* attribute of SUDORULE_SUBDIR + * should be true if we have downloaded all rules atleast once */ +#define SYSDB_SUDO_AT_REFRESHED "refreshed" + /* sysdb attributes */ #define SYSDB_SUDO_CACHE_AT_OC "sudoRule" #define SYSDB_SUDO_CACHE_AT_CN "cn" @@ -66,4 +70,10 @@ errno_t sysdb_purge_sudorule_subtree(struct sysdb_ctx *sysdb, struct sss_domain_info *domain, const char *filter); +errno_t sysdb_sudo_set_refreshed(struct sysdb_ctx *sysdb, + bool refreshed); + +errno_t sysdb_sudo_get_refreshed(struct sysdb_ctx *sysdb, + bool *refreshed); + #endif /* _SYSDB_SUDO_H_ */ -- 1.7.6.4