2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/*
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina Authors:
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina Pavel Březina <pbrezina@redhat.com>
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina Jakub Hrozek <jhrozek@redhat.com>
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina Copyright (C) 2011 Red Hat
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina This program is free software; you can redistribute it and/or modify
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina it under the terms of the GNU General Public License as published by
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina the Free Software Foundation; either version 3 of the License, or
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina (at your option) any later version.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina This program is distributed in the hope that it will be useful,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina GNU General Public License for more details.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina You should have received a copy of the GNU General Public License
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina*/
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
c9b2b7f3f02bf40b698c70640f151d0113736195Jakub Hrozek#include "config.h"
c9b2b7f3f02bf40b698c70640f151d0113736195Jakub Hrozek
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include <stdint.h>
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include <string.h>
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include <talloc.h>
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina#include <tevent.h>
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include "util/util.h"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include "db/sysdb_sudo.h"
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina#include "responder/common/cache_req/cache_req.h"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include "responder/sudo/sudosrv_private.h"
e15872d8e804b3a48b7bdd3f68c276b3ae8d11dbPavel Březina#include "providers/data_provider.h"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic int
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinasudo_order_cmp(const void *a, const void *b, bool lower_wins)
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sysdb_attrs *r1, *r2;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina uint32_t o1, o2;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina int ret;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina r1 = * (struct sysdb_attrs * const *) a;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina r2 = * (struct sysdb_attrs * const *) b;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (!r1 || !r2) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "BUG: Wrong data?\n");
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return 0;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina }
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = sysdb_attrs_get_uint32_t(r1, SYSDB_SUDO_CACHE_AT_ORDER, &o1);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (ret == ENOENT) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina /* man sudoers-ldap: If the sudoOrder attribute is not present,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina * a value of 0 is assumed */
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina o1 = 0;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek } else if (ret != EOK) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_OP_FAILURE, "Cannot get sudoOrder value\n");
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return 0;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = sysdb_attrs_get_uint32_t(r2, SYSDB_SUDO_CACHE_AT_ORDER, &o2);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (ret == ENOENT) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina /* man sudoers-ldap: If the sudoOrder attribute is not present,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina * a value of 0 is assumed */
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina o2 = 0;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina } else if (ret != EOK) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_OP_FAILURE, "Cannot get sudoOrder value\n");
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return 0;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina }
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (lower_wins) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina /* The lowest value takes priority. Original wrong SSSD behaviour. */
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (o1 > o2) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return 1;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina } else if (o1 < o2) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return -1;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina }
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina } else {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina /* The higher value takes priority. Standard LDAP behaviour. */
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (o1 < o2) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return 1;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina } else if (o1 > o2) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return -1;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina }
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina }
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return 0;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek}
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic int
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinasudo_order_low_cmp_fn(const void *a, const void *b)
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return sudo_order_cmp(a, b, true);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina}
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic int
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinasudo_order_high_cmp_fn(const void *a, const void *b)
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return sudo_order_cmp(a, b, false);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina}
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic errno_t
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinasort_sudo_rules(struct sysdb_attrs **rules, size_t count, bool lower_wins)
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (lower_wins) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Sorting rules with lower-wins logic\n");
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina qsort(rules, count, sizeof(struct sysdb_attrs *),
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina sudo_order_low_cmp_fn);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina } else {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Sorting rules with higher-wins logic\n");
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina qsort(rules, count, sizeof(struct sysdb_attrs *),
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina sudo_order_high_cmp_fn);
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina }
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return EOK;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina}
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic errno_t sudosrv_query_cache(TALLOC_CTX *mem_ctx,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sss_domain_info *domain,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina const char **attrs,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina const char *filter,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sysdb_attrs ***_rules,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina uint32_t *_count)
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina TALLOC_CTX *tmp_ctx;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina errno_t ret;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina size_t count;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sysdb_attrs **rules;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct ldb_message **msgs;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina tmp_ctx = talloc_new(NULL);
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina if (tmp_ctx == NULL) {
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina return ENOMEM;
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_FUNC_DATA, "Searching sysdb with [%s]\n", filter);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (IS_SUBDOMAIN(domain)) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina /* rules are stored inside parent domain tree */
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina domain = domain->parent;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina }
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = sysdb_search_custom(tmp_ctx, domain, filter, SUDORULE_SUBDIR,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina attrs, &count, &msgs);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (ret == ENOENT) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina *_rules = NULL;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina *_count = 0;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = EOK;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina goto done;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina } else if (ret != EOK) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Error looking up SUDO rules\n");
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina goto done;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina }
41ef946f3f74a46b9e26118116e4811e259b30efPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = sysdb_msg2attrs(tmp_ctx, count, msgs, &rules);
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina if (ret != EOK) {
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina "Could not convert ldb message to sysdb_attrs\n");
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina goto done;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek }
3b121852048a7931f8a608527b760963e2ed2bb4Jakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina *_rules = talloc_steal(mem_ctx, rules);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina *_count = (uint32_t)count;
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = EOK;
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinadone:
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina talloc_free(tmp_ctx);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return ret;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina}
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic errno_t sudosrv_expired_rules(TALLOC_CTX *mem_ctx,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sss_domain_info *domain,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina uid_t uid,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina const char *username,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina char **groups,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sysdb_attrs ***_rules,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina uint32_t *_num_rules)
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina const char *attrs[] = { SYSDB_NAME, NULL };
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina char *filter;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina errno_t ret;
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina filter = sysdb_sudo_filter_expired(NULL, username, groups, uid);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (filter == NULL) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina return ENOMEM;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = sudosrv_query_cache(mem_ctx, domain, attrs, filter,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina _rules, _num_rules);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina talloc_free(filter);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina return ret;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina}
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březinastatic errno_t sudosrv_cached_rules_by_user(TALLOC_CTX *mem_ctx,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina struct sss_domain_info *domain,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek uid_t cli_uid,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek uid_t orig_uid,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina const char *username,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina char **groupnames,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina struct sysdb_attrs ***_rules,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina uint32_t *_num_rules)
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina{
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina TALLOC_CTX *tmp_ctx;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina struct sysdb_attrs **rules;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina uint32_t num_rules;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina uint32_t i;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina const char *filter;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina const char *val;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina errno_t ret;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina const char *attrs[] = { SYSDB_OBJECTCLASS,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_CN,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_HOST,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_COMMAND,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_OPTION,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_RUNAS,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_RUNASUSER,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_RUNASGROUP,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_NOTBEFORE,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_NOTAFTER,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_ORDER,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina NULL };
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina tmp_ctx = talloc_new(NULL);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (tmp_ctx == NULL) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina return ENOMEM;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek filter = sysdb_sudo_filter_user(tmp_ctx, username, groupnames, orig_uid);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (filter == NULL) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = ENOMEM;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina goto done;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = sudosrv_query_cache(tmp_ctx, domain, attrs, filter,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina &rules, &num_rules);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (ret != EOK) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina goto done;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek val = talloc_asprintf(tmp_ctx, "#%"SPRIuid, cli_uid);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (val == NULL) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = ENOMEM;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina goto done;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina /* Add sudoUser: #uid to prevent conflicts with fqnames. */
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Replacing sudoUser attribute with "
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina "sudoUser: %s\n", val);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina for (i = 0; i < num_rules; i++) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = sysdb_attrs_add_string(rules[i], SYSDB_SUDO_CACHE_AT_USER, val);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (ret != EOK) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to alter sudoUser attribute "
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina *_rules = talloc_steal(mem_ctx, rules);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina *_num_rules = num_rules;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = EOK;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březinadone:
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina talloc_free(tmp_ctx);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina return ret;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina}
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březinastatic errno_t sudosrv_cached_rules_by_ng(TALLOC_CTX *mem_ctx,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina struct sss_domain_info *domain,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina uid_t uid,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina const char *username,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina char **groupnames,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina struct sysdb_attrs ***_rules,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina uint32_t *_num_rules)
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina{
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina char *filter;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina errno_t ret;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina const char *attrs[] = { SYSDB_OBJECTCLASS,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_CN,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_USER,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_HOST,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_COMMAND,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_OPTION,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_RUNAS,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_RUNASUSER,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_RUNASGROUP,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_NOTBEFORE,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_NOTAFTER,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina SYSDB_SUDO_CACHE_AT_ORDER,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina NULL };
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina filter = sysdb_sudo_filter_netgroups(NULL, username, groupnames, uid);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (filter == NULL) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina return ENOMEM;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
3b121852048a7931f8a608527b760963e2ed2bb4Jakub Hrozek
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = sudosrv_query_cache(mem_ctx, domain, attrs, filter,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina _rules, _num_rules);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina talloc_free(filter);
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina
010c35e66398bbeb82fb1b31fc619b1a9eaf2d3dPavel Březina return ret;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek}
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic errno_t sudosrv_cached_rules(TALLOC_CTX *mem_ctx,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sss_domain_info *domain,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek uid_t cli_uid,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek uid_t orig_uid,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina const char *username,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina char **groups,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina bool inverse_order,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sysdb_attrs ***_rules,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina uint32_t *_num_rules)
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek{
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina TALLOC_CTX *tmp_ctx;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina struct sysdb_attrs **user_rules;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina struct sysdb_attrs **ng_rules;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sysdb_attrs **rules;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina uint32_t num_user_rules;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina uint32_t num_ng_rules;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina uint32_t num_rules;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina uint32_t rule_iter, i;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina errno_t ret;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina tmp_ctx = talloc_new(NULL);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (tmp_ctx == NULL) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina return ENOMEM;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek ret = sudosrv_cached_rules_by_user(tmp_ctx, domain,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek cli_uid, orig_uid, username, groups,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina &user_rules, &num_user_rules);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (ret != EOK) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina goto done;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek ret = sudosrv_cached_rules_by_ng(tmp_ctx, domain,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek orig_uid, username, groups,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina &ng_rules, &num_ng_rules);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (ret != EOK) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina goto done;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina num_rules = num_user_rules + num_ng_rules;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (num_rules == 0) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina *_rules = NULL;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina *_num_rules = 0;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = EOK;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina goto done;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina rules = talloc_array(tmp_ctx, struct sysdb_attrs *, num_rules);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (rules == NULL) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = ENOMEM;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina goto done;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina rule_iter = 0;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina for (i = 0; i < num_user_rules; rule_iter++, i++) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina rules[rule_iter] = talloc_steal(rules, user_rules[i]);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina for (i = 0; i < num_ng_rules; rule_iter++, i++) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina rules[rule_iter] = talloc_steal(rules, ng_rules[i]);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = sort_sudo_rules(rules, num_rules, inverse_order);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (ret != EOK) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Could not sort rules by sudoOrder\n");
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina goto done;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina *_rules = talloc_steal(mem_ctx, rules);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina *_num_rules = num_rules;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = EOK;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březinadone:
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina talloc_free(tmp_ctx);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina return ret;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina}
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březinastatic errno_t sudosrv_cached_defaults(TALLOC_CTX *mem_ctx,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina struct sss_domain_info *domain,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina struct sysdb_attrs ***_rules,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina uint32_t *_num_rules)
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina{
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina char *filter;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek errno_t ret;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina const char *attrs[] = { SYSDB_OBJECTCLASS,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina SYSDB_SUDO_CACHE_AT_CN,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina SYSDB_SUDO_CACHE_AT_USER,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina SYSDB_SUDO_CACHE_AT_HOST,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina SYSDB_SUDO_CACHE_AT_COMMAND,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina SYSDB_SUDO_CACHE_AT_OPTION,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina SYSDB_SUDO_CACHE_AT_RUNAS,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina SYSDB_SUDO_CACHE_AT_RUNASUSER,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina SYSDB_SUDO_CACHE_AT_RUNASGROUP,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina SYSDB_SUDO_CACHE_AT_NOTBEFORE,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina SYSDB_SUDO_CACHE_AT_NOTAFTER,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina SYSDB_SUDO_CACHE_AT_ORDER,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina NULL };
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina filter = sysdb_sudo_filter_defaults(NULL);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina if (filter == NULL) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina return ENOMEM;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina }
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = sudosrv_query_cache(mem_ctx, domain, attrs, filter,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina _rules, _num_rules);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina talloc_free(filter);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina return ret;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina}
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březinastatic errno_t sudosrv_fetch_rules(TALLOC_CTX *mem_ctx,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina enum sss_sudo_type type,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina struct sss_domain_info *domain,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek uid_t cli_uid,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek uid_t orig_uid,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina const char *username,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina char **groups,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina bool inverse_order,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina struct sysdb_attrs ***_rules,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina uint32_t *_num_rules)
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina{
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina struct sysdb_attrs **rules;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina const char *debug_name = "unknown";
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina uint32_t num_rules;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina errno_t ret;
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina switch (type) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina case SSS_SUDO_USER:
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Retrieving rules for [%s@%s]\n",
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina username, domain->name);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina debug_name = "rules";
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek ret = sudosrv_cached_rules(mem_ctx, domain,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek cli_uid, orig_uid, username, groups,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina inverse_order, &rules, &num_rules);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina break;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina case SSS_SUDO_DEFAULTS:
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina debug_name = "default options";
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Retrieving default options for [%s@%s]\n",
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina username, domain->name);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina ret = sudosrv_cached_defaults(mem_ctx, domain, &rules, &num_rules);
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina break;
c88b63b2dd82f7111abc00d93fa8db2707487572Sumit Bose default:
c88b63b2dd82f7111abc00d93fa8db2707487572Sumit Bose ret = EINVAL;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina }
20f82655b3a29cf0784ba5c912927d1ada1287dfPavel Březina
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek if (ret != EOK) {
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to retrieve %s [%d]: %s\n",
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina debug_name, ret, sss_strerror(ret));
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return ret;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Returning %u %s for [%s@%s]\n",
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina num_rules, debug_name, username, domain->name);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina *_rules = rules;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina *_num_rules = num_rules;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return EOK;
3b121852048a7931f8a608527b760963e2ed2bb4Jakub Hrozek}
3b121852048a7931f8a608527b760963e2ed2bb4Jakub Hrozek
895ba2c346beb7e55d43be3d0c7f54fd287faa74Pavel Březinastatic void
895ba2c346beb7e55d43be3d0c7f54fd287faa74Pavel Březinasudosrv_dp_oob_req_done(struct tevent_req *req)
895ba2c346beb7e55d43be3d0c7f54fd287faa74Pavel Březina{
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_FUNC, "Out of band refresh finished\n");
895ba2c346beb7e55d43be3d0c7f54fd287faa74Pavel Březina talloc_free(req);
895ba2c346beb7e55d43be3d0c7f54fd287faa74Pavel Březina}
895ba2c346beb7e55d43be3d0c7f54fd287faa74Pavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastruct sudosrv_refresh_rules_state {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct resp_ctx *rctx;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sss_domain_info *domain;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina const char *username;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina};
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic void sudosrv_refresh_rules_done(struct tevent_req *subreq);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic struct tevent_req *
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinasudosrv_refresh_rules_send(TALLOC_CTX *mem_ctx,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct tevent_context *ev,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct resp_ctx *rctx,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sss_domain_info *domain,
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina int threshold,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina uid_t uid,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina const char *username,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina char **groups)
3b121852048a7931f8a608527b760963e2ed2bb4Jakub Hrozek{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sudosrv_refresh_rules_state *state;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct tevent_req *req;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct tevent_req *subreq;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sysdb_attrs **rules;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina uint32_t num_rules;
3b121852048a7931f8a608527b760963e2ed2bb4Jakub Hrozek errno_t ret;
3b121852048a7931f8a608527b760963e2ed2bb4Jakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina req = tevent_req_create(mem_ctx, &state,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sudosrv_refresh_rules_state);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (req == NULL) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return NULL;
3b121852048a7931f8a608527b760963e2ed2bb4Jakub Hrozek }
3b121852048a7931f8a608527b760963e2ed2bb4Jakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state->rctx = rctx;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state->domain = domain;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state->username = username;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = sudosrv_expired_rules(state, domain, uid, username, groups,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina &rules, &num_rules);
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek if (ret != EOK) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina "Unable to retrieve expired sudo rules [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina goto immediately;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (num_rules == 0) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_TRACE_FUNC, "No expired rules were found for [%s@%s].\n",
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina username, domain->name);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = EOK;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina goto immediately;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina }
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_TRACE_INTERNAL, "Refreshing %d expired rules of [%s@%s]\n",
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina num_rules, username, domain->name);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina if (num_rules > threshold) {
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina DEBUG(SSSDBG_TRACE_INTERNAL,
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina "Rules threshold [%d] is reached, performing full refresh "
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina "instead.\n", threshold);
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina subreq = sss_dp_get_sudoers_send(state, rctx, domain, false,
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina SSS_DP_SUDO_FULL_REFRESH,
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina username, 0, NULL);
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina } else {
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina subreq = sss_dp_get_sudoers_send(state, rctx, domain, false,
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina SSS_DP_SUDO_REFRESH_RULES,
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina username, num_rules, rules);
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina }
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (subreq == NULL) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = ENOMEM;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina goto immediately;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina }
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_set_callback(subreq, sudosrv_refresh_rules_done, req);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return req;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinaimmediately:
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (ret == EOK) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_done(req);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina } else {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_error(req, ret);
20f82655b3a29cf0784ba5c912927d1ada1287dfPavel Březina }
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_post(req, ev);
20f82655b3a29cf0784ba5c912927d1ada1287dfPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return req;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek}
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic void sudosrv_refresh_rules_done(struct tevent_req *subreq)
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sudosrv_refresh_rules_state *state;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct tevent_req *req;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina dbus_uint16_t err_maj;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina dbus_uint32_t err_min;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina char *err_msg;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek errno_t ret;
b0abb3bfdfd95951a23c9fc223c735805ffd2969Pavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state = tevent_req_data(req, struct sudosrv_refresh_rules_state);
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = sss_dp_get_sudoers_recv(state, subreq, &err_maj, &err_min, &err_msg);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina talloc_zfree(subreq);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (ret != EOK) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina "Unable to get information from Data Provider, "
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina "Error: %u, %u, %s\n",
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina (unsigned int)err_maj, (unsigned int)err_min, err_msg);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina goto done;
b0abb3bfdfd95951a23c9fc223c735805ffd2969Pavel Březina }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (err_min == ENOENT) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_TRACE_INTERNAL,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina "Some expired rules were removed from the server, scheduling "
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina "full refresh out of band\n");
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina subreq = sss_dp_get_sudoers_send(state->rctx, state->rctx,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state->domain, false,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina SSS_DP_SUDO_FULL_REFRESH,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state->username, 0, NULL);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (subreq == NULL) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_MINOR_FAILURE, "Cannot issue DP request.\n");
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = EOK; /* We don't care. */
c47e9d522f0d87259e5074ea643daaa3dfcb8d92Pavel Březina goto done;
c47e9d522f0d87259e5074ea643daaa3dfcb8d92Pavel Březina }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_set_callback(subreq, sudosrv_dp_oob_req_done, NULL);
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = EOK;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinadone:
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (ret != EOK) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_error(req, ret);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return;
5a3c49e513f73c1ea2b0e756bab25839e8f35321Pavel Březina }
5a3c49e513f73c1ea2b0e756bab25839e8f35321Pavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_done(req);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina}
20f82655b3a29cf0784ba5c912927d1ada1287dfPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic errno_t sudosrv_refresh_rules_recv(struct tevent_req *req)
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return EOK;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek}
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastruct sudosrv_get_rules_state {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct tevent_context *ev;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct resp_ctx *rctx;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina enum sss_sudo_type type;
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek uid_t cli_uid;
b206e1abb7f6ea373d12537b3338552aed6b656dPavel Březina const char *username;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sss_domain_info *domain;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina char **groups;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina bool inverse_order;
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina int threshold;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek uid_t orig_uid;
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek const char *orig_username;
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sysdb_attrs **rules;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina uint32_t num_rules;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina};
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic void sudosrv_get_rules_initgr_done(struct tevent_req *subreq);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic void sudosrv_get_rules_done(struct tevent_req *subreq);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastruct tevent_req *sudosrv_get_rules_send(TALLOC_CTX *mem_ctx,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct tevent_context *ev,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sudo_ctx *sudo_ctx,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina enum sss_sudo_type type,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek uid_t cli_uid,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina const char *username)
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sudosrv_get_rules_state *state;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct tevent_req *req;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct tevent_req *subreq;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek errno_t ret;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina req = tevent_req_create(mem_ctx, &state, struct sudosrv_get_rules_state);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (req == NULL) {
c02b8482375837b57cb618ed56d4bede0e006d9dPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return NULL;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state->ev = ev;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state->rctx = sudo_ctx->rctx;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state->type = type;
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek state->cli_uid = cli_uid;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state->inverse_order = sudo_ctx->inverse_order;
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina state->threshold = sudo_ctx->threshold;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Running initgroups for [%s]\n", username);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina subreq = cache_req_initgr_by_name_send(state, ev, sudo_ctx->rctx,
cee85e8fb9534ec997e5388fce59f392cf029573Jakub Hrozek sudo_ctx->rctx->ncache, 0,
cee85e8fb9534ec997e5388fce59f392cf029573Jakub Hrozek CACHE_REQ_POSIX_DOM, NULL,
e3bb7b3fda4697fa9c6f80107cd01dd04a20c85fPetr Cech username);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (subreq == NULL) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = ENOMEM;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina goto immediately;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_set_callback(subreq, sudosrv_get_rules_initgr_done, req);
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return req;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinaimmediately:
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (ret == EOK) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_done(req);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina } else {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_error(req, ret);
6a7b0edb1cbe99d4adf053849d238ba7ce1996baPavel Březina }
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_post(req, ev);
6a7b0edb1cbe99d4adf053849d238ba7ce1996baPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return req;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina}
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic void sudosrv_get_rules_initgr_done(struct tevent_req *subreq)
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sudosrv_get_rules_state *state;
b206e1abb7f6ea373d12537b3338552aed6b656dPavel Březina struct cache_req_result *result;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct tevent_req *req;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina errno_t ret;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state = tevent_req_data(req, struct sudosrv_get_rules_state);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b206e1abb7f6ea373d12537b3338552aed6b656dPavel Březina ret = cache_req_initgr_by_name_recv(state, subreq, &result);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina talloc_zfree(subreq);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (ret != EOK) {
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek goto done;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b206e1abb7f6ea373d12537b3338552aed6b656dPavel Březina state->domain = result->domain;
b206e1abb7f6ea373d12537b3338552aed6b656dPavel Březina state->username = talloc_steal(state, result->lookup_name);
b206e1abb7f6ea373d12537b3338552aed6b656dPavel Březina talloc_zfree(result);
b206e1abb7f6ea373d12537b3338552aed6b656dPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = sysdb_get_sudo_user_info(state, state->domain, state->username,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek &state->orig_username,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek &state->orig_uid,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek &state->groups);
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek if (ret != EOK) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to obtain user groups [%d]: %s\n",
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret, sss_strerror(ret));
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek goto done;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina subreq = sudosrv_refresh_rules_send(state, state->ev, state->rctx,
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina state->domain, state->threshold,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek state->orig_uid,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek state->orig_username,
a5f300adf19ec9c3087c62bd93a5175db799687aPavel Březina state->groups);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (subreq == NULL) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = ENOMEM;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek goto done;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_set_callback(subreq, sudosrv_get_rules_done, req);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = EAGAIN;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozekdone:
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (ret != EOK && ret != EAGAIN) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_error(req, ret);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina } else if (ret != EAGAIN) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_done(req);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek}
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinastatic void sudosrv_get_rules_done(struct tevent_req *subreq)
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sudosrv_get_rules_state *state = NULL;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct tevent_req *req = NULL;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina errno_t ret;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state = tevent_req_data(req, struct sudosrv_get_rules_state);
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina ret = sudosrv_refresh_rules_recv(subreq);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina talloc_zfree(subreq);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (ret != EOK) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina "Unable to refresh expired rules, we will return what is "
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina "in cache.\n");
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek ret = sudosrv_fetch_rules(state, state->type, state->domain,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek state->cli_uid,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek state->orig_uid,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek state->orig_username,
dee665060ba71ff61ad223e755ae61441118fbbaJakub Hrozek state->groups,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina state->inverse_order,
61913b8f0d1ba54d82640500d7486fac5f72b030Pavel Březina &state->rules, &state->num_rules);
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina if (ret != EOK) {
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_error(req, ret);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina return;
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek }
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina tevent_req_done(req);
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek}
20e310e32a47e861ce0c11bcd1dcf89dc78d8abaJakub Hrozek
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březinaerrno_t sudosrv_get_rules_recv(TALLOC_CTX *mem_ctx,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct tevent_req *req,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sysdb_attrs ***_rules,
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina uint32_t *_num_rules)
52e3ee5c5ff2c5a4341041826a803ad42d2b2de7Pavel Březina{
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina struct sudosrv_get_rules_state *state = NULL;
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina state = tevent_req_data(req, struct sudosrv_get_rules_state);
52e3ee5c5ff2c5a4341041826a803ad42d2b2de7Pavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
52e3ee5c5ff2c5a4341041826a803ad42d2b2de7Pavel Březina
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina *_rules = talloc_steal(mem_ctx, state->rules);
b3ca35780617b2e5a7637f9888b089e8e26a4e8cPavel Březina *_num_rules = state->num_rules;
52e3ee5c5ff2c5a4341041826a803ad42d2b2de7Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return EOK;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina}