diff options
author | Pavel Březina <pbrezina@redhat.com> | 2015-12-11 15:00:40 +0100 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2016-01-19 14:33:35 +0100 |
commit | a641a13889d617aca6bd998025e9087e822ff7f0 (patch) | |
tree | 3183d7a054ea767a27dad2d60bd1476135c5756c /src/providers/ipa/ipa_sudo.c | |
parent | 4ddd5591c50e27dffa55f03fbce0dcc85cd50a8b (diff) | |
download | sssd-a641a13889d617aca6bd998025e9087e822ff7f0.tar.gz sssd-a641a13889d617aca6bd998025e9087e822ff7f0.tar.xz sssd-a641a13889d617aca6bd998025e9087e822ff7f0.zip |
IPA SUDO: Implement full refresh
Reviewed-by: Sumit Bose <sbose@redhat.com>
Diffstat (limited to 'src/providers/ipa/ipa_sudo.c')
-rw-r--r-- | src/providers/ipa/ipa_sudo.c | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/src/providers/ipa/ipa_sudo.c b/src/providers/ipa/ipa_sudo.c index e1b0c8288..3e73bd30f 100644 --- a/src/providers/ipa/ipa_sudo.c +++ b/src/providers/ipa/ipa_sudo.c @@ -147,6 +147,13 @@ ipa_sudo_init_ipa_schema(struct be_ctx *be_ctx, return ret; } + ret = ipa_sudo_ptask_setup(be_ctx, sudo_ctx); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, "Unable to setup periodic tasks " + "[%d]: %s\n", ret, sss_strerror(ret)); + goto done; + } + *ops = &ipa_sudo_ops; *pvt_data = sudo_ctx; @@ -200,7 +207,73 @@ int ipa_sudo_init(struct be_ctx *be_ctx, } static void +ipa_sudo_reply(struct tevent_req *req) +{ + struct be_sudo_req *sudo_req; + struct be_req *be_req; + int dp_error; + int ret; + + be_req = tevent_req_callback_data(req, struct be_req); + sudo_req = talloc_get_type(be_req_get_data(be_req), struct be_sudo_req); + + switch (sudo_req->type) { + case BE_REQ_SUDO_FULL: + ret = ipa_sudo_full_refresh_recv(req, &dp_error); + break; + default: + DEBUG(SSSDBG_CRIT_FAILURE, "Invalid request type: %d\n", + sudo_req->type); + dp_error = DP_ERR_FATAL; + ret = ERR_INTERNAL; + break; + } + + talloc_zfree(req); + sdap_handler_done(be_req, dp_error, ret, sss_strerror(ret)); +} + +static void ipa_sudo_handler(struct be_req *be_req) { - sdap_handler_done(be_req, DP_ERR_FATAL, ERR_INTERNAL, "Not implemented yet."); + struct be_ctx *be_ctx = be_req_get_be_ctx(be_req); + struct ipa_sudo_ctx *sudo_ctx; + struct be_sudo_req *sudo_req; + struct tevent_req *req; + int ret; + + if (be_is_offline(be_ctx)) { + sdap_handler_done(be_req, DP_ERR_OFFLINE, EAGAIN, "Offline"); + return; + } + + sudo_ctx = talloc_get_type(be_ctx->bet_info[BET_SUDO].pvt_bet_data, + struct ipa_sudo_ctx); + + sudo_req = talloc_get_type(be_req_get_data(be_req), struct be_sudo_req); + + switch (sudo_req->type) { + case BE_REQ_SUDO_FULL: + req = ipa_sudo_full_refresh_send(be_req, be_ctx->ev, sudo_ctx); + break; + default: + DEBUG(SSSDBG_CRIT_FAILURE, "Invalid request type: %d\n", + sudo_req->type); + ret = EINVAL; + goto fail; + } + + if (req == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "Unable to send request: %d\n", + sudo_req->type); + ret = ENOMEM; + goto fail; + } + + tevent_req_set_callback(req, ipa_sudo_reply, be_req); + + return; + +fail: + sdap_handler_done(be_req, DP_ERR_FATAL, ret, NULL); } |