responder_dp.c revision d3f2fd9cb21cc10dce663a2f7d0deda07074e44e
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen/*
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen Authors:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen Simo Sorce <ssorce@redhat.com>
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen Stephen Gallagher <sgallagh@redhat.com>
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen Copyright (C) 2009 Red Hat
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen This program is free software; you can redistribute it and/or modify
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen it under the terms of the GNU General Public License as published by
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen the Free Software Foundation; either version 3 of the License, or
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen (at your option) any later version.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen This program is distributed in the hope that it will be useful,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen GNU General Public License for more details.
6ec925f52d04ec8700e47cb005bd7ddc65ac5614Timo Sirainen
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen You should have received a copy of the GNU General Public License
4d4d6d4745682790c20d759ba93dbea46b812c5dTimo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen*/
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#include <sys/time.h>
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#include <time.h>
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#include "util/util.h"
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen#include "responder/common/responder_packet.h"
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#include "responder/common/responder.h"
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#include "providers/data_provider.h"
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen#include "sbus/sbus_client.h"
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstruct sss_dp_req;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainenstruct sss_dp_callback {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_dp_callback *prev;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_dp_callback *next;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct tevent_req *req;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen struct sss_dp_req *sdp_req;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen};
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainenstruct sss_dp_req {
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen struct resp_ctx *rctx;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen struct tevent_context *ev;
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen DBusPendingCall *pending_reply;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen hash_key_t *key;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct tevent_timer *tev;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_dp_callback *cb_list;
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbus_uint16_t dp_err;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbus_uint32_t dp_ret;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen char *err_msg;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen};
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic int sss_dp_callback_destructor(void *ptr)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_dp_callback *cb =
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen talloc_get_type(ptr, struct sss_dp_callback);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen DLIST_REMOVE(cb->sdp_req->cb_list, cb);
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen return EOK;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen}
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainenstatic int sss_dp_req_destructor(void *ptr)
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen{
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen struct sss_dp_callback *cb;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen struct sss_dp_req *sdp_req = talloc_get_type(ptr, struct sss_dp_req);
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen struct sss_dp_req_state *state;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen int hret;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen /* Cancel Dbus pending reply if still pending */
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen if (sdp_req->pending_reply) {
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen dbus_pending_call_cancel(sdp_req->pending_reply);
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen sdp_req->pending_reply = NULL;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen }
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen /* If there are callbacks that haven't been invoked, return
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen * an error now.
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen */
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen while((cb = sdp_req->cb_list) != NULL) {
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen state = tevent_req_data(cb->req, struct sss_dp_req_state);
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen state->dp_err = DP_ERR_FATAL;
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen state->dp_ret = EIO;
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen /* tevent_req_done/error will free cb */
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen tevent_req_error(cb->req, EIO);
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen /* Freeing the cb removes it from the cb_list.
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen * Therefore, the cb_list should now be pointing
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen * at a new callback. If it's not, it means the
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen * callback handler didn't free cb and may leak
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen * memory. Be paranoid and protect against this
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen * situation.
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen */
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen if (cb == sdp_req->cb_list) {
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen DEBUG(SSSDBG_FATAL_FAILURE,
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen ("BUG: a callback did not free its request. "
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen "May leak memory\n"));
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen /* Skip to the next since a memory leak is non-fatal */
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen sdp_req->cb_list = sdp_req->cb_list->next;
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen /* Destroy the hash entry */
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen DEBUG(SSSDBG_TRACE_FUNC, ("Deleting request: [%s]\n", sdp_req->key->str));
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen hret = hash_delete(sdp_req->rctx->dp_request_table, sdp_req->key);
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen if (hret != HASH_SUCCESS) {
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen /* This should never happen */
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen DEBUG(SSSDBG_TRACE_INTERNAL,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ("BUG: Could not clear [%d:%d:%s] from request queue: [%s]\n",
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sdp_req->key->type, sdp_req->key->ul, sdp_req->key->str,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen hash_error_string(hret)));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return -1;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return 0;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen}
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenvoid handle_requests_after_reconnect(struct resp_ctx *rctx)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen int ret;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen hash_value_t *values;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen unsigned long count, i;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_dp_req *sdp_req;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (!rctx->dp_request_table) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(7, ("No requests to handle after reconnect\n"));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ret = hash_values(rctx->dp_request_table, &count, &values);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (ret != HASH_SUCCESS) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(1, ("hash_values failed, "
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen "not all request might be handled after reconnect.\n"));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(7, ("Will handle %lu requests after reconnect\n", count));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen for (i=0; i<count; i++) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sdp_req = talloc_get_type(values[i].ptr, struct sss_dp_req);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen talloc_free(sdp_req);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen}
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic int sss_dp_get_reply(DBusPendingCall *pending,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbus_uint16_t *dp_err,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbus_uint32_t *dp_ret,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen char **err_msg)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen DBusMessage *reply;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DBusError dbus_error;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbus_bool_t ret;
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen int type;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen int err = EOK;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen dbus_error_init(&dbus_error);
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen reply = dbus_pending_call_steal_reply(pending);
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen if (!reply) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* reply should never be null. This function shouldn't be called
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen * until reply is valid or timeout has occurred. If reply is NULL
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen * here, something is seriously wrong and we should bail out.
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
d74c7c6d900f7b38017403a0da9106b8a6c647b2Timo Sirainen ("Severe error. A reply callback was called but no reply "
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen "was received and no timeout occurred\n"));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* FIXME: Destroy this connection ? */
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen err = EIO;
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen goto done;
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen }
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen type = dbus_message_get_type(reply);
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen switch (type) {
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen case DBUS_MESSAGE_TYPE_METHOD_RETURN:
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen ret = dbus_message_get_args(reply, &dbus_error,
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen DBUS_TYPE_UINT16, dp_err,
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen DBUS_TYPE_UINT32, dp_ret,
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen DBUS_TYPE_STRING, err_msg,
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen DBUS_TYPE_INVALID);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (!ret) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(1,("Failed to parse message\n"));
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen /* FIXME: Destroy this connection ? */
0ef40aa9ca6084393fe0a56feac2cf801e8b52f0Timo Sirainen if (dbus_error_is_set(&dbus_error)) dbus_error_free(&dbus_error);
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen err = EIO;
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen goto done;
d74c7c6d900f7b38017403a0da9106b8a6c647b2Timo Sirainen }
0ef40aa9ca6084393fe0a56feac2cf801e8b52f0Timo Sirainen DEBUG(SSSDBG_TRACE_LIBS,
0ef40aa9ca6084393fe0a56feac2cf801e8b52f0Timo Sirainen ("Got reply from Data Provider - "
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen "DP error code: %u errno: %u error message: %s\n",
0ef40aa9ca6084393fe0a56feac2cf801e8b52f0Timo Sirainen (unsigned int)*dp_err, (unsigned int)*dp_ret,
0ef40aa9ca6084393fe0a56feac2cf801e8b52f0Timo Sirainen *err_msg ? *err_msg : "none"));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen break;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen case DBUS_MESSAGE_TYPE_ERROR:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (strcmp(dbus_message_get_error_name(reply),
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen DBUS_ERROR_NO_REPLY) == 0) {
0ef40aa9ca6084393fe0a56feac2cf801e8b52f0Timo Sirainen err = ETIME;
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen goto done;
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen }
d74c7c6d900f7b38017403a0da9106b8a6c647b2Timo Sirainen DEBUG(0,("The Data Provider returned an error [%s]\n",
0ef40aa9ca6084393fe0a56feac2cf801e8b52f0Timo Sirainen dbus_message_get_error_name(reply)));
0ef40aa9ca6084393fe0a56feac2cf801e8b52f0Timo Sirainen /* Falling through to default intentionally*/
5323bec1c24184863a13bc14a2dc9487093eea3dTimo Sirainen default:
0ef40aa9ca6084393fe0a56feac2cf801e8b52f0Timo Sirainen /*
0ef40aa9ca6084393fe0a56feac2cf801e8b52f0Timo Sirainen * Timeout or other error occurred or something
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * unexpected happened.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * It doesn't matter which, because either way we
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * know that this connection isn't trustworthy.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * We'll destroy it now.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* FIXME: Destroy this connection ? */
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen err = EIO;
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen }
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainendone:
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen dbus_pending_call_unref(pending);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbus_message_unref(reply);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return err;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen}
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic struct tevent_req *
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainensss_dp_internal_get_send(struct resp_ctx *rctx,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen hash_key_t *key,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_domain_info *dom,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DBusMessage *msg);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic void
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainensss_dp_req_done(struct tevent_req *sidereq);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenerrno_t
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainensss_dp_issue_request(TALLOC_CTX *mem_ctx, struct resp_ctx *rctx,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *strkey, struct sss_domain_info *dom,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbus_msg_constructor msg_create, void *pvt,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct tevent_req *nreq)
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen{
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen int hret;
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen hash_value_t value;
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen hash_key_t *key;
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen struct tevent_req *sidereq;
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen struct sss_dp_req *sdp_req;
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen struct sss_dp_callback *cb;
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen DBusMessage *msg;
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen TALLOC_CTX *tmp_ctx = NULL;
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen errno_t ret;
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen tmp_ctx = talloc_new(NULL);
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen if (!tmp_ctx) {
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen return ENOMEM;
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen }
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen key = talloc(tmp_ctx, hash_key_t);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (!key) {
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen ret = ENOMEM;
e3ae2ac7a93b418cf46e829c94973b6e962a7830Timo Sirainen goto fail;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen key->type = HASH_KEY_STRING;
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen key->str = talloc_asprintf(key, "%p:%s", msg_create, strkey);
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen if (!key->str) {
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen ret = ENOMEM;
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen goto fail;
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen }
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen DEBUG(SSSDBG_TRACE_FUNC, ("Issuing request for [%s]\n", key->str));
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen /* Check the hash for existing references to this request */
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen hret = hash_lookup(rctx->dp_request_table, key, &value);
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen switch (hret) {
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen case HASH_SUCCESS:
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen /* Request already in progress */
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen DEBUG(SSSDBG_TRACE_FUNC,
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen ("Identical request in progress: [%s]\n", key->str));
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen break;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen case HASH_ERROR_KEY_NOT_FOUND:
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen /* No such request in progress
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen * Create a new request
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen */
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen msg = msg_create(pvt);
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen if (!msg) {
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Cannot create D-Bus message\n"));
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen ret = EIO;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen goto fail;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen }
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen value.type = HASH_VALUE_PTR;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen sidereq = sss_dp_internal_get_send(rctx, key, dom, msg);
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen dbus_message_unref(msg);
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen if (!sidereq) {
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Cannot send D-Bus message\n"));
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen ret = EIO;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen goto fail;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen }
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen tevent_req_set_callback(sidereq, sss_dp_req_done, NULL);
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen /* We should now be able to find the sdp_req in the hash table */
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen hret = hash_lookup(rctx->dp_request_table, key, &value);
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen if (hret != HASH_SUCCESS) {
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen /* Something must have gone wrong with creating the request */
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("The request has disappeared?\n"));
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen ret = EIO;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen goto fail;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen }
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen break;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen default:
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen ("Could not query request list (%s)\n",
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen hash_error_string(hret)));
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen ret = EIO;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen goto fail;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen }
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen /* Register this request for results */
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen sdp_req = talloc_get_type(value.ptr, struct sss_dp_req);
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen if (!sdp_req) {
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Could not retrieve DP request context\n"));
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen ret = EIO;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen goto fail;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen }
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen cb = talloc_zero(mem_ctx, struct sss_dp_callback);
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen if (!cb) {
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen ret = ENOMEM;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen goto fail;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen }
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen cb->req = nreq;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen cb->sdp_req = sdp_req;
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen /* Add it to the list of requests to call */
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen DLIST_ADD_END(sdp_req->cb_list, cb,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_dp_callback *);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen talloc_set_destructor((TALLOC_CTX *)cb,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sss_dp_callback_destructor);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
72cc352b25ad401b923436c6ed0f1f3adaffa737Timo Sirainen ret = EOK;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenfail:
e154d8764089896a693cbb83d6831b2398f22ee8Timo Sirainen talloc_free(tmp_ctx);
e154d8764089896a693cbb83d6831b2398f22ee8Timo Sirainen return ret;
e154d8764089896a693cbb83d6831b2398f22ee8Timo Sirainen}
6ec925f52d04ec8700e47cb005bd7ddc65ac5614Timo Sirainen
6ec925f52d04ec8700e47cb005bd7ddc65ac5614Timo Sirainenstatic void
6ec925f52d04ec8700e47cb005bd7ddc65ac5614Timo Sirainensss_dp_req_done(struct tevent_req *sidereq)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* Nothing to do here. The callbacks have already been invoked */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen talloc_zfree(sidereq);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen}
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenerrno_t
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainensss_dp_req_recv(TALLOC_CTX *mem_ctx,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct tevent_req *sidereq,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbus_uint16_t *dp_err,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbus_uint32_t *dp_ret,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen char **err_msg)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_dp_req_state *state =
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen tevent_req_data(sidereq, struct sss_dp_req_state);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen enum tevent_req_state TRROEstate;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen uint64_t TRROEerr;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen *dp_err = state->dp_err;
617e13833c798435e2be425b99c27ecaad1b8393Timo Sirainen *dp_ret = state->dp_ret;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen *err_msg = talloc_steal(mem_ctx, state->err_msg);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen if (tevent_req_is_error(sidereq, &TRROEstate, &TRROEerr)) {
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen if (TRROEstate == TEVENT_REQ_USER_ERROR) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen *dp_err = DP_ERR_FATAL;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen *dp_ret = TRROEerr;
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen } else {
c60178b2610a9b193ff72aa18448398ef72529a1Timo Sirainen return EIO;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
72cc352b25ad401b923436c6ed0f1f3adaffa737Timo Sirainen }
72cc352b25ad401b923436c6ed0f1f3adaffa737Timo Sirainen
72cc352b25ad401b923436c6ed0f1f3adaffa737Timo Sirainen return EOK;
72cc352b25ad401b923436c6ed0f1f3adaffa737Timo Sirainen}
72cc352b25ad401b923436c6ed0f1f3adaffa737Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen/* Send a request to the data provider
72cc352b25ad401b923436c6ed0f1f3adaffa737Timo Sirainen * Once this function is called, the communication
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * with the data provider will always run to
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * completion. Freeing the returned tevent_req will
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * cancel the notification of completion, but not
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * the data provider action.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen */
bad5fa318c6c1384ab83bd72d53ce06593274c18Timo Sirainenstatic DBusMessage *sss_dp_get_account_msg(void *pvt);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstruct sss_dp_account_info {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_domain_info *dom;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen bool fast_reply;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen enum sss_dp_acct_type type;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *opt_name;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *extra;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen uint32_t opt_id;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen};
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstruct tevent_req *
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainensss_dp_get_account_send(TALLOC_CTX *mem_ctx,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct resp_ctx *rctx,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_domain_info *dom,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen bool fast_reply,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen enum sss_dp_acct_type type,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *opt_name,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen uint32_t opt_id,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *extra)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen errno_t ret;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct tevent_req *req;
bad5fa318c6c1384ab83bd72d53ce06593274c18Timo Sirainen struct sss_dp_account_info *info;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_dp_req_state *state;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen char *key;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
3a0f9aa9504497e4e47f32df54fbf47fdc7423b6Timo Sirainen req = tevent_req_create(mem_ctx, &state, struct sss_dp_req_state);
3a0f9aa9504497e4e47f32df54fbf47fdc7423b6Timo Sirainen if (!req) {
788f275469ad9ed530e440d6690d0e4381a323b2Timo Sirainen return NULL;
788f275469ad9ed530e440d6690d0e4381a323b2Timo Sirainen }
788f275469ad9ed530e440d6690d0e4381a323b2Timo Sirainen
788f275469ad9ed530e440d6690d0e4381a323b2Timo Sirainen /* either, or, not both */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (opt_name && opt_id) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ret = EINVAL;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen goto error;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen if (!dom) {
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen ret = EINVAL;
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen goto error;
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen }
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen
43d7e7ce608f5451e4907b5f5c48c00beb265802Timo Sirainen info = talloc_zero(state, struct sss_dp_account_info);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen info->fast_reply = fast_reply;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen info->type = type;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen info->opt_name = opt_name;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen info->opt_id = opt_id;
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen info->extra = extra;
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen info->dom = dom;
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen if (opt_name) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (extra) {
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen key = talloc_asprintf(state, "%d:%s:%s@%s",
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen type, opt_name, extra, dom->name);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen } else {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen key = talloc_asprintf(state, "%d:%s@%s",
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen type, opt_name, dom->name);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen } else if (opt_id) {
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen if (extra) {
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen key = talloc_asprintf(state, "%d:%d:%s@%s",
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen type, opt_id, extra, dom->name);
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen } else {
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen key = talloc_asprintf(state, "%d:%d@%s", type, opt_id, dom->name);
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen }
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen } else {
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen key = talloc_asprintf(state, "%d:*@%s", type, dom->name);
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen }
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen if (!key) {
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen ret = ENOMEM;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen goto error;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen }
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen ret = sss_dp_issue_request(state, rctx, key, dom, sss_dp_get_account_msg,
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen info, req);
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen talloc_free(key);
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen if (ret != EOK) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(SSSDBG_OP_FAILURE,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ("Could not issue DP request [%d]: %s\n",
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen ret, strerror(ret)));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen goto error;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return req;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenerror:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen tevent_req_error(req, ret);
cdc8485491045d82bb98405d4b995f277d12838eTimo Sirainen tevent_req_post(req, rctx->ev);
cdc8485491045d82bb98405d4b995f277d12838eTimo Sirainen return req;
b2ed2b25c4c457ec1c99ebe5e9bd66a2e2f89cfdTimo Sirainen}
b2ed2b25c4c457ec1c99ebe5e9bd66a2e2f89cfdTimo Sirainen
e20edc0dedcdfbcfa20e9bb4c3dc460f28bfd405Timo Sirainenstatic DBusMessage *
e4427a13680e8b7db98fb7eb9ef2e5f788e84212Timo Sirainensss_dp_get_account_msg(void *pvt)
e20edc0dedcdfbcfa20e9bb4c3dc460f28bfd405Timo Sirainen{
e4427a13680e8b7db98fb7eb9ef2e5f788e84212Timo Sirainen DBusMessage *msg;
e4427a13680e8b7db98fb7eb9ef2e5f788e84212Timo Sirainen dbus_bool_t dbret;
e20edc0dedcdfbcfa20e9bb4c3dc460f28bfd405Timo Sirainen struct sss_dp_account_info *info;
e20edc0dedcdfbcfa20e9bb4c3dc460f28bfd405Timo Sirainen uint32_t be_type;
b2ed2b25c4c457ec1c99ebe5e9bd66a2e2f89cfdTimo Sirainen uint32_t attrs = BE_ATTR_CORE;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen char *filter;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *dp_method;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen info = talloc_get_type(pvt, struct sss_dp_account_info);
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen switch (info->type) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen case SSS_DP_USER:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen be_type = BE_REQ_USER;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dp_method = DP_METHOD_GETACCTINFO;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen break;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen case SSS_DP_GROUP:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen be_type = BE_REQ_GROUP;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dp_method = DP_METHOD_GETACCTINFO;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen break;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen case SSS_DP_INITGROUPS:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen be_type = BE_REQ_INITGROUPS;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dp_method = DP_METHOD_GETACCTINFO;
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen break;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen case SSS_DP_NETGR:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen be_type = BE_REQ_NETGROUP;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dp_method = DP_METHOD_GETACCTINFO;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen break;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen case SSS_DP_SERVICES:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen be_type = BE_REQ_SERVICES;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dp_method = DP_METHOD_GETACCTINFO;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen break;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen case SSS_DP_HOST:
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen be_type = 0;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dp_method = DP_METHOD_HOSTHANDLER;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen break;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen }
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen
fb7ac3e31c92627efe076318319976ac1c27ae2aTimo Sirainen if (info->fast_reply) {
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen be_type |= BE_REQ_FAST;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (info->opt_name) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (info->extra) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen filter = talloc_asprintf(info, "name=%s:%s",
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen info->opt_name, info->extra);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen } else {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen filter = talloc_asprintf(info, "name=%s", info->opt_name);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen } else if (info->opt_id) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (info->extra) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen filter = talloc_asprintf(info, "idnumber=%u:%s",
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen info->opt_id, info->extra);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen } else {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen filter = talloc_asprintf(info, "idnumber=%u", info->opt_id);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen } else {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen filter = talloc_strdup(info, ENUM_INDICATOR);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (!filter) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory?!\n"));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return NULL;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen msg = dbus_message_new_method_call(NULL,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DP_PATH,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DP_INTERFACE,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dp_method);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (msg == NULL) {
3a0f9aa9504497e4e47f32df54fbf47fdc7423b6Timo Sirainen talloc_free(filter);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory?!\n"));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return NULL;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
bad5fa318c6c1384ab83bd72d53ce06593274c18Timo Sirainen
bad5fa318c6c1384ab83bd72d53ce06593274c18Timo Sirainen /* create the message */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(SSSDBG_TRACE_FUNC,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ("Creating request for [%s][%u][%d][%s]\n",
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen info->dom->name, be_type, attrs, filter));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbret = dbus_message_append_args(msg,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DBUS_TYPE_UINT32, &be_type,
bad5fa318c6c1384ab83bd72d53ce06593274c18Timo Sirainen DBUS_TYPE_UINT32, &attrs,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DBUS_TYPE_STRING, &filter,
bad5fa318c6c1384ab83bd72d53ce06593274c18Timo Sirainen DBUS_TYPE_INVALID);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen talloc_free(filter);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (!dbret) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to build message\n"));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbus_message_unref(msg);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return NULL;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return msg;
d8552f9f65e5ff64be5de9faf9a8171799a0bbecTimo Sirainen}
d8552f9f65e5ff64be5de9faf9a8171799a0bbecTimo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenerrno_t
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainensss_dp_get_account_recv(TALLOC_CTX *mem_ctx,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct tevent_req *req,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbus_uint16_t *dp_err,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dbus_uint32_t *dp_ret,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen char **err_msg)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return sss_dp_req_recv(mem_ctx, req, dp_err, dp_ret, err_msg);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen}
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstruct dp_internal_get_state {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct resp_ctx *rctx;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen struct sss_domain_info *dom;
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_dp_req *sdp_req;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DBusPendingCall *pending_reply;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen};
bad5fa318c6c1384ab83bd72d53ce06593274c18Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic void sss_dp_internal_get_done(DBusPendingCall *pending, void *ptr);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic struct tevent_req *
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainensss_dp_internal_get_send(struct resp_ctx *rctx,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen hash_key_t *key,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_domain_info *dom,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DBusMessage *msg)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen errno_t ret;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen int hret;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct tevent_req *req;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct dp_internal_get_state *state;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct be_conn *be_conn;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen hash_value_t value;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* Internal requests need to be allocated on the responder context
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * so that they don't go away if a client disconnects. The worst-
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * case scenario here is that the cache is updated without any
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * client expecting a response.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen req = tevent_req_create(rctx,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen &state,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct dp_internal_get_state);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (!req) return NULL;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen state->rctx = rctx;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen state->dom = dom;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen state->sdp_req = talloc_zero(state, struct sss_dp_req);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (!state->sdp_req) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ret = ENOMEM;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen goto error;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen state->sdp_req->rctx = rctx;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen state->sdp_req->ev = rctx->ev;
a3dcda4b01461c7690c655a013ec12851cdb78d4Timo Sirainen
a3dcda4b01461c7690c655a013ec12851cdb78d4Timo Sirainen /* Copy the key to use when calling the destructor
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * It needs to be a copy because the original request
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * might be freed if it no longer cares about the reply.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen state->sdp_req->key = talloc_steal(state->sdp_req, key);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* double check dp_ctx has actually been initialized.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * in some pathological cases it may happen that nss starts up before
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * dp connection code is actually able to establish a connection.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ret = sss_dp_get_domain_conn(rctx, dom->conn_name, &be_conn);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (ret != EOK) {
5fc02738b38ac2b0c21db0854d7a5ad452b1177fTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
5fc02738b38ac2b0c21db0854d7a5ad452b1177fTimo Sirainen ("BUG: The Data Provider connection for %s is not available!",
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen dom->name));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ret = EIO;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen goto error;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ret = sbus_conn_send(be_conn->conn, msg,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen SSS_CLI_SOCKET_TIMEOUT / 2,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sss_dp_internal_get_done,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen req,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen &state->sdp_req->pending_reply);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (ret != EOK) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /*
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * Critical Failure
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * We can't communicate on this connection
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ("D-BUS send failed.\n"));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ret = EIO;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen goto error;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* Add this sdp_req to the hash table */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen value.type = HASH_VALUE_PTR;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen value.ptr = state->sdp_req;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(SSSDBG_TRACE_FUNC, ("Entering request [%s]\n", key->str));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen hret = hash_enter(rctx->dp_request_table, key, &value);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (hret != HASH_SUCCESS) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ("Could not store request query (%s)\n",
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen hash_error_string(hret)));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ret = EIO;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen goto error;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen talloc_set_destructor((TALLOC_CTX *)state->sdp_req,
9c8f854d95d8d895022a75f140a0a500eb200d39Timo Sirainen sss_dp_req_destructor);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return req;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenerror:
9c8f854d95d8d895022a75f140a0a500eb200d39Timo Sirainen tevent_req_error(req, ret);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen tevent_req_post(req, rctx->ev);
55bc6a7a0940ec48a68558ef70838991c5d301d2Timo Sirainen return req;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen}
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic void sss_dp_internal_get_done(DBusPendingCall *pending, void *ptr)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen int ret;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct tevent_req *req;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_dp_req *sdp_req;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_dp_callback *cb;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct dp_internal_get_state *state;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen struct sss_dp_req_state *cb_state;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen req = talloc_get_type(ptr, struct tevent_req);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen state = tevent_req_data(req, struct dp_internal_get_state);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sdp_req = state->sdp_req;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* prevent trying to cancel a reply that we already received */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sdp_req->pending_reply = NULL;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ret = sss_dp_get_reply(pending,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen &sdp_req->dp_err,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen &sdp_req->dp_ret,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen &sdp_req->err_msg);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (ret != EOK) {
9c8f854d95d8d895022a75f140a0a500eb200d39Timo Sirainen if (ret == ETIME) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sdp_req->dp_err = DP_ERR_TIMEOUT;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sdp_req->dp_ret = ret;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sdp_req->err_msg = talloc_strdup(sdp_req, "Request timed out");
9c8f854d95d8d895022a75f140a0a500eb200d39Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen else {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sdp_req->dp_err = DP_ERR_FATAL;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen sdp_req->dp_ret = ret;
9c8f854d95d8d895022a75f140a0a500eb200d39Timo Sirainen sdp_req->err_msg =
9c8f854d95d8d895022a75f140a0a500eb200d39Timo Sirainen talloc_strdup(sdp_req,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen "Failed to get reply from Data Provider");
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* Check whether we need to issue any callbacks */
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen while ((cb = sdp_req->cb_list) != NULL) {
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen cb_state = tevent_req_data(cb->req, struct sss_dp_req_state);
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen cb_state->dp_err = sdp_req->dp_err;
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen cb_state->dp_ret = sdp_req->dp_ret;
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen cb_state->err_msg = talloc_strdup(cb_state, sdp_req->err_msg);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* Don't bother checking for NULL. If it fails due to ENOMEM,
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen * we can't really handle it anyway.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* tevent_req_done/error will free cb */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (ret == EOK) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen tevent_req_done(cb->req);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen } else {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen tevent_req_error(cb->req, ret);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* Freeing the cb removes it from the cb_list.
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * Therefore, the cb_list should now be pointing
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * at a new callback. If it's not, it means the
9c8f854d95d8d895022a75f140a0a500eb200d39Timo Sirainen * callback handler didn't free cb and may leak
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen * memory. Be paranoid and protect against this
9c8f854d95d8d895022a75f140a0a500eb200d39Timo Sirainen * situation.
9c8f854d95d8d895022a75f140a0a500eb200d39Timo Sirainen */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (cb == sdp_req->cb_list) {
9c8f854d95d8d895022a75f140a0a500eb200d39Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE,
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ("BUG: a callback did not free its request. "
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen "May leak memory\n"));
/* Skip to the next since a memory leak is non-fatal */
sdp_req->cb_list = sdp_req->cb_list->next;
}
}
/* We're done with this request. Free the sdp_req
* This will clean up the hash table entry as well
*/
talloc_zfree(sdp_req);
}