sysdb_sudo.c revision db419c61035cb262010cc8d5a4047191c2b60f05
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek Jakub Hrozek <jhrozek@redhat.com>
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek Copyright (C) 2011 Red Hat
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek This program is free software; you can redistribute it and/or modify
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek it under the terms of the GNU General Public License as published by
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek the Free Software Foundation; either version 3 of the License, or
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek (at your option) any later version.
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek This program is distributed in the hope that it will be useful,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek but WITHOUT ANY WARRANTY; without even the implied warranty of
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek GNU General Public License for more details.
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek You should have received a copy of the GNU General Public License
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek along with this program. If not, see <http://www.gnu.org/licenses/>.
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek/* ==================== Utility functions ==================== */
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březinastatic errno_t sysdb_sudo_check_time(struct sysdb_attrs *rule,
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina ret = sysdb_attrs_get_string(rule, SYSDB_SUDO_CACHE_AT_CN, &name);
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina * From man sudoers.ldap:
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek * A timestamp is in the form yyyymmddHHMMSSZ.
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina * If multiple sudoNotBefore entries are present, the *earliest* is used.
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina * If multiple sudoNotAfter entries are present, the *last one* is used.
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek * From sudo sources, ldap.c:
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek * If either the sudoNotAfter or sudoNotBefore attributes are missing,
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek * no time restriction shall be imposed.
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina /* check for sudoNotBefore */
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina ret = sysdb_attrs_get_string_array(rule, SYSDB_SUDO_CACHE_AT_NOTBEFORE,
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina ("notBefore attribute is missing, the rule [%s] is valid\n",
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek for (i=0; values[i] ; i++) {
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek tret = strptime(values[i], SYSDB_SUDO_TIME_FORMAT, &tm);
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina DEBUG(SSSDBG_MINOR_FAILURE, ("Invalid time format in rule [%s]!\n",
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek /* Grab the earliest */
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina /* check for sudoNotAfter */
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina ret = sysdb_attrs_get_string_array(rule, SYSDB_SUDO_CACHE_AT_NOTAFTER,
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina ("notAfter attribute is missing, the rule [%s] is valid\n",
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek for (i=0; values[i] ; i++) {
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek tret = strptime(values[i], SYSDB_SUDO_TIME_FORMAT, &tm);
db419c61035cb262010cc8d5a4047191c2b60f05Pavel Březina DEBUG(SSSDBG_MINOR_FAILURE, ("Invalid time format in rule [%s]!\n",
4be402505ba20b43361753f0e6e1589c9b029e81Jakub Hrozek /* Grab the latest */
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březinaerrno_t sysdb_sudo_filter_rules_by_time(TALLOC_CTX *mem_ctx,
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina bool allowed = false;
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina for (i = 0; i < in_num_rules; i++) {
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina ret = sysdb_sudo_check_time(in_rules[i], now, &allowed);
c9aab1c04c399ca2d1abef74f6df22ced34983dcPavel Březina rules = talloc_realloc(tmp_ctx, rules, struct sysdb_attrs *,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozeksysdb_get_sudo_filter(TALLOC_CTX *mem_ctx, const char *username,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek uid_t uid, char **groupnames, unsigned int flags,
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina /* build specific filter */
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina specific_filter = talloc_zero(tmp_ctx, char); /* assign to tmp_ctx */
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina specific_filter = talloc_asprintf_append(specific_filter, "(%s=ALL)",
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina specific_filter = talloc_asprintf_append(specific_filter, "(%s=defaults)",
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina if ((flags & SYSDB_SUDO_FILTER_USERNAME) && (username != NULL)) {
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina specific_filter = talloc_asprintf_append(specific_filter, "(%s=%s)",
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina if ((flags & SYSDB_SUDO_FILTER_UID) && (uid != 0)) {
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina specific_filter = talloc_asprintf_append(specific_filter, "(%s=#%llu)",
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina (unsigned long long) uid);
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina if ((flags & SYSDB_SUDO_FILTER_GROUPS) && (groupnames != NULL)) {
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina specific_filter = talloc_asprintf_append(specific_filter, "(%s=%%%s)",
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina specific_filter = talloc_asprintf_append(specific_filter, "(%s=+*)",
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina /* build global filter */
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina filter = talloc_asprintf(tmp_ctx, "(&(%s=%s)",
f6171b2bc954a367f316853ab71090eb213bdee3Pavel Březina filter = talloc_asprintf_append(filter, "(|%s)", specific_filter);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozeksysdb_get_sudo_user_info(TALLOC_CTX *mem_ctx, const char *username,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ret = sysdb_search_user_by_name(tmp_ctx, sysdb, username,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("Error looking up user %s\n", username));
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek uid = ldb_msg_find_attr_as_uint64(msg, SYSDB_UIDNUM, 0);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("A user with no UID?\n"));
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek groups = ldb_msg_find_element(msg, SYSDB_MEMBEROF);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* No groups for this user in sysdb currently */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek sysdb_groupnames = talloc_array(tmp_ctx, char *, groups->num_values+1);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* Get a list of the groups by groupname only */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek *groupnames = talloc_steal(mem_ctx, sysdb_groupnames);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozeksysdb_sudo_purge_subdir(struct sysdb_ctx *sysdb,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek base_dn = sysdb_custom_subtree_dn(sysdb, tmp_ctx, domain->name, subdir);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ret = sysdb_delete_recursive(sysdb, base_dn, true);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("sysdb_delete_recursive failed.\n"));
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozeksysdb_save_sudorule(struct sysdb_ctx *sysdb_ctx,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("Adding sudo rule %s\n", rule_name));
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ret = sysdb_attrs_add_string(attrs, SYSDB_OBJECTCLASS,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Could not set rule object class [%d]: %s\n",
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, rule_name);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Could not set name attribute [%d]: %s\n",
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ret = sysdb_store_custom(sysdb_ctx, rule_name, SUDORULE_SUBDIR, attrs);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("sysdb_store_custom failed [%d]: %s\n",
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozeksysdb_purge_sudorule_subtree(struct sysdb_ctx *sysdb,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek const char *name;
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* just purge all if there's no filter */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek return sysdb_sudo_purge_subdir(sysdb, domain, SUDORULE_SUBDIR);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek /* match entries based on the filter and remove them one by one */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ret = sysdb_search_custom(tmp_ctx, sysdb, filter,
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("Error looking up SUDO rules"));
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("No rules matched\n"));
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek for (i = 0; i < count; i++) {
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek name = ldb_msg_find_attr_as_string(msgs[i], SYSDB_NAME, NULL);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("A rule without a name?\n"));
f643754db81eeade60485bbe3d80324d889cc4f3Pavel Březina /* skip this one but still delete other entries */
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek ret = sysdb_delete_custom(sysdb, name, SUDORULE_SUBDIR);
3f98cdc011bb4e8cd22c088f288b0bcdb6452492Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Could not delete rule %s\n", name));
1a542b3698d8c42cf075b722f8838f106eb09fccPavel Březinaerrno_t sysdb_sudo_set_refreshed(struct sysdb_ctx *sysdb,
1a542b3698d8c42cf075b722f8838f106eb09fccPavel Březina dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_TMPL_CUSTOM_SUBTREE,
1a542b3698d8c42cf075b722f8838f106eb09fccPavel Březina ret = sysdb_set_bool(sysdb, dn, SUDORULE_SUBDIR,
1a542b3698d8c42cf075b722f8838f106eb09fccPavel Březinaerrno_t sysdb_sudo_get_refreshed(struct sysdb_ctx *sysdb,
1a542b3698d8c42cf075b722f8838f106eb09fccPavel Březina dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_TMPL_CUSTOM_SUBTREE,