a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina/*
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina Authors:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina Pavel Březina <pbrezina@redhat.com>
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina Copyright (C) 2015 Red Hat
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina This program is free software; you can redistribute it and/or modify
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina it under the terms of the GNU General Public License as published by
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina the Free Software Foundation; either version 3 of the License, or
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina (at your option) any later version.
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina This program is distributed in the hope that it will be useful,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina GNU General Public License for more details.
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina You should have received a copy of the GNU General Public License
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina*/
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include <talloc.h>
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include <tevent.h>
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include <dhash.h>
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "providers/ldap/sdap_ops.h"
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina#include "providers/ldap/sdap_sudo_shared.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "providers/ipa/ipa_common.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "providers/ipa/ipa_hosts.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "providers/ipa/ipa_sudo.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "providers/ipa/ipa_dn.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "db/sysdb.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "db/sysdb_sudo.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct ipa_hostinfo {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t num_hosts;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t num_hostgroups;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs **hosts;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs **hostgroups;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina};
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic char *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_filter_append_origdn(char *filter,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs *attrs,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *attr_name)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *origdn;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *sanitizeddn;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_attrs_get_string(attrs, SYSDB_ORIG_DN, &origdn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get original DN "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sss_filter_sanitize(NULL, origdn, &sanitizeddn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to sanitize DN "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina filter = talloc_asprintf_append(filter, "(%s=%s)", attr_name, sanitizeddn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(sanitizeddn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf_append() failed\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina/**
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina * (|(hostCategory=ALL)(memberHost=$DN(fqdn))(memberHost=$DN(hostgroup))...)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic char *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_host_filter(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_hostinfo *host,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina TALLOC_CTX *tmp_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t i;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* If realloc fails we will free all data through tmp_ctx. */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tmp_ctx = talloc_new(NULL);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (tmp_ctx == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina filter = talloc_asprintf(tmp_ctx, "(!(%s=*))",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina map[IPA_AT_SUDORULE_HOST].name);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto fail;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* Append hostCategory=ALL */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina filter = talloc_asprintf_append(filter, "(%s=ALL)",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina map[IPA_AT_SUDORULE_HOSTCATEGORY].name);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto fail;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* Append client machine */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (i = 0; i < host->num_hosts; i++) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina filter = ipa_sudo_filter_append_origdn(filter, host->hosts[i],
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina map[IPA_AT_SUDORULE_HOST].name);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto fail;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* Append hostgroups */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (i = 0; i < host->num_hostgroups; i++) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina filter = ipa_sudo_filter_append_origdn(filter, host->hostgroups[i],
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina map[IPA_AT_SUDORULE_HOST].name);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto fail;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* OR filters */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina filter = talloc_asprintf(tmp_ctx, "(|%s)", filter);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto fail;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_steal(mem_ctx, filter);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(tmp_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinafail:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(tmp_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březinastatic errno_t
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březinaipa_sudo_highest_usn(TALLOC_CTX *mem_ctx,
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina struct sysdb_attrs **attrs,
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina size_t num_attrs,
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina char **current_usn)
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina{
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina errno_t ret;
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina char *usn;
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina ret = sysdb_get_highest_usn(mem_ctx, attrs, num_attrs, &usn);
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina if (ret != EOK) {
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina DEBUG(SSSDBG_MINOR_FAILURE, "Unable to get highest USN [%d]: %s\n",
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina ret, sss_strerror(ret));
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina return ret;
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina }
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina if (sysdb_compare_usn(usn, *current_usn) > 0) {
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina talloc_free(*current_usn);
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina *current_usn = usn;
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina return EOK;
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina }
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina talloc_free(usn);
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina return EOK;
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina}
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinastatic errno_t
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinaipa_sudo_assoc_rules_filter(TALLOC_CTX *mem_ctx,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sysdb_attrs **cmdgroups,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina size_t num_cmdgroups,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina char **_filter)
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina{
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina TALLOC_CTX *tmp_ctx;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina const char *origdn;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina char *sanitized;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina char *filter;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina errno_t ret;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina size_t i;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (num_cmdgroups == 0) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return ENOENT;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina tmp_ctx = talloc_new(NULL);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (tmp_ctx == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina filter = talloc_strdup(tmp_ctx, "");
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (filter == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina for (i = 0; i < num_cmdgroups; i++) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = sysdb_attrs_get_string(cmdgroups[i], SYSDB_ORIG_DN, &origdn);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret != EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get original dn [%d]: %s\n",
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret, sss_strerror(ret));
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ERR_INTERNAL;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = sss_filter_sanitize(tmp_ctx, origdn, &sanitized);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret != EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina filter = talloc_asprintf_append(filter, "(%s=%s)",
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina SYSDB_IPA_SUDORULE_ORIGCMD, sanitized);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (filter == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina filter = talloc_asprintf(tmp_ctx, "(&(objectClass=%s)(|%s)))",
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina SYSDB_SUDO_CACHE_OC, filter);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (filter == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina *_filter = talloc_steal(mem_ctx, filter);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = EOK;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinadone:
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina talloc_free(tmp_ctx);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return ret;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina}
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinastatic errno_t
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinaipa_sudo_assoc_rules(TALLOC_CTX *mem_ctx,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sss_domain_info *domain,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sysdb_attrs **cmdgroups,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina size_t num_cmdgroups,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sysdb_attrs ***_rules,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina size_t *_num_rules)
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina{
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina TALLOC_CTX *tmp_ctx;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina const char *attrs[] = {SYSDB_NAME, NULL};
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sysdb_attrs **rules;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct ldb_message **msgs;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina size_t num_rules;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina char *filter;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina errno_t ret;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina tmp_ctx = talloc_new(NULL);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (tmp_ctx == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ipa_sudo_assoc_rules_filter(tmp_ctx, cmdgroups,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina num_cmdgroups, &filter);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret != EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = sysdb_search_custom(tmp_ctx, domain, filter,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina SUDORULE_SUBDIR, attrs,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina &num_rules, &msgs);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret == ENOENT) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina *_rules = NULL;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina *_num_rules = 0;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = EOK;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina } else if (ret != EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Error looking up sudo rules [%d]: %s\n",
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret, sss_strerror(ret));
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = sysdb_msg2attrs(tmp_ctx, num_rules, msgs, &rules);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret != EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Could not convert ldb message to "
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina "sysdb_attrs [%d]: %s\n", ret, sss_strerror(ret));
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina *_rules = talloc_steal(mem_ctx, rules);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina *_num_rules = num_rules;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinadone:
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina talloc_free(tmp_ctx);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return ret;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina}
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinastatic errno_t
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinaipa_sudo_filter_rules_bycmdgroups(TALLOC_CTX *mem_ctx,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sss_domain_info *domain,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sysdb_attrs **cmdgroups,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina size_t num_cmdgroups,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sdap_attr_map *map_rule,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina char **_filter)
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina{
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina TALLOC_CTX *tmp_ctx;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sysdb_attrs **rules;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina size_t num_rules;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina const char *name;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina char *sanitized;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina char *filter;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina errno_t ret;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina size_t i;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (num_cmdgroups == 0) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina *_filter = NULL;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return EOK;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina tmp_ctx = talloc_new(NULL);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (tmp_ctx == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ipa_sudo_assoc_rules(tmp_ctx, domain, cmdgroups, num_cmdgroups,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina &rules, &num_rules);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret != EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (num_rules == 0) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina *_filter = NULL;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = EOK;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina filter = talloc_strdup(tmp_ctx, "");
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (filter == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina for (i = 0; i < num_rules; i++) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = sysdb_attrs_get_string(rules[i], SYSDB_NAME, &name);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret != EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get name [%d]: %s\n",
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret, sss_strerror(ret));
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = sss_filter_sanitize(tmp_ctx, name, &sanitized);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret != EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina filter = talloc_asprintf_append(filter, "(%s=%s)",
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina map_rule[IPA_AT_SUDORULE_NAME].name, sanitized);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (filter == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina filter = talloc_asprintf(tmp_ctx, "(|%s)", filter);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (filter == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina *_filter = talloc_steal(mem_ctx, filter);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = EOK;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinadone:
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina talloc_free(tmp_ctx);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return ret;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina}
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct ipa_sudo_fetch_state {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_context *ev;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sss_domain_info *domain;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_ctx *sudo_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_options *sdap_opts;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_hostinfo *host;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_handle *sh;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina const char *search_filter;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina const char *cmdgroups_filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_cmdgroup;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_rule;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_cmd;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_search_base **sudo_sb;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv *conv;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs **rules;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t num_rules;
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson int cmd_threshold;
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina char *usn;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina};
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinastatic errno_t ipa_sudo_fetch_addtl_cmdgroups(struct tevent_req *req);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinastatic void ipa_sudo_fetch_addtl_cmdgroups_done(struct tevent_req *subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t ipa_sudo_fetch_rules(struct tevent_req *req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void ipa_sudo_fetch_rules_done(struct tevent_req *subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t ipa_sudo_fetch_cmdgroups(struct tevent_req *req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void ipa_sudo_fetch_cmdgroups_done(struct tevent_req *subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t ipa_sudo_fetch_cmds(struct tevent_req *req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void ipa_sudo_fetch_cmds_done(struct tevent_req *subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void ipa_sudo_fetch_done(struct tevent_req *req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic struct tevent_req *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_fetch_send(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_context *ev,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sss_domain_info *domain,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_ctx *sudo_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_hostinfo *host,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_user,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_group,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_host,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_hostgroup,
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina struct sdap_handle *sh,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina const char *cmdgroups_filter,
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina const char *search_filter)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_fetch_state *state = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *req = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina req = tevent_req_create(mem_ctx, &state,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_fetch_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (req == NULL) {
c02b8482375837b57cb618ed56d4bede0e006d9dPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->ev = ev;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina state->domain = domain;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sudo_ctx = sudo_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sdap_opts = sudo_ctx->sdap_opts;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->host = host;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sh = sh;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina state->search_filter = search_filter == NULL ? "" : search_filter;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina state->cmdgroups_filter = cmdgroups_filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->map_cmdgroup = sudo_ctx->sudocmdgroup_map;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->map_rule = sudo_ctx->sudorule_map;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->map_cmd = sudo_ctx->sudocmd_map;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sudo_sb = sudo_ctx->sudo_sb;
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson state->cmd_threshold = sudo_ctx->sudocmd_threshold;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek state->conv = ipa_sudo_conv_init(state, domain, state->map_rule,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->map_cmdgroup, state->map_cmd,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina map_user, map_group, map_host,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina map_hostgroup);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (state->conv == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto immediately;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (state->cmdgroups_filter != NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina /* We need to fetch additional cmdgroups that may not be revealed
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina * during normal search. Such as when using entryUSN filter in smart
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina * refresh, some command groups may have change but none rule was
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina * modified but we need to fetch associated rules anyway. */
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ipa_sudo_fetch_addtl_cmdgroups(req);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina } else {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ipa_sudo_fetch_rules(req);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EAGAIN) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto immediately;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return req;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaimmediately:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_done(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_post(req, state->ev);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return req;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinastatic errno_t
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinaipa_sudo_fetch_addtl_cmdgroups(struct tevent_req *req)
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina{
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct ipa_sudo_fetch_state *state;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct tevent_req *subreq;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sdap_attr_map *map;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina char *filter;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "About to fetch additional command groups\n");
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina state = tevent_req_data(req, struct ipa_sudo_fetch_state);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina map = state->map_cmdgroup;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina filter = talloc_asprintf(state, "(&(objectClass=%s)%s)",
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina map[IPA_OC_SUDOCMDGROUP].name,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina state->cmdgroups_filter);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (filter == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to build filter\n");
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina subreq = sdap_search_bases_send(state, state->ev, state->sdap_opts,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina state->sh, state->sudo_sb, map, true, 0,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina filter, NULL);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (subreq == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina tevent_req_set_callback(subreq, ipa_sudo_fetch_addtl_cmdgroups_done, req);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return EAGAIN;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina}
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinastatic void
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinaipa_sudo_fetch_addtl_cmdgroups_done(struct tevent_req *subreq)
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina{
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct ipa_sudo_fetch_state *state = NULL;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct tevent_req *req = NULL;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sysdb_attrs **attrs;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina size_t num_attrs;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina char *filter;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina errno_t ret;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina state = tevent_req_data(req, struct ipa_sudo_fetch_state);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = sdap_search_bases_recv(subreq, state, &num_attrs, &attrs);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina talloc_zfree(subreq);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret != EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina DEBUG(SSSDBG_IMPORTANT_INFO, "Received %zu additional command groups\n",
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina num_attrs);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ipa_sudo_filter_rules_bycmdgroups(state, state->domain, attrs,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina num_attrs, state->map_rule,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina &filter);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret != EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to construct rules filter "
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina state->search_filter = sdap_or_filters(state, state->search_filter, filter);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (state->search_filter == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ipa_sudo_fetch_rules(req);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinadone:
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret == EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ipa_sudo_fetch_done(req);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina } else if (ret != EAGAIN) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina tevent_req_error(req, ret);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina}
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_fetch_rules(struct tevent_req *req)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_fetch_state *state;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *subreq;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *host_filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "About to fetch sudo rules\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_fetch_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina map = state->map_rule;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina host_filter = ipa_sudo_host_filter(state, state->host, map);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (host_filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to build host filter\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina filter = talloc_asprintf(state, "(&(objectClass=%s)(%s=TRUE)%s%s)",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina map[IPA_OC_SUDORULE].name,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina map[IPA_AT_SUDORULE_ENABLED].name,
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina host_filter, state->search_filter);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_zfree(host_filter);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to build filter\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina subreq = sdap_search_bases_send(state, state->ev, state->sdap_opts,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sh, state->sudo_sb, map, true, 0,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina filter, NULL);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (subreq == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_set_callback(subreq, ipa_sudo_fetch_rules_done, req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EAGAIN;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_fetch_rules_done(struct tevent_req *subreq)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_fetch_state *state = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *req = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs **attrs;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t num_attrs;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_fetch_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sdap_search_bases_recv(subreq, state, &num_attrs, &attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_zfree(subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_IMPORTANT_INFO, "Received %zu sudo rules\n", num_attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_conv_rules(state->conv, attrs, num_attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Failed when converting rules "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina ret = ipa_sudo_highest_usn(state, attrs, num_attrs, &state->usn);
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina if (ret != EOK) {
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina goto done;
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina }
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_fetch_cmdgroups(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ipa_sudo_fetch_done(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EAGAIN) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_fetch_cmdgroups(struct tevent_req *req)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_fetch_state *state;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *subreq;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "About to fetch sudo command groups\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_fetch_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ipa_sudo_conv_has_cmdgroups(state->conv)) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "No command groups needs to be downloaded\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ipa_sudo_fetch_cmds(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson filter = ipa_sudo_conv_cmdgroup_filter(state, state->conv,
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson state->cmd_threshold);
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to build filter\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina subreq = sdap_search_bases_send(state, state->ev, state->sdap_opts,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sh, state->sudo_sb,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->map_cmdgroup, true, 0,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina filter, NULL);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (subreq == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_set_callback(subreq, ipa_sudo_fetch_cmdgroups_done, req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EAGAIN;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_fetch_cmdgroups_done(struct tevent_req *subreq)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_fetch_state *state = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *req = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs **attrs;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t num_attrs;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_fetch_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sdap_search_bases_recv(subreq, state, &num_attrs, &attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_zfree(subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_IMPORTANT_INFO, "Received %zu sudo command groups\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina num_attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_conv_cmdgroups(state->conv, attrs, num_attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Failed when converting command groups "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina ret = ipa_sudo_highest_usn(state, attrs, num_attrs, &state->usn);
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina if (ret != EOK) {
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina goto done;
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina }
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_fetch_cmds(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ipa_sudo_fetch_done(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EAGAIN) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_fetch_cmds(struct tevent_req *req)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_fetch_state *state;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *subreq;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "About to fetch sudo commands\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_fetch_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ipa_sudo_conv_has_cmds(state->conv)) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "No commands needs to be downloaded\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson filter = ipa_sudo_conv_cmd_filter(state, state->conv, state->cmd_threshold);
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to build filter\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina subreq = sdap_search_bases_send(state, state->ev, state->sdap_opts,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sh, state->sudo_sb,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->map_cmd, true, 0,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina filter, NULL);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (subreq == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_set_callback(subreq, ipa_sudo_fetch_cmds_done, req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EAGAIN;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_fetch_cmds_done(struct tevent_req *subreq)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_fetch_state *state = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *req = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs **attrs;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t num_attrs;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_fetch_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sdap_search_bases_recv(subreq, state, &num_attrs, &attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_zfree(subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_IMPORTANT_INFO, "Received %zu sudo commands\n", num_attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_conv_cmds(state->conv, attrs, num_attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Failed when converting commands "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ipa_sudo_fetch_done(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EAGAIN) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_fetch_done(struct tevent_req *req)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_fetch_state *state = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_fetch_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "About to convert rules\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_conv_result(state, state->conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina &state->rules, &state->num_rules);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to convert rules [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_done(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_fetch_recv(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *req,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs ***_rules,
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina size_t *_num_rules,
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina char **_usn)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_fetch_state *state = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_fetch_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina *_rules = talloc_steal(mem_ctx, state->rules);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina *_num_rules = state->num_rules;
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina *_usn = talloc_steal(mem_ctx, state->usn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct ipa_sudo_refresh_state {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_context *ev;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_ctx *sysdb;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sss_domain_info *domain;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_ctx *sudo_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_options *ipa_opts;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_options *sdap_opts;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina const char *cmdgroups_filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *search_filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *delete_filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_id_op *sdap_op;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_handle *sh;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int dp_error;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs **rules;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t num_rules;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina};
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t ipa_sudo_refresh_retry(struct tevent_req *req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void ipa_sudo_refresh_connect_done(struct tevent_req *subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void ipa_sudo_refresh_host_done(struct tevent_req *subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void ipa_sudo_refresh_done(struct tevent_req *subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct tevent_req *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_refresh_send(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_context *ev,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_ctx *sudo_ctx,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina const char *cmdgroups_filter,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *search_filter,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *delete_filter)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_refresh_state *state;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *req;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina req = tevent_req_create(mem_ctx, &state, struct ipa_sudo_refresh_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (req == NULL) {
c02b8482375837b57cb618ed56d4bede0e006d9dPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->ev = ev;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sysdb = sudo_ctx->id_ctx->be->domain->sysdb;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->domain = sudo_ctx->id_ctx->be->domain;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sudo_ctx = sudo_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->ipa_opts = sudo_ctx->ipa_opts;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sdap_opts = sudo_ctx->sdap_opts;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->dp_error = DP_ERR_FATAL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sdap_op = sdap_id_op_create(state,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina sudo_ctx->id_ctx->conn->conn_cache);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (!state->sdap_op) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "sdap_id_op_create() failed\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto immediately;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina state->cmdgroups_filter = talloc_strdup(state, cmdgroups_filter);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (cmdgroups_filter != NULL && state->cmdgroups_filter == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto immediately;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->search_filter = talloc_strdup(state, search_filter);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (search_filter != NULL && state->search_filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto immediately;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->delete_filter = talloc_strdup(state, delete_filter);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (delete_filter != NULL && state->delete_filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto immediately;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_refresh_retry(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == EAGAIN) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* asynchronous processing */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return req;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaimmediately:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_done(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_post(req, state->ev);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return req;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_refresh_retry(struct tevent_req *req)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_refresh_state *state;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *subreq;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_refresh_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina subreq = sdap_id_op_connect_send(state->sdap_op, state, &ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (subreq == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sdap_id_op_connect_send() failed: "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "%d(%s)\n", ret, strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_set_callback(subreq, ipa_sudo_refresh_connect_done, req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EAGAIN;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_refresh_connect_done(struct tevent_req *subreq)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_refresh_state *state;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *hostname;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *req;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int dp_error;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_refresh_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sdap_id_op_connect_recv(subreq, &dp_error);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_zfree(subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "SUDO LDAP connection failed "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->dp_error = dp_error;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sh = sdap_id_op_handle(state->sdap_op);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "SUDO LDAP connection successful\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "About to fetch host information\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* Obtain host information. */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hostname = dp_opt_get_string(state->ipa_opts->basic, IPA_HOSTNAME);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina subreq = ipa_host_info_send(state, state->ev,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sh, state->sdap_opts, hostname,
60a715a0dd79873d2d2607eab8fdfaf0ffd2e7d3Hristo Venev state->ipa_opts->id->host_map,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->ipa_opts->hostgroup_map,
60a715a0dd79873d2d2607eab8fdfaf0ffd2e7d3Hristo Venev state->ipa_opts->id->sdom->host_search_bases);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (subreq == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->dp_error = DP_ERR_FATAL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ENOMEM);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_set_callback(subreq, ipa_sudo_refresh_host_done, req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_refresh_host_done(struct tevent_req *subreq)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_refresh_state *state;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_hostinfo *host;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *req;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_refresh_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina host = talloc_zero(state, struct ipa_hostinfo);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (host == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->dp_error = DP_ERR_FATAL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ENOMEM);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_host_info_recv(subreq, host, &host->num_hosts, &host->hosts,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina &host->num_hostgroups, &host->hostgroups);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_zfree(subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Unable to retrieve host information "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->dp_error = DP_ERR_FATAL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek subreq = ipa_sudo_fetch_send(state, state->ev, state->domain,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sudo_ctx, host,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sdap_opts->user_map,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sdap_opts->group_map,
60a715a0dd79873d2d2607eab8fdfaf0ffd2e7d3Hristo Venev state->ipa_opts->id->host_map,
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina state->ipa_opts->hostgroup_map, state->sh,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina state->cmdgroups_filter, state->search_filter);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (subreq == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->dp_error = DP_ERR_FATAL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ENOMEM);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_set_callback(subreq, ipa_sudo_refresh_done, req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_refresh_done(struct tevent_req *subreq)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_refresh_state *state;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *req;
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina char *usn = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina bool in_transaction = false;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t sret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_refresh_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina ret = ipa_sudo_fetch_recv(state, subreq, &state->rules,
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina &state->num_rules, &usn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_zfree(subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sdap_id_op_done(state->sdap_op, ret, &state->dp_error);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (state->dp_error == DP_ERR_OK && ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* retry */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_refresh_retry(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_transaction_start(state->sysdb);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Failed to start transaction\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina in_transaction = true;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_sudo_purge(state->domain, state->delete_filter,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->rules, state->num_rules);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_sudo_store(state->domain, state->rules, state->num_rules);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_transaction_commit(state->sysdb);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Failed to commit transaction\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina in_transaction = false;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina if (usn != NULL) {
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina sdap_sudo_set_usn(state->sudo_ctx->id_ctx->srv_opts, usn);
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina }
d06cc0974e59cd6cf1da45cc8c60d6e822b731c2Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Sudo rules are successfully stored in cache\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (in_transaction) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina sret = sysdb_transaction_cancel(state->sysdb);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (sret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Could not cancel transaction\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_done(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaerrno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_refresh_recv(struct tevent_req *req,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int *dp_error,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t *_num_rules)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_refresh_state *state = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_refresh_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina *dp_error = state->dp_error;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (_num_rules != NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina *_num_rules = state->num_rules;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}