Example #1
0
int pam_dp_send_req(struct pam_auth_req *preq, int timeout)
{
    struct pam_data *pd = preq->pd;
    struct be_conn *be_conn;
    DBusMessage *msg;
    dbus_bool_t ret;
    int res;
    struct pam_auth_dp_req *pdp_req;

    /* double check dp_ctx has actually been initialized.
     * in some pathological cases it may happen that nss starts up before
     * dp connection code is actually able to establish a connection.
     */
    res = sss_dp_get_domain_conn(preq->cctx->rctx,
                                 preq->domain->conn_name, &be_conn);
    if (res != EOK) {
        DEBUG(SSSDBG_CRIT_FAILURE,
              "The Data Provider connection for %s is not available!"
               " This maybe a bug, it shouldn't happen!\n",
               preq->domain->conn_name);
        return EIO;
    }

    msg = dbus_message_new_method_call(NULL,
                                       DP_PATH,
                                       IFACE_DP,
                                       IFACE_DP_PAMHANDLER);
    if (msg == NULL) {
        DEBUG(SSSDBG_FATAL_FAILURE,"Out of memory?!\n");
        return ENOMEM;
    }


    DEBUG(SSSDBG_CONF_SETTINGS, "Sending request with the following data:\n");
    DEBUG_PAM_DATA(SSSDBG_CONF_SETTINGS, pd);

    ret = dp_pack_pam_request(msg, pd);
    if (!ret) {
        DEBUG(SSSDBG_CRIT_FAILURE,"Failed to build message\n");
        return EIO;
    }

    pdp_req = talloc(preq->cctx->rctx, struct pam_auth_dp_req);
    if (pdp_req == NULL) {
        return ENOMEM;
    }
    pdp_req->preq = preq;
    preq->dpreq_spy = pdp_req;
    talloc_set_destructor(pdp_req, pdp_req_destructor);

    res = sbus_conn_send(be_conn->conn, msg,
                         timeout, pam_dp_process_reply,
                         pdp_req, NULL);
    dbus_message_unref(msg);
    return res;
}
Example #2
0
static struct tevent_req *
cache_req_host_by_name_dp_send(TALLOC_CTX *mem_ctx,
                               struct cache_req *cr,
                               struct cache_req_data *data,
                               struct sss_domain_info *domain,
                               struct ldb_result *result)
{
    struct be_conn *be_conn;
    errno_t ret;

    ret = sss_dp_get_domain_conn(cr->rctx, domain->conn_name, &be_conn);
    if (ret != EOK) {
        DEBUG(SSSDBG_CRIT_FAILURE,
              "BUG: The Data Provider connection for %s is not available!\n",
              domain->name);
        return NULL;
    }

    return sbus_call_dp_dp_hostHandler_send(mem_ctx, be_conn->conn,
                                            be_conn->bus_name, SSS_BUS_PATH,
                                            0, data->name.name, data->alias);
}