From 86a6d01854954a155da01b18d1452539fdfb556a 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 2/4] SUDO Integration - functions for manipulating with 'refreshed' attribute https://fedorahosted.org/sssd/ticket/1110 --- src/db/sysdb.c | 148 +++++++++++++++++++++++++++++++++------------------ src/db/sysdb.h | 11 ++++ src/db/sysdb_sudo.c | 58 ++++++++++++++++++++ src/db/sysdb_sudo.h | 10 ++++ 4 files changed, 176 insertions(+), 51 deletions(-) diff --git a/src/db/sysdb.c b/src/db/sysdb.c index 9fcb7ae..f36eade 100644 --- a/src/db/sysdb.c +++ b/src/db/sysdb.c @@ -1337,34 +1337,29 @@ errno_t sysdb_attrs_to_list(TALLOC_CTX *mem_ctx, return EOK; } -errno_t sysdb_has_enumerated(struct sysdb_ctx *sysdb, - bool *has_enumerated) +errno_t sysdb_get_bool(struct sysdb_ctx *sysdb, + struct ldb_dn *dn, + const char *attr_name, + bool *value) { + TALLOC_CTX *tmp_ctx; + struct ldb_result *res; errno_t ret; int lret; - struct ldb_dn *base_dn; - struct ldb_result *res; - const char *attributes[2] = {SYSDB_HAS_ENUMERATED, - NULL}; - TALLOC_CTX *tmp_ctx; - + const char *attrs[2] = {attr_name, NULL}; tmp_ctx = talloc_new(NULL); - if (!tmp_ctx) { - ret = ENOMEM; - goto done; + if (tmp_ctx == NULL) { + return ENOMEM; } - base_dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, - SYSDB_DOM_BASE, - sysdb->domain->name); - if (!base_dn) { - ret = ENOMEM; + 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; } - lret = ldb_search(sysdb->ldb, tmp_ctx, &res, base_dn, - LDB_SCOPE_BASE, attributes, NULL); if (lret != LDB_SUCCESS) { ret = sysdb_error_to_errno(lret); goto done; @@ -1378,20 +1373,17 @@ errno_t sysdb_has_enumerated(struct sysdb_ctx *sysdb, * This object in the sysdb exists mostly just * to contain this attribute. */ - *has_enumerated = false; + *value = false; ret = EOK; goto done; } else if (res->count != 1) { - DEBUG(0, ("Corrupted database. " - "More than one entry for base search.\n")); + DEBUG(SSSDBG_CRIT_FAILURE, + ("Got more than one reply for base search!\n")); ret = EIO; goto done; } - /* Object existed. Return the stored value */ - *has_enumerated = ldb_msg_find_attr_as_bool(res->msgs[0], - SYSDB_HAS_ENUMERATED, - false); + *value = ldb_msg_find_attr_as_bool(res->msgs[0], attr_name, false); ret = EOK; @@ -1400,65 +1392,61 @@ done: return ret; } -errno_t sysdb_set_enumerated(struct sysdb_ctx *sysdb, - bool enumerated) +errno_t sysdb_set_bool(struct sysdb_ctx *sysdb, + struct ldb_dn *dn, + const char *cn_value, + const char *attr_name, + bool value) { + TALLOC_CTX *tmp_ctx = NULL; + struct ldb_message *msg = NULL; + struct ldb_result *res = NULL; errno_t ret; int lret; - TALLOC_CTX *tmp_ctx; - struct ldb_message *msg; - struct ldb_result *res; - struct ldb_dn *dn; - tmp_ctx = talloc_new(NULL); - if (!tmp_ctx) { - ret = ENOMEM; - goto done; + if (dn == NULL || cn_value == NULL || attr_name == NULL) { + return EINVAL; } - dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, - SYSDB_DOM_BASE, - sysdb->domain->name); - if (!dn) { - ret = ENOMEM; - goto done; + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + return ENOMEM; } - lret = ldb_search(sysdb->ldb, tmp_ctx, &res, - dn, LDB_SCOPE_BASE, + lret = ldb_search(sysdb->ldb, tmp_ctx, &res, dn, LDB_SCOPE_BASE, NULL, NULL); if (lret != LDB_SUCCESS) { - ret = EIO; + ret = sysdb_error_to_errno(lret); goto done; } msg = ldb_msg_new(tmp_ctx); - if (!msg) { + if (msg == NULL) { ret = ENOMEM; goto done; } msg->dn = dn; if (res->count == 0) { - lret = ldb_msg_add_string(msg, "cn", sysdb->domain->name); + lret = ldb_msg_add_string(msg, "cn", cn_value); if (lret != LDB_SUCCESS) { ret = sysdb_error_to_errno(lret); goto done; } } else if (res->count != 1) { - DEBUG(0, ("Got more than one reply for base search!\n")); + 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_HAS_ENUMERATED, - LDB_FLAG_MOD_REPLACE, NULL); + lret = ldb_msg_add_empty(msg, attr_name, LDB_FLAG_MOD_REPLACE, NULL); if (lret != LDB_SUCCESS) { ret = sysdb_error_to_errno(lret); goto done; } } - lret = ldb_msg_add_fmt(msg, SYSDB_HAS_ENUMERATED, "%s", - enumerated?"TRUE":"FALSE"); + + lret = ldb_msg_add_fmt(msg, attr_name, "%s", value ? "TRUE" : "FALSE"); if (lret != LDB_SUCCESS) { ret = sysdb_error_to_errno(lret); goto done; @@ -1477,6 +1465,64 @@ done: return ret; } +errno_t sysdb_has_enumerated(struct sysdb_ctx *sysdb, + bool *has_enumerated) +{ + errno_t ret; + struct ldb_dn *dn; + TALLOC_CTX *tmp_ctx; + + + tmp_ctx = talloc_new(NULL); + if (!tmp_ctx) { + ret = ENOMEM; + goto done; + } + + dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, + SYSDB_DOM_BASE, + sysdb->domain->name); + if (!dn) { + ret = ENOMEM; + goto done; + } + + ret = sysdb_get_bool(sysdb, dn, SYSDB_HAS_ENUMERATED, has_enumerated); + +done: + talloc_free(tmp_ctx); + return ret; +} + +errno_t sysdb_set_enumerated(struct sysdb_ctx *sysdb, + bool enumerated) +{ + errno_t ret; + TALLOC_CTX *tmp_ctx; + struct ldb_dn *dn; + + tmp_ctx = talloc_new(NULL); + if (!tmp_ctx) { + ret = ENOMEM; + goto done; + } + + dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, + SYSDB_DOM_BASE, + sysdb->domain->name); + if (!dn) { + ret = ENOMEM; + goto done; + } + + ret = sysdb_set_bool(sysdb, dn, sysdb->domain->name, + SYSDB_HAS_ENUMERATED, enumerated); + +done: + talloc_free(tmp_ctx); + return ret; +} + errno_t sysdb_attrs_primary_name(struct sysdb_ctx *sysdb, struct sysdb_attrs *attrs, const char *ldap_attr, diff --git a/src/db/sysdb.h b/src/db/sysdb.h index 3d2a768..c4d64be 100644 --- a/src/db/sysdb.h +++ b/src/db/sysdb.h @@ -703,6 +703,17 @@ errno_t sysdb_netgr_to_entries(TALLOC_CTX *mem_ctx, errno_t sysdb_dn_sanitize(void *mem_ctx, const char *input, char **sanitized); +errno_t sysdb_get_bool(struct sysdb_ctx *sysdb, + struct ldb_dn *dn, + const char *attr_name, + bool *value); + +errno_t sysdb_set_bool(struct sysdb_ctx *sysdb, + struct ldb_dn *dn, + const char *cn_value, + const char *attr_name, + bool value); + errno_t sysdb_has_enumerated(struct sysdb_ctx *sysdb, bool *has_enumerated); diff --git a/src/db/sysdb_sudo.c b/src/db/sysdb_sudo.c index 784b642..f7e87ee 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 { \ @@ -324,3 +325,60 @@ done: talloc_free(tmp_ctx); return ret; } + +errno_t sysdb_sudo_set_refreshed(struct sysdb_ctx *sysdb, + bool refreshed) +{ + errno_t ret; + struct ldb_dn *dn; + TALLOC_CTX *tmp_ctx; + + + tmp_ctx = talloc_new(NULL); + if (!tmp_ctx) { + ret = ENOMEM; + goto done; + } + + dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_TMPL_CUSTOM_SUBTREE, + SUDORULE_SUBDIR, sysdb->domain->name); + if (!dn) { + ret = ENOMEM; + goto done; + } + + ret = sysdb_set_bool(sysdb, dn, SUDORULE_SUBDIR, + SYSDB_SUDO_AT_REFRESHED, refreshed); + +done: + talloc_free(tmp_ctx); + return ret; +} + +errno_t sysdb_sudo_get_refreshed(struct sysdb_ctx *sysdb, + bool *refreshed) +{ + errno_t ret; + struct ldb_dn *dn; + TALLOC_CTX *tmp_ctx; + + + tmp_ctx = talloc_new(NULL); + if (!tmp_ctx) { + ret = ENOMEM; + goto done; + } + + dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_TMPL_CUSTOM_SUBTREE, + SUDORULE_SUBDIR, sysdb->domain->name); + if (!dn) { + ret = ENOMEM; + goto done; + } + + ret = sysdb_get_bool(sysdb, dn, SYSDB_SUDO_AT_REFRESHED, refreshed); + +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