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 <ldb.h>
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include <talloc.h>
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include <dhash.h>
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "providers/ldap/sdap.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "providers/ipa/ipa_common.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "providers/ipa/ipa_dn.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "db/sysdb_sudo.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "db/sysdb.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "util/util.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#define SUDO_DN_CMDGROUPS "sudocmdgroups"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#define SUDO_DN_CMDS "sudocmds"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#define SUDO_DN_CONTAINER "sudo"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#define SUDO_DN_CN "cn"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#define MATCHDN(cat) SUDO_DN_CN, (cat), SUDO_DN_CN, SUDO_DN_CONTAINER
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#define MATCHDN_CMDGROUPS MATCHDN(SUDO_DN_CMDGROUPS)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#define MATCHDN_CMDS MATCHDN(SUDO_DN_CMDS)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina#define MATCHRDN_CMDGROUPS(map) (map)[IPA_AT_SUDOCMDGROUP_NAME].name, MATCHDN_CMDGROUPS
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina#define MATCHRDN_CMDS(attr, map) (map)[attr].name, MATCHDN_CMDS
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#define MATCHRDN_USER(map) (map)[SDAP_AT_USER_NAME].name, "cn", "users", "cn", "accounts"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#define MATCHRDN_GROUP(map) (map)[SDAP_AT_GROUP_NAME].name, "cn", "groups", "cn", "accounts"
60a715a0dd79873d2d2607eab8fdfaf0ffd2e7d3Hristo Venev#define MATCHRDN_HOST(map) (map)[SDAP_AT_HOST_FQDN].name, "cn", "computers", "cn", "accounts"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#define MATCHRDN_HOSTGROUP(map) (map)[IPA_AT_HOSTGROUP_NAME].name, "cn", "hostgroups", "cn", "accounts"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct ipa_sudo_conv {
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek struct sss_domain_info *dom;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_rule;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_cmdgroup;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_cmd;
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;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hash_table_t *rules;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hash_table_t *cmdgroups;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hash_table_t *cmds;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina};
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct ipa_sudo_dn_list {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_dn_list *prev, *next;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *dn;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina};
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct ipa_sudo_rulemember {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_dn_list *cmdgroups;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_dn_list *cmds;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina};
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct ipa_sudo_rule {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs *attrs;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_rulemember allow;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_rulemember deny;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina};
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct ipa_sudo_cmdgroup {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_dn_list *cmds;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char **expanded;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina};
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic size_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_dn_list_count(struct ipa_sudo_dn_list *list)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_dn_list *item;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t i;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (i = 0, item = list; item != NULL; item = item->next, i++) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* no op */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return i;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_conv_store(hash_table_t *table,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *key,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina void *value)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hash_key_t hkey;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hash_value_t hvalue;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int hret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (table == NULL || key == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EINVAL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hkey.type = HASH_KEY_STRING;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hkey.str = discard_const(key);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* If value is NULL we don't want to override existing entry. */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (value == NULL && hash_has_key(table, &hkey)) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EEXIST;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hvalue.type = HASH_VALUE_PTR;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hvalue.ptr = value;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hret = hash_enter(table, &hkey, &hvalue);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (hret != HASH_SUCCESS) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EIO;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (value != NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_steal(table, value);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_conv_lookup(hash_table_t *table,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *key)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hash_key_t hkey;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hash_value_t hvalue;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int hret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hkey.type = HASH_KEY_STRING;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hkey.str = discard_const(key);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hret = hash_lookup(table, &hkey, &hvalue);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (hret == HASH_ERROR_KEY_NOT_FOUND) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Key not found %s\n", key);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (hret != HASH_SUCCESS) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to lookup value [%d]\n", hret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return hvalue.ptr;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastore_rulemember(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_dn_list **list,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hash_table_t *table,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *dn)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_dn_list *item;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina item = talloc_zero(mem_ctx, struct ipa_sudo_dn_list);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (item == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_conv_store(table, dn, NULL);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK && ret != EEXIST) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to store DN %s [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina dn, ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina item->dn = talloc_steal(item, dn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DLIST_ADD(*list, item);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK && ret != EEXIST) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(item);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březinastatic bool is_ipacmdgroup(struct ipa_sudo_conv *conv, const char *dn)
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina{
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek if (ipa_check_rdn_bool(conv->dom->sysdb, dn,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina MATCHRDN_CMDGROUPS(conv->map_cmdgroup))) {
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina return true;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina }
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina return false;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina}
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březinastatic bool is_ipacmd(struct ipa_sudo_conv *conv, const char *dn)
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina{
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek if (ipa_check_rdn_bool(conv->dom->sysdb, dn,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina MATCHRDN_CMDS(IPA_AT_SUDOCMD_UUID, conv->map_cmd))) {
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina return true;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina }
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina /* For older versions of FreeIPA than 3.1. */
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek if (ipa_check_rdn_bool(conv->dom->sysdb, dn,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina MATCHRDN_CMDS(IPA_AT_SUDOCMD_CMD, conv->map_cmd))) {
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina return true;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina }
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina return false;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina}
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaprocess_rulemember(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_rulemember *rulemember,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs *rule,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *attr)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina TALLOC_CTX *tmp_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char **members;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int i;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tmp_ctx = talloc_new(NULL);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (tmp_ctx == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_attrs_get_string_array(rule, attr, tmp_ctx, &members);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == ENOENT) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (i = 0; members[i] != NULL; i++) {
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina if (is_ipacmdgroup(conv, members[i])) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = store_rulemember(mem_ctx, &rulemember->cmdgroups,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina conv->cmdgroups, members[i]);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_INTERNAL, "Found sudo command group %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina members[i]);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EEXIST) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina } else if (is_ipacmd(conv, members[i])) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = store_rulemember(mem_ctx, &rulemember->cmds,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina conv->cmds, members[i]);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == EOK) {
b0c4eb194cf1414d3440e0cccfb9af9074388c08Pavel Březina DEBUG(SSSDBG_TRACE_INTERNAL, "Found sudo command %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina members[i]);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EEXIST) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_MINOR_FAILURE, "Invalid member DN %s, skipping...\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina members[i]);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina continue;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(tmp_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaprocess_allowcmd(struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_rule *rule)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return process_rulemember(rule, conv, &rule->allow, rule->attrs,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina SYSDB_IPA_SUDORULE_ALLOWCMD);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaprocess_denycmd(struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_rule *rule)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return process_rulemember(rule, conv, &rule->deny, rule->attrs,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina SYSDB_IPA_SUDORULE_DENYCMD);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaprocess_cmdgroupmember(struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_cmdgroup *cmdgroup,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs *attrs)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina TALLOC_CTX *tmp_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_dn_list *item;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char **members;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int i;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tmp_ctx = talloc_new(NULL);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (tmp_ctx == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_attrs_get_string_array(attrs, SYSDB_MEMBER, tmp_ctx, &members);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == ENOENT) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (i = 0; members[i] != NULL; i++) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_conv_store(conv->cmds, members[i], NULL);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_INTERNAL, "Found sudo command %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina members[i]);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EEXIST) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to store DN [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina item = talloc_zero(tmp_ctx, struct ipa_sudo_dn_list);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (item == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina item->dn = talloc_steal(item, members[i]);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DLIST_ADD(cmdgroup->cmds, item);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_steal(cmdgroup, item);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(tmp_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct ipa_sudo_conv *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_conv_init(TALLOC_CTX *mem_ctx,
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek struct sss_domain_info *dom,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_rule,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_cmdgroup,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sdap_attr_map *map_cmd,
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)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv *conv;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina conv = talloc_zero(mem_ctx, struct ipa_sudo_conv);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (conv == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek conv->dom = dom;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina conv->map_rule = map_rule;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina conv->map_cmdgroup = map_cmdgroup;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina conv->map_cmd = map_cmd;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina conv->map_user = map_user;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina conv->map_group = map_group;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina conv->map_host = map_host;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina conv->map_hostgroup = map_hostgroup;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sss_hash_create(conv, 20, &conv->rules);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table [%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 = sss_hash_create(conv, 20, &conv->cmdgroups);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table [%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 = sss_hash_create(conv, 20, &conv->cmds);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina 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 talloc_free(conv);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return conv;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaerrno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_conv_rules(struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs **rules,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t num_rules)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_rule *rule = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *key;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t i;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (num_rules == 0) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* We're done here. */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (i = 0; i < num_rules; i++) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_attrs_get_string(rules[i], SYSDB_NAME, &key);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_MINOR_FAILURE, "Failed to get rule name, skipping "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina continue;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina rule = talloc_zero(conv->rules, struct ipa_sudo_rule);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (rule == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina rule->attrs = rules[i];
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = process_allowcmd(conv, rule);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK && ret != EEXIST) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Failed to process memberAllowCmd "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = process_denycmd(conv, rule);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK && ret != EEXIST) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Failed to process memberDenyCmd "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_conv_store(conv->rules, key, rule);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Failed to store rule into table "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_steal(rule, rule->attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina rule = NULL;
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 talloc_free(rule);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaerrno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_conv_cmdgroups(struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs **cmdgroups,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t num_cmdgroups)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_cmdgroup *cmdgroup = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *key;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t i;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (num_cmdgroups == 0) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* We're done here. */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (i = 0; i < num_cmdgroups; i++) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_attrs_get_string(cmdgroups[i], SYSDB_ORIG_DN, &key);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_MINOR_FAILURE, "Failed to get command group DN, "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "skipping [%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina continue;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina cmdgroup = talloc_zero(conv->cmdgroups, struct ipa_sudo_cmdgroup);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (cmdgroup == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = process_cmdgroupmember(conv, cmdgroup, cmdgroups[i]);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Failed to process member "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_conv_store(conv->cmdgroups, key, cmdgroup);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Failed to store command group into "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "table [%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina cmdgroup = NULL;
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 talloc_free(cmdgroup);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaerrno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_conv_cmds(struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs **cmds,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t num_cmds)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *key;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *cmd;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t i;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (num_cmds == 0) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* We're done here. */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (i = 0; i < num_cmds; i++) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_attrs_get_string(cmds[i], SYSDB_ORIG_DN, &key);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_MINOR_FAILURE, "Failed to get command DN, skipping "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina continue;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_attrs_get_string(cmds[i], SYSDB_IPA_SUDOCMD_SUDOCMD, &cmd);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_MINOR_FAILURE, "Failed to get command, skipping "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina continue;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_conv_store(conv->cmds, key, discard_const(cmd));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Failed to store command into table "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinabool
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_conv_has_cmdgroups(struct ipa_sudo_conv *conv)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return hash_count(conv->cmdgroups) == 0;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinabool
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_conv_has_cmds(struct ipa_sudo_conv *conv)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return hash_count(conv->cmds) == 0;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephensonbool
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephensonipa_sudo_cmdgroups_exceed_threshold(struct ipa_sudo_conv *conv, int threshold)
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson{
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson return (hash_count(conv->cmdgroups)) > threshold;
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson}
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephensonbool
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephensonipa_sudo_cmds_exceed_threshold(struct ipa_sudo_conv *conv, int threshold)
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson{
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson return (hash_count(conv->cmds)) > threshold;
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson}
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březinatypedef errno_t (*ipa_sudo_conv_rdn_fn)(TALLOC_CTX *mem_ctx,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina struct sdap_attr_map *map,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina struct sysdb_ctx *sysdb,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina const char *dn,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina char **_rdn_val,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina const char **_rdn_attr);
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březinastatic errno_t get_sudo_cmdgroup_rdn(TALLOC_CTX *mem_ctx,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina struct sdap_attr_map *map,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina struct sysdb_ctx *sysdb,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina const char *dn,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina char **_rdn_val,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina const char **_rdn_attr)
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina{
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina char *rdn_val;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina errno_t ret;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina ret = ipa_get_rdn(mem_ctx, sysdb, dn, &rdn_val,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina MATCHRDN_CMDGROUPS(map));
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina if (ret != EOK) {
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina return ret;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina }
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina *_rdn_val = rdn_val;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina *_rdn_attr = map[IPA_AT_SUDOCMDGROUP_NAME].name;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina return EOK;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina}
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březinastatic errno_t get_sudo_cmd_rdn(TALLOC_CTX *mem_ctx,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina struct sdap_attr_map *map,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina struct sysdb_ctx *sysdb,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina const char *dn,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina char **_rdn_val,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina const char **_rdn_attr)
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina{
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina char *rdn_val;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina errno_t ret;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina ret = ipa_get_rdn(mem_ctx, sysdb, dn, &rdn_val,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina MATCHRDN_CMDS(IPA_AT_SUDOCMD_UUID, map));
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina if (ret == EOK) {
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina *_rdn_val = rdn_val;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina *_rdn_attr = map[IPA_AT_SUDOCMD_UUID].name;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina return EOK;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina } else if (ret != ENOENT) {
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina return ret;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina }
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina /* For older versions of FreeIPA than 3.1. */
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina ret = ipa_get_rdn(mem_ctx, sysdb, dn, &rdn_val,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina MATCHRDN_CMDS(IPA_AT_SUDOCMD_CMD, map));
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina if (ret != EOK) {
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina return ret;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina }
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina *_rdn_val = rdn_val;
b9941359b3181c42f415530d5ccad0f4664d85faLukas Slebodnik *_rdn_attr = map[IPA_AT_SUDOCMD_CMD].name;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina return EOK;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina}
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic char *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinabuild_filter(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_ctx *sysdb,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hash_table_t *table,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina struct sdap_attr_map *map,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina ipa_sudo_conv_rdn_fn rdn_fn)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina TALLOC_CTX *tmp_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hash_key_t *keys;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina unsigned long int count;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina unsigned long int i;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *rdn_val;
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina const char *rdn_attr;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *safe_rdn;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int hret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
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 hret = hash_keys(table, &count, &keys);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (hret != HASH_SUCCESS) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_steal(tmp_ctx, keys);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina filter = talloc_strdup(tmp_ctx, "");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (i = 0; i < count; i++) {
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina ret = rdn_fn(tmp_ctx, map, sysdb, keys[i].str, &rdn_val, &rdn_attr);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get member %s [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina keys[i].str, ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sss_filter_sanitize(tmp_ctx, rdn_val, &safe_rdn);
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 goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina filter = talloc_asprintf_append(filter, "(%s=%s)", rdn_attr, safe_rdn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina /* objectClass is always first */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina filter = talloc_asprintf(filter, "(&(objectClass=%s)(|%s))",
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina map[0].name, filter);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_steal(mem_ctx, filter);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(tmp_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinachar *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_conv_cmdgroup_filter(TALLOC_CTX *mem_ctx,
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson struct ipa_sudo_conv *conv,
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson int cmd_threshold)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson if (ipa_sudo_cmdgroups_exceed_threshold(conv, cmd_threshold)) {
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson DEBUG(SSSDBG_TRACE_FUNC,
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson "Command threshold [%d] exceeded, retrieving all sudo command "
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson "groups\n", cmd_threshold);
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson return talloc_asprintf(mem_ctx, "(objectClass=%s)",
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson conv->map_cmdgroup->name);
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson } else {
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson return build_filter(mem_ctx, conv->dom->sysdb, conv->cmdgroups,
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson conv->map_cmdgroup, get_sudo_cmdgroup_rdn);
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinachar *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_conv_cmd_filter(TALLOC_CTX *mem_ctx,
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson struct ipa_sudo_conv *conv,
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson int cmd_threshold)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson if (ipa_sudo_cmdgroups_exceed_threshold(conv, cmd_threshold)) {
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson DEBUG(SSSDBG_TRACE_FUNC,
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson "Command threshold [%d] exceeded, retrieving all sudo commands\n",
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson cmd_threshold);
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson return talloc_asprintf(mem_ctx, "(objectClass=%s)",
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson conv->map_cmd->name);
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson } else {
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson return build_filter(mem_ctx, conv->dom->sysdb, conv->cmds,
84060f52e782b079337ee7a99bb7ad17e8c84fbbPavel Březina conv->map_cmd, get_sudo_cmd_rdn);
bc854800cc67271205d63136daaf68d7863cea6bJustin Stephenson }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct ipa_sudo_conv_result_ctx {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv *conv;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs **rules;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t num_rules;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina};
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic const char *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaconvert_host(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv *conv,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson const char *value,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson bool *skip_entry)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *rdn;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *group;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson *skip_entry = false;
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek ret = ipa_get_rdn(mem_ctx, conv->dom->sysdb, value, &rdn,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina MATCHRDN_HOST(conv->map_host));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return rdn;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != ENOENT) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "ipa_get_rdn() failed on value %s [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina value, ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek ret = ipa_get_rdn(mem_ctx, conv->dom->sysdb, value, &rdn,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina MATCHRDN_HOSTGROUP(conv->map_hostgroup));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == ENOENT) {
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson DEBUG(SSSDBG_CRIT_FAILURE, "Unexpected DN %s: Skipping\n", value);
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson *skip_entry = true;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "ipa_get_rdn() failed on value %s [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina value, ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina group = talloc_asprintf(mem_ctx, "+%s", rdn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(rdn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return group;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic const char *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaconvert_user(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv *conv,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson const char *value,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson bool *skip_entry)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *rdn;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *group;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson *skip_entry = false;
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek ret = ipa_get_rdn(mem_ctx, conv->dom->sysdb, value, &rdn,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina MATCHRDN_USER(conv->map_user));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return rdn;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != ENOENT) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "ipa_get_rdn() failed on value %s [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina value, ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek ret = ipa_get_rdn(mem_ctx, conv->dom->sysdb, value, &rdn,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina MATCHRDN_GROUP(conv->map_group));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == ENOENT) {
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson DEBUG(SSSDBG_CRIT_FAILURE, "Unexpected DN %s: Skipping\n", value);
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson *skip_entry = true;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "ipa_get_rdn() failed on value %s [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina value, ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina group = talloc_asprintf(mem_ctx, "%%%s", rdn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(rdn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return group;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozekstatic const char *
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozekconvert_user_fqdn(TALLOC_CTX *mem_ctx,
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek struct ipa_sudo_conv *conv,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson const char *value,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson bool *skip_entry)
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek{
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek const char *shortname = NULL;
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek char *fqdn = NULL;
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson *skip_entry = false;
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson shortname = convert_user(mem_ctx, conv, value, skip_entry);
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek if (shortname == NULL) {
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek return NULL;
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek }
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek fqdn = sss_create_internal_fqname(mem_ctx, shortname, conv->dom->name);
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek talloc_free(discard_const(shortname));
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek return fqdn;
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek}
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek
0f6b5b02afb35caae774ff4d52854a844d49f52eJakub Hrozekstatic const char *
0f6b5b02afb35caae774ff4d52854a844d49f52eJakub Hrozekconvert_ext_user(TALLOC_CTX *mem_ctx,
0f6b5b02afb35caae774ff4d52854a844d49f52eJakub Hrozek struct ipa_sudo_conv *conv,
0f6b5b02afb35caae774ff4d52854a844d49f52eJakub Hrozek const char *value,
0f6b5b02afb35caae774ff4d52854a844d49f52eJakub Hrozek bool *skip_entry)
0f6b5b02afb35caae774ff4d52854a844d49f52eJakub Hrozek{
0f6b5b02afb35caae774ff4d52854a844d49f52eJakub Hrozek return sss_create_internal_fqname(mem_ctx, value, conv->dom->name);
0f6b5b02afb35caae774ff4d52854a844d49f52eJakub Hrozek}
0f6b5b02afb35caae774ff4d52854a844d49f52eJakub Hrozek
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic const char *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaconvert_group(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv *conv,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson const char *value,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson bool *skip_entry)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *rdn;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson *skip_entry = false;
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek ret = ipa_get_rdn(mem_ctx, conv->dom->sysdb, value, &rdn,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina MATCHRDN_GROUP(conv->map_group));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == ENOENT) {
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson DEBUG(SSSDBG_CRIT_FAILURE, "Unexpected DN %s: Skipping\n", value);
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson *skip_entry = true;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "ipa_get_rdn() failed on value %s [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina value, ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return rdn;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a7d2b4f157194c14bc4a40c74f6416b82befa460Pavel Březinastatic const char *
a7d2b4f157194c14bc4a40c74f6416b82befa460Pavel Březinaconvert_runasextusergroup(TALLOC_CTX *mem_ctx,
a7d2b4f157194c14bc4a40c74f6416b82befa460Pavel Březina struct ipa_sudo_conv *conv,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson const char *value,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson bool *skip_entry)
a7d2b4f157194c14bc4a40c74f6416b82befa460Pavel Březina{
a7d2b4f157194c14bc4a40c74f6416b82befa460Pavel Březina return talloc_asprintf(mem_ctx, "%%%s", value);
a7d2b4f157194c14bc4a40c74f6416b82befa460Pavel Březina}
a7d2b4f157194c14bc4a40c74f6416b82befa460Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic const char *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaconvert_cat(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv *conv,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson const char *value,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson bool *skip_entry)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson *skip_entry = false;
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (strcmp(value, "all") == 0) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return talloc_strdup(mem_ctx, "ALL");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return value;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaconvert_attributes(struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_rule *rule,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs *attrs)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina TALLOC_CTX *tmp_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char **values;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *value;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int i, j;
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson bool skip_entry;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina static struct {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *ipa;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *sudo;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *(*conv_fn)(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv *conv,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson const char *value,
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson bool *skip_entry);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } table[] = {{SYSDB_NAME, SYSDB_SUDO_CACHE_AT_CN , NULL},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_HOST, SYSDB_SUDO_CACHE_AT_HOST , convert_host},
64497d479e92ebc34717c20c3d017f1823f9e630Jakub Hrozek {SYSDB_IPA_SUDORULE_USER, SYSDB_SUDO_CACHE_AT_USER , convert_user_fqdn},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_RUNASUSER, SYSDB_SUDO_CACHE_AT_RUNASUSER , convert_user},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_RUNASGROUP, SYSDB_SUDO_CACHE_AT_RUNASGROUP , convert_group},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_OPTION, SYSDB_SUDO_CACHE_AT_OPTION , NULL},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_NOTAFTER, SYSDB_SUDO_CACHE_AT_NOTAFTER , NULL},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_NOTBEFORE, SYSDB_SUDO_CACHE_AT_NOTBEFORE , NULL},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_SUDOORDER, SYSDB_SUDO_CACHE_AT_ORDER , NULL},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_CMDCATEGORY, SYSDB_SUDO_CACHE_AT_COMMAND , convert_cat},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_HOSTCATEGORY, SYSDB_SUDO_CACHE_AT_HOST , convert_cat},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_USERCATEGORY, SYSDB_SUDO_CACHE_AT_USER , convert_cat},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_RUNASUSERCATEGORY, SYSDB_SUDO_CACHE_AT_RUNASUSER , convert_cat},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_RUNASGROUPCATEGORY, SYSDB_SUDO_CACHE_AT_RUNASGROUP , convert_cat},
a7d2b4f157194c14bc4a40c74f6416b82befa460Pavel Březina {SYSDB_IPA_SUDORULE_RUNASEXTUSER, SYSDB_SUDO_CACHE_AT_RUNASUSER , NULL},
a7d2b4f157194c14bc4a40c74f6416b82befa460Pavel Březina {SYSDB_IPA_SUDORULE_RUNASEXTGROUP, SYSDB_SUDO_CACHE_AT_RUNASGROUP , NULL},
a7d2b4f157194c14bc4a40c74f6416b82befa460Pavel Březina {SYSDB_IPA_SUDORULE_RUNASEXTUSERGROUP, SYSDB_SUDO_CACHE_AT_RUNASUSER , convert_runasextusergroup},
0f6b5b02afb35caae774ff4d52854a844d49f52eJakub Hrozek {SYSDB_IPA_SUDORULE_EXTUSER, SYSDB_SUDO_CACHE_AT_USER , convert_ext_user},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_ALLOWCMD, SYSDB_IPA_SUDORULE_ORIGCMD , NULL},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {SYSDB_IPA_SUDORULE_DENYCMD, SYSDB_IPA_SUDORULE_ORIGCMD , NULL},
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina {NULL, NULL, NULL}};
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tmp_ctx = talloc_new(NULL);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (tmp_ctx == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (i = 0; table[i].ipa != NULL; i++) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_attrs_get_string_array(rule->attrs, table[i].ipa,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tmp_ctx, &values);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == ENOENT) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina continue;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to read attribute "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "%s [%d]: %s\n", table[i].ipa, ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (j = 0; values[j] != NULL; j++) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (table[i].conv_fn != NULL) {
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson value = table[i].conv_fn(tmp_ctx, conv, values[j], &skip_entry);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (value == NULL) {
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson if (skip_entry) {
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson continue;
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson } else {
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson ret = ENOMEM;
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson goto done;
d0aae3c1e87e2e51ab178b7b343261443094a974Justin Stephenson }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina value = values[j];
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_attrs_add_string_safe(attrs, table[i].sudo, value);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to add attribute "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "%s [%d]: %s\n", table[i].sudo, ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(tmp_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic const char **
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinacombine_cmdgroups(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_dn_list *list)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina TALLOC_CTX *tmp_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_cmdgroup *cmdgroup;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_dn_list *listitem;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char **values = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
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 values = talloc_zero_array(tmp_ctx, const char *, 1);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (values == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(tmp_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DLIST_FOR_EACH(listitem, list) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina cmdgroup = ipa_sudo_conv_lookup(conv->cmdgroups, listitem->dn);
e547eb597ade731f49b679ce264bbfd907363ff8Lukas Slebodnik if (cmdgroup == NULL) {
e547eb597ade731f49b679ce264bbfd907363ff8Lukas Slebodnik DEBUG(SSSDBG_MINOR_FAILURE,
e547eb597ade731f49b679ce264bbfd907363ff8Lukas Slebodnik "ipa_sudo_conv_lookup failed for DN:%s\n", listitem->dn);
e547eb597ade731f49b679ce264bbfd907363ff8Lukas Slebodnik continue;
e547eb597ade731f49b679ce264bbfd907363ff8Lukas Slebodnik }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = add_strings_lists(mem_ctx, values, cmdgroup->expanded,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina false, discard_const(&values));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(tmp_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_steal(mem_ctx, values);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(tmp_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return values;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic const char **
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinacombine_cmds(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_dn_list *list)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_dn_list *listitem;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char **values;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *command;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t count;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t i;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina count = ipa_sudo_dn_list_count(list);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina values = talloc_zero_array(mem_ctx, const char *, count + 1);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (values == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina i = 0;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DLIST_FOR_EACH(listitem, list) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina command = ipa_sudo_conv_lookup(conv->cmds, listitem->dn);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (command == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina continue;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina values[i] = command;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina i++;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return values;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinabuild_sudocommand(struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_rulemember *mlist,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs *attrs,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char prefix)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina TALLOC_CTX *tmp_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char **cmds[2];
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char *command;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int i, j;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tmp_ctx = talloc_new(NULL);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (tmp_ctx == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina cmds[0] = combine_cmdgroups(tmp_ctx, conv, mlist->cmdgroups);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (cmds[0] == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina cmds[1] = combine_cmds(tmp_ctx, conv, mlist->cmds);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (cmds[1] == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (i = 0; i < 2; i++) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina for (j = 0; cmds[i][j] != NULL; j++) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (prefix == '\0') {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina command = cmds[i][j];
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina command = talloc_asprintf(tmp_ctx, "%c%s", prefix, cmds[i][j]);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (command == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_attrs_add_string_safe(attrs,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina SYSDB_SUDO_CACHE_AT_COMMAND, command);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to add attribute "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "%s [%d]: %s\n", SYSDB_SUDO_CACHE_AT_COMMAND,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(tmp_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaconvert_sudocommand(struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_rule *rule,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs *attrs)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina TALLOC_CTX *tmp_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina errno_t ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tmp_ctx = talloc_new(NULL);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (tmp_ctx == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = build_sudocommand(conv, &rule->allow, attrs, '\0');
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to build allow commands "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = build_sudocommand(conv, &rule->deny, attrs, '!');
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to build deny commands "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", 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 talloc_free(tmp_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic bool
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinarules_iterator(hash_entry_t *item,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina void *user_data)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv_result_ctx *ctx = user_data;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_rule *rule = item->value.ptr;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs *attrs;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ctx == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Bug: ctx is NULL\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return false;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (rule == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Bug: rule is NULL\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx->ret = ERR_INTERNAL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return false;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina attrs = sysdb_new_attrs(ctx->rules);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (attrs == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx->ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return false;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx->ret = convert_attributes(ctx->conv, rule, attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ctx->ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Unable to convert attributes [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx->ret, sss_strerror(ctx->ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return false;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx->ret = convert_sudocommand(ctx->conv, rule, attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ctx->ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Unable to build sudoCommand [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx->ret, sss_strerror(ctx->ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(attrs);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return false;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx->rules[ctx->num_rules] = attrs;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx->num_rules++;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return true;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic bool
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinacmdgroups_iterator(hash_entry_t *item,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina void *user_data)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv_result_ctx *ctx = user_data;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_cmdgroup *cmdgroup = item->value.ptr;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina const char **values;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ctx == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Bug: ctx is NULL\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return false;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (cmdgroup == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Bug: rule is NULL\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx->ret = ERR_INTERNAL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return false;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina values = combine_cmds(cmdgroup, ctx->conv, cmdgroup->cmds);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (values == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to expand commands\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx->ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return false;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina cmdgroup->expanded = values;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx->ret = EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return true;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaerrno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_conv_result(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv *conv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs ***_rules,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina size_t *_num_rules)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_conv_result_ctx ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sysdb_attrs **rules;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina unsigned long num_rules;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int hret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina num_rules = hash_count(conv->rules);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (num_rules == 0) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina *_rules = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina *_num_rules = 0;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx.conv = conv;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx.rules = NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx.num_rules = 0;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* If there are no cmdgroups the iterator is not called and ctx.ret is
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina * uninitialized. Since it is ok that there are no cmdgroups initializing
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina * ctx.ret to EOK. */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx.ret = EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* Expand commands in command groups. */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hret = hash_iterate(conv->cmdgroups, cmdgroups_iterator, &ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (hret != HASH_SUCCESS) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Unable to iterate over command groups "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]\n", hret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EIO;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ctx.ret != EOK) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to expand command groups "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "[%d]: %s\n", ctx.ret, sss_strerror(ctx.ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ctx.ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* Convert rules. */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina rules = talloc_zero_array(mem_ctx, struct sysdb_attrs *, num_rules);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (rules == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx.rules = rules;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx.num_rules = 0;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina hret = hash_iterate(conv->rules, rules_iterator, &ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (hret != HASH_SUCCESS) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Unable to iterate over rules [%d]\n", hret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EIO;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ctx.ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to convert rules [%d]: %s\n",
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ctx.ret, sss_strerror(ctx.ret));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_free(rules);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ctx.ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina *_rules = ctx.rules;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina *_num_rules = ctx.num_rules;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}