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 <errno.h>
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include <talloc.h>
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include <tevent.h>
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "util/util.h"
3b99f7a97553a0a357d50abe507d4f0060c4eceaPavel Březina#include "providers/be_ptask.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "providers/ipa/ipa_sudo.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "providers/ldap/sdap_sudo_shared.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina#include "db/sysdb_sudo.h"
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct ipa_sudo_full_refresh_state {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_ctx *sudo_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct sss_domain_info *domain;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int dp_error;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina};
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void ipa_sudo_full_refresh_done(struct tevent_req *subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastruct tevent_req *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_full_refresh_send(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_context *ev,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_ctx *sudo_ctx)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_full_refresh_state *state;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *subreq;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *req;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina char *delete_filter;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina req = tevent_req_create(mem_ctx, &state,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_full_refresh_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (req == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return NULL;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->domain = sudo_ctx->id_ctx->be->domain;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state->sudo_ctx = sudo_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina /* Remove all rules from cache */
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina delete_filter = talloc_asprintf(state, "(%s=%s)", SYSDB_OBJECTCLASS,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina SYSDB_SUDO_CACHE_OC);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (delete_filter == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto immediately;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Issuing a full refresh of sudo rules\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina subreq = ipa_sudo_refresh_send(state, ev, sudo_ctx,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina NULL, NULL, delete_filter);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (subreq == NULL) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ENOMEM;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto immediately;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_set_callback(subreq, ipa_sudo_full_refresh_done, req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return req;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaimmediately:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret == EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_done(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina } else {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_post(req, ev);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return req;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic void
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_full_refresh_done(struct tevent_req *subreq)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_full_refresh_state *state;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_req *req;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int ret;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_full_refresh_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = ipa_sudo_refresh_recv(subreq, &state->dp_error, NULL);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina talloc_zfree(subreq);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK || state->dp_error != DP_ERR_OK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina goto done;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ret = sysdb_sudo_set_last_full_refresh(state->domain, time(NULL));
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_MINOR_FAILURE, "Unable to save time of "
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina "a successful full refresh\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Successful full refresh of sudo rules\n");
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinadone:
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina if (ret != EOK) {
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_error(req, ret);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina }
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina tevent_req_done(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaint
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_full_refresh_recv(struct tevent_req *req,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int *dp_error)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_full_refresh_state *state;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina state = tevent_req_data(req, struct ipa_sudo_full_refresh_state);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina *dp_error = state->dp_error;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return EOK;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinastruct ipa_sudo_smart_refresh_state {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina int dp_error;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina};
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinastatic void ipa_sudo_smart_refresh_done(struct tevent_req *subreq);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinastatic struct tevent_req *
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinaipa_sudo_smart_refresh_send(TALLOC_CTX *mem_ctx,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct tevent_context *ev,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct ipa_sudo_ctx *sudo_ctx)
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina{
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct sdap_server_opts *srv_opts = sudo_ctx->id_ctx->srv_opts;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct ipa_sudo_smart_refresh_state *state;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct tevent_req *subreq;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct tevent_req *req;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina char *cmdgroups_filter;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina char *search_filter;
ef5e33f7db1e314226b0077596e38ef16305cba5Pavel Březina const char *usn;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina errno_t ret;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina req = tevent_req_create(mem_ctx, &state,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct ipa_sudo_smart_refresh_state);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (req == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return NULL;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina /* Download all rules from LDAP that are newer than usn */
f58ffb26aeaae0642a149643672fa59ec01a3a36Pavel Březina if (srv_opts == NULL || srv_opts->max_sudo_value == 0) {
f58ffb26aeaae0642a149643672fa59ec01a3a36Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "USN value is unknown, assuming zero.\n");
ef5e33f7db1e314226b0077596e38ef16305cba5Pavel Březina usn = "0";
ef5e33f7db1e314226b0077596e38ef16305cba5Pavel Březina search_filter = NULL;
8bd44a13de231d025882810c720dd07ca4ee564dPavel Březina } else {
ef5e33f7db1e314226b0077596e38ef16305cba5Pavel Březina usn = srv_opts->max_sudo_value;
ef5e33f7db1e314226b0077596e38ef16305cba5Pavel Březina search_filter = talloc_asprintf(state, "(%s>=%s)",
ef5e33f7db1e314226b0077596e38ef16305cba5Pavel Březina sudo_ctx->sudorule_map[IPA_AT_SUDORULE_ENTRYUSN].name, usn);
ef5e33f7db1e314226b0077596e38ef16305cba5Pavel Březina if (search_filter == NULL) {
ef5e33f7db1e314226b0077596e38ef16305cba5Pavel Březina ret = ENOMEM;
ef5e33f7db1e314226b0077596e38ef16305cba5Pavel Březina goto immediately;
ef5e33f7db1e314226b0077596e38ef16305cba5Pavel Březina }
8bd44a13de231d025882810c720dd07ca4ee564dPavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
ef5e33f7db1e314226b0077596e38ef16305cba5Pavel Březina cmdgroups_filter = talloc_asprintf(state, "(%s>=%s)",
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina sudo_ctx->sudocmdgroup_map[IPA_AT_SUDOCMDGROUP_ENTRYUSN].name, usn);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (cmdgroups_filter == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto immediately;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina /* Do not remove any rules that are already in the sysdb. */
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Issuing a smart refresh of sudo rules "
ef5e33f7db1e314226b0077596e38ef16305cba5Pavel Březina "(USN >= %s)\n", usn);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina subreq = ipa_sudo_refresh_send(state, ev, sudo_ctx, cmdgroups_filter,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina search_filter, NULL);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (subreq == NULL) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ENOMEM;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto immediately;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina tevent_req_set_callback(subreq, ipa_sudo_smart_refresh_done, req);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return req;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinaimmediately:
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret == EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina tevent_req_done(req);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina } else {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina tevent_req_error(req, ret);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina tevent_req_post(req, ev);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return req;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina}
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinastatic void ipa_sudo_smart_refresh_done(struct tevent_req *subreq)
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina{
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct tevent_req *req = NULL;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct ipa_sudo_smart_refresh_state *state = NULL;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina int ret;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina state = tevent_req_data(req, struct ipa_sudo_smart_refresh_state);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina ret = ipa_sudo_refresh_recv(subreq, &state->dp_error, NULL);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina talloc_zfree(subreq);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret != EOK || state->dp_error != DP_ERR_OK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina goto done;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Successful smart refresh of sudo rules\n");
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinadone:
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina if (ret != EOK) {
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina tevent_req_error(req, ret);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina }
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina tevent_req_done(req);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina}
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březinaint ipa_sudo_smart_refresh_recv(struct tevent_req *req,
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina int *dp_error)
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina{
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina struct ipa_sudo_smart_refresh_state *state = NULL;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina state = tevent_req_data(req, struct ipa_sudo_smart_refresh_state);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina *dp_error = state->dp_error;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return EOK;
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina}
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březinastruct ipa_sudo_rules_refresh_state {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina size_t num_rules;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina int dp_error;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina bool deleted;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina};
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březinastatic void ipa_sudo_rules_refresh_done(struct tevent_req *subreq);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březinastruct tevent_req *
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březinaipa_sudo_rules_refresh_send(TALLOC_CTX *mem_ctx,
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina struct tevent_context *ev,
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina struct ipa_sudo_ctx *sudo_ctx,
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina char **rules)
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina{
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina TALLOC_CTX *tmp_ctx;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina struct ipa_sudo_rules_refresh_state *state;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina struct tevent_req *subreq;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina struct tevent_req *req;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina char *search_filter;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina char *delete_filter;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina char *safe_rule;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina errno_t ret;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina int i;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina req = tevent_req_create(mem_ctx, &state, struct ipa_sudo_rules_refresh_state);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina if (req == NULL) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina return NULL;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina tmp_ctx = talloc_new(NULL);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina if (tmp_ctx == NULL) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina ret = ENOMEM;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina goto immediately;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina if (rules == NULL || rules[0] == NULL) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina state->dp_error = DP_ERR_OK;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina state->num_rules = 0;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina state->deleted = false;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina ret = EOK;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina goto immediately;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina search_filter = talloc_zero(tmp_ctx, char); /* assign to tmp_ctx */
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina delete_filter = talloc_zero(tmp_ctx, char); /* assign to tmp_ctx */
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina /* Download only selected rules from LDAP. */
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina /* Remove all selected rules from cache. */
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina for (i = 0; rules[i] != NULL; i++) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina ret = sss_filter_sanitize(tmp_ctx, rules[i], &safe_rule);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina if (ret != EOK) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina ret = ENOMEM;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina goto immediately;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina search_filter = talloc_asprintf_append_buffer(search_filter, "(%s=%s)",
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina sudo_ctx->sudorule_map[IPA_AT_SUDORULE_NAME].name,
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina safe_rule);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina if (search_filter == NULL) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina ret = ENOMEM;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina goto immediately;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina delete_filter = talloc_asprintf_append_buffer(delete_filter, "(%s=%s)",
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina SYSDB_NAME, safe_rule);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina if (delete_filter == NULL) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina ret = ENOMEM;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina goto immediately;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina state->num_rules = i;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina search_filter = talloc_asprintf(tmp_ctx, "(|%s)", search_filter);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina if (search_filter == NULL) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina ret = ENOMEM;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina goto immediately;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina delete_filter = talloc_asprintf(tmp_ctx, "(&(%s=%s)(|%s))",
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina SYSDB_OBJECTCLASS, SYSDB_SUDO_CACHE_OC,
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina delete_filter);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina if (delete_filter == NULL) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina ret = ENOMEM;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina goto immediately;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina subreq = ipa_sudo_refresh_send(req, ev, sudo_ctx, NULL, search_filter,
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina delete_filter);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina if (subreq == NULL) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina ret = ENOMEM;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina goto immediately;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina tevent_req_set_callback(subreq, ipa_sudo_rules_refresh_done, req);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina ret = EOK;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březinaimmediately:
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina talloc_free(tmp_ctx);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina if (ret != EOK) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina tevent_req_error(req, ret);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina tevent_req_post(req, ev);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina return req;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina}
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březinastatic void
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březinaipa_sudo_rules_refresh_done(struct tevent_req *subreq)
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina{
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina struct ipa_sudo_rules_refresh_state *state;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina struct tevent_req *req = NULL;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina size_t downloaded_rules_num;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina int ret;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina state = tevent_req_data(req, struct ipa_sudo_rules_refresh_state);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina ret = ipa_sudo_refresh_recv(subreq, &state->dp_error, &downloaded_rules_num);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina talloc_zfree(subreq);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina if (ret != EOK || state->dp_error != DP_ERR_OK) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina goto done;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina state->deleted = downloaded_rules_num != state->num_rules ? true : false;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březinadone:
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina if (ret != EOK) {
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina tevent_req_error(req, ret);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina return;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina }
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina tevent_req_done(req);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina}
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březinaint
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březinaipa_sudo_rules_refresh_recv(struct tevent_req *req,
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina int *dp_error,
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina bool *deleted)
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina{
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina struct ipa_sudo_rules_refresh_state *state;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina state = tevent_req_data(req, struct ipa_sudo_rules_refresh_state);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina *dp_error = state->dp_error;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina *deleted = state->deleted;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina return EOK;
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina}
9630a4614ba4d5f68e967d4e108893550a996f30Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic struct tevent_req *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_ptask_full_refresh_send(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_context *ev,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct be_ctx *be_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct be_ptask *be_ptask,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina void *pvt)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_ctx *sudo_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina sudo_ctx = talloc_get_type(pvt, struct ipa_sudo_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ipa_sudo_full_refresh_send(mem_ctx, be_ctx->ev, sudo_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_ptask_full_refresh_recv(struct tevent_req *req)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int dp_error;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return ipa_sudo_full_refresh_recv(req, &dp_error);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic struct tevent_req *
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_ptask_smart_refresh_send(TALLOC_CTX *mem_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct tevent_context *ev,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct be_ctx *be_ctx,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct be_ptask *be_ptask,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina void *pvt)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina struct ipa_sudo_ctx *sudo_ctx;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina sudo_ctx = talloc_get_type(pvt, struct ipa_sudo_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return ipa_sudo_smart_refresh_send(mem_ctx, be_ctx->ev, sudo_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinastatic errno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_ptask_smart_refresh_recv(struct tevent_req *req)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina int dp_error;
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
cc7f9b639144183eb4f8bd86e5bed077da7d4e35Pavel Březina return ipa_sudo_smart_refresh_recv(req, &dp_error);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaerrno_t
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březinaipa_sudo_ptask_setup(struct be_ctx *be_ctx, struct ipa_sudo_ctx *sudo_ctx)
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina{
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina return sdap_sudo_ptask_setup_generic(be_ctx, sudo_ctx->id_ctx->opts->basic,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ipa_sudo_ptask_full_refresh_send,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ipa_sudo_ptask_full_refresh_recv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ipa_sudo_ptask_smart_refresh_send,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina ipa_sudo_ptask_smart_refresh_recv,
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina sudo_ctx);
a641a13889d617aca6bd998025e9087e822ff7f0Pavel Březina}