proxy_init.c revision d9577dbd92555b0755881e37724019ef9c578404
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher/*
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher SSSD
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher proxy_init.c
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher Authors:
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher Stephen Gallagher <sgallagh@redhat.com>
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher Copyright (C) 2010 Red Hat
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher This program is free software; you can redistribute it and/or modify
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher it under the terms of the GNU General Public License as published by
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher the Free Software Foundation; either version 3 of the License, or
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher (at your option) any later version.
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher This program is distributed in the hope that it will be useful,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher but WITHOUT ANY WARRANTY; without even the implied warranty of
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher GNU General Public License for more details.
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher You should have received a copy of the GNU General Public License
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher along with this program. If not, see <http://www.gnu.org/licenses/>.
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher*/
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
af58b15fa7f20e33736d79c6a4b3becb568517caLukas Slebodnik#include "config.h"
af58b15fa7f20e33736d79c6a4b3becb568517caLukas Slebodnik
69c83119c0504fd1590299b8a4ecdabf86a8f18dLukas Slebodnik#include "util/sss_format.h"
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher#include "providers/proxy/proxy.h"
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
d9577dbd92555b0755881e37724019ef9c578404Stef Walterstatic int client_registration(struct sbus_request *dbus_req);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
769347ad4d35d43488eb98f980143495b0db415dStef Walterstatic struct data_provider_iface proxy_methods = {
769347ad4d35d43488eb98f980143495b0db415dStef Walter { &data_provider_iface_meta, 0 },
769347ad4d35d43488eb98f980143495b0db415dStef Walter .RegisterService = client_registration,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .pamHandler = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .sudoHandler = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .autofsHandler = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .hostHandler = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .getDomains = NULL,
769347ad4d35d43488eb98f980143495b0db415dStef Walter .getAccountInfo = NULL,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher};
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherstruct sbus_interface proxy_interface = {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher DP_PATH,
769347ad4d35d43488eb98f980143495b0db415dStef Walter &proxy_methods.vtable,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher NULL
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher};
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherstatic void proxy_shutdown(struct be_req *req)
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher{
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* TODO: Clean up any internal data */
8e5549e453558d4bebdec333a93e215d5d6ffaecSimo Sorce be_req_terminate(req, DP_ERR_OK, EOK, NULL);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher}
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherstatic void proxy_auth_shutdown(struct be_req *req)
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher{
03abdaa21ecf562b714f204ca42379ff08626f75Simo Sorce struct be_ctx *be_ctx = be_req_get_be_ctx(req);
03abdaa21ecf562b714f204ca42379ff08626f75Simo Sorce talloc_free(be_ctx->bet_info[BET_AUTH].pvt_bet_data);
8e5549e453558d4bebdec333a93e215d5d6ffaecSimo Sorce be_req_terminate(req, DP_ERR_OK, EOK, NULL);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher}
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherstruct bet_ops proxy_id_ops = {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher .handler = proxy_get_account_info,
c8708cd958c633cc3c57a3460bdb15391200e1e1Sumit Bose .finalize = proxy_shutdown,
c8708cd958c633cc3c57a3460bdb15391200e1e1Sumit Bose .check_online = NULL
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher};
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherstruct bet_ops proxy_auth_ops = {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher .handler = proxy_pam_handler,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher .finalize = proxy_auth_shutdown
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher};
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherstruct bet_ops proxy_access_ops = {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher .handler = proxy_pam_handler,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher .finalize = proxy_auth_shutdown
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher};
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherstruct bet_ops proxy_chpass_ops = {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher .handler = proxy_pam_handler,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher .finalize = proxy_auth_shutdown
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher};
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherstatic void *proxy_dlsym(void *handle, const char *functemp, char *libname)
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher{
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher char *funcname;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher void *funcptr;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher funcname = talloc_asprintf(NULL, functemp, libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (funcname == NULL) return NULL;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher funcptr = dlsym(handle, funcname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher talloc_free(funcname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return funcptr;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher}
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherint sssm_proxy_id_init(struct be_ctx *bectx,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct bet_ops **ops, void **pvt_data)
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher{
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct proxy_id_ctx *ctx;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher char *libname;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher char *libpath;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher int ret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ctx = talloc_zero(bectx, struct proxy_id_ctx);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx) {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return ENOMEM;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ctx->be = bectx;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = confdb_get_string(bectx->cdb, ctx, bectx->conf_path,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher CONFDB_PROXY_LIBNAME, NULL, &libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (ret != EOK) goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (libname == NULL) {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ENOENT;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
51773686d354b82081830444c048706d83d43d65Jakub Hrozek ret = confdb_get_bool(bectx->cdb, bectx->conf_path,
51773686d354b82081830444c048706d83d43d65Jakub Hrozek CONFDB_PROXY_FAST_ALIAS, false, &ctx->fast_alias);
51773686d354b82081830444c048706d83d43d65Jakub Hrozek if (ret != EOK) goto done;
51773686d354b82081830444c048706d83d43d65Jakub Hrozek
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher libpath = talloc_asprintf(ctx, "libnss_%s.so.2", libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!libpath) {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ENOMEM;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->handle = dlopen(libpath, RTLD_NOW);
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose if (!ctx->handle) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Unable to load %s module with path, error: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov libpath, dlerror());
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ELIBACC;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.getpwnam_r = proxy_dlsym(ctx->handle, "_nss_%s_getpwnam_r",
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx->ops.getpwnam_r) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load NSS fns, error: %s\n", dlerror());
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ELIBBAD;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.getpwuid_r = proxy_dlsym(ctx->handle, "_nss_%s_getpwuid_r",
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx->ops.getpwuid_r) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load NSS fns, error: %s\n", dlerror());
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ELIBBAD;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.setpwent = proxy_dlsym(ctx->handle, "_nss_%s_setpwent", libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx->ops.setpwent) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load NSS fns, error: %s\n", dlerror());
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ELIBBAD;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.getpwent_r = proxy_dlsym(ctx->handle, "_nss_%s_getpwent_r",
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx->ops.getpwent_r) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load NSS fns, error: %s\n", dlerror());
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ELIBBAD;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.endpwent = proxy_dlsym(ctx->handle, "_nss_%s_endpwent", libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx->ops.endpwent) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load NSS fns, error: %s\n", dlerror());
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ELIBBAD;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.getgrnam_r = proxy_dlsym(ctx->handle, "_nss_%s_getgrnam_r",
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx->ops.getgrnam_r) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load NSS fns, error: %s\n", dlerror());
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ELIBBAD;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.getgrgid_r = proxy_dlsym(ctx->handle, "_nss_%s_getgrgid_r",
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx->ops.getgrgid_r) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load NSS fns, error: %s\n", dlerror());
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ELIBBAD;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.setgrent = proxy_dlsym(ctx->handle, "_nss_%s_setgrent", libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx->ops.setgrent) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load NSS fns, error: %s\n", dlerror());
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ELIBBAD;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.getgrent_r = proxy_dlsym(ctx->handle, "_nss_%s_getgrent_r",
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx->ops.getgrent_r) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load NSS fns, error: %s\n", dlerror());
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ELIBBAD;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.endgrent = proxy_dlsym(ctx->handle, "_nss_%s_endgrent", libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx->ops.endgrent) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load NSS fns, error: %s\n", dlerror());
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ELIBBAD;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.initgroups_dyn = proxy_dlsym(ctx->handle, "_nss_%s_initgroups_dyn",
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx->ops.initgroups_dyn) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "The '%s' library does not provides the "
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher "_nss_XXX_initgroups_dyn function!\n"
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher "initgroups will be slow as it will require "
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "full groups enumeration!\n", libname);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.setnetgrent = proxy_dlsym(ctx->handle, "_nss_%s_setnetgrent",
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose libname);
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose if (!ctx->ops.setnetgrent) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load _nss_%s_setnetgrent, error: %s. "
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose "The library does not support netgroups.\n", libname,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov dlerror());
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose }
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.getnetgrent_r = proxy_dlsym(ctx->handle, "_nss_%s_getnetgrent_r",
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose libname);
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose if (!ctx->ops.getgrent_r) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load _nss_%s_getnetgrent_r, error: %s. "
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose "The library does not support netgroups.\n", libname,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov dlerror());
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose }
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose ctx->ops.endnetgrent = proxy_dlsym(ctx->handle, "_nss_%s_endnetgrent",
e4c0aa467500c2919c76776d3667f4b08f1ad09dSumit Bose libname);
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose if (!ctx->ops.endnetgrent) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to load _nss_%s_endnetgrent, error: %s. "
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose "The library does not support netgroups.\n", libname,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov dlerror());
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose }
d7dc57bcc2468bee756bcd568daee0644e5b888dSumit Bose
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher ctx->ops.getservbyname_r = proxy_dlsym(ctx->handle,
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher "_nss_%s_getservbyname_r",
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher libname);
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher if (!ctx->ops.getservbyname_r) {
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher DEBUG(SSSDBG_MINOR_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Failed to load _nss_%s_getservbyname_r, error: %s. "
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher "The library does not support services.\n",
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher libname,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov dlerror());
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher }
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher ctx->ops.getservbyport_r = proxy_dlsym(ctx->handle,
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher "_nss_%s_getservbyport_r",
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher libname);
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher if (!ctx->ops.getservbyport_r) {
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher DEBUG(SSSDBG_MINOR_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Failed to load _nss_%s_getservbyport_r, error: %s. "
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher "The library does not support services.\n",
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher libname,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov dlerror());
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher }
aec5785126354bd8b192f63fe04ea08dae9c0705Stephen Gallagher
627d83dff183219826489949cb55ef71945e94abStephen Gallagher ctx->ops.setservent = proxy_dlsym(ctx->handle,
627d83dff183219826489949cb55ef71945e94abStephen Gallagher "_nss_%s_setservent",
627d83dff183219826489949cb55ef71945e94abStephen Gallagher libname);
627d83dff183219826489949cb55ef71945e94abStephen Gallagher if (!ctx->ops.setservent) {
627d83dff183219826489949cb55ef71945e94abStephen Gallagher DEBUG(SSSDBG_MINOR_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Failed to load _nss_%s_setservent, error: %s. "
627d83dff183219826489949cb55ef71945e94abStephen Gallagher "The library does not support services.\n",
627d83dff183219826489949cb55ef71945e94abStephen Gallagher libname,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov dlerror());
627d83dff183219826489949cb55ef71945e94abStephen Gallagher }
627d83dff183219826489949cb55ef71945e94abStephen Gallagher
627d83dff183219826489949cb55ef71945e94abStephen Gallagher ctx->ops.getservent_r = proxy_dlsym(ctx->handle,
627d83dff183219826489949cb55ef71945e94abStephen Gallagher "_nss_%s_getservent_r",
627d83dff183219826489949cb55ef71945e94abStephen Gallagher libname);
627d83dff183219826489949cb55ef71945e94abStephen Gallagher if (!ctx->ops.getservent_r) {
627d83dff183219826489949cb55ef71945e94abStephen Gallagher DEBUG(SSSDBG_MINOR_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Failed to load _nss_%s_getservent_r, error: %s. "
627d83dff183219826489949cb55ef71945e94abStephen Gallagher "The library does not support services.\n",
627d83dff183219826489949cb55ef71945e94abStephen Gallagher libname,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov dlerror());
627d83dff183219826489949cb55ef71945e94abStephen Gallagher }
627d83dff183219826489949cb55ef71945e94abStephen Gallagher
627d83dff183219826489949cb55ef71945e94abStephen Gallagher ctx->ops.endservent = proxy_dlsym(ctx->handle,
627d83dff183219826489949cb55ef71945e94abStephen Gallagher "_nss_%s_endservent",
627d83dff183219826489949cb55ef71945e94abStephen Gallagher libname);
627d83dff183219826489949cb55ef71945e94abStephen Gallagher if (!ctx->ops.endservent) {
627d83dff183219826489949cb55ef71945e94abStephen Gallagher DEBUG(SSSDBG_MINOR_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Failed to load _nss_%s_endservent, error: %s. "
627d83dff183219826489949cb55ef71945e94abStephen Gallagher "The library does not support services.\n",
627d83dff183219826489949cb55ef71945e94abStephen Gallagher libname,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov dlerror());
627d83dff183219826489949cb55ef71945e94abStephen Gallagher }
627d83dff183219826489949cb55ef71945e94abStephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher *ops = &proxy_id_ops;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher *pvt_data = ctx;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = EOK;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherdone:
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (ret != EOK) {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher talloc_free(ctx);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return ret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher}
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherstruct proxy_client {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct proxy_auth_ctx *proxy_auth_ctx;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct sbus_connection *conn;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct tevent_timer *timeout;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher bool initialized;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher};
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherstatic void init_timeout(struct tevent_context *ev,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct tevent_timer *te,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct timeval t, void *ptr);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherstatic int proxy_client_init(struct sbus_connection *conn, void *data)
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher{
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct proxy_auth_ctx *proxy_auth_ctx;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct proxy_client *proxy_cli;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct timeval tv;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher proxy_auth_ctx = talloc_get_type(data, struct proxy_auth_ctx);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* hang off this memory to the connection so that when the connection
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher * is freed we can potentially call a destructor */
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher proxy_cli = talloc_zero(conn, struct proxy_client);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!proxy_cli) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,"Out of memory?!\n");
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher talloc_zfree(conn);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return ENOMEM;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher proxy_cli->proxy_auth_ctx = proxy_auth_ctx;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher proxy_cli->conn = conn;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher proxy_cli->initialized = false;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* 5 seconds should be plenty */
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher tv = tevent_timeval_current_ofs(5, 0);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher proxy_cli->timeout = tevent_add_timer(proxy_auth_ctx->be->ev, proxy_cli,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher tv, init_timeout, proxy_cli);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!proxy_cli->timeout) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE,"Out of memory?!\n");
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher talloc_zfree(conn);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return ENOMEM;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_CONF_SETTINGS,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Set-up proxy client ID timeout [%p]\n", proxy_cli->timeout);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* Attach the client context to the connection context, so that it is
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher * always available when we need to manage the connection. */
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher sbus_conn_set_private_data(conn, proxy_cli);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return EOK;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher}
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherstatic void init_timeout(struct tevent_context *ev,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct tevent_timer *te,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct timeval t, void *ptr)
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher{
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct proxy_client *proxy_cli;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_OP_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Client timed out before Identification [%p]!\n", te);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher proxy_cli = talloc_get_type(ptr, struct proxy_client);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher sbus_disconnect(proxy_cli->conn);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher talloc_zfree(proxy_cli);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* If we time out here, we will also time out to
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher * pc_init_timeout(), so we'll finish the request
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher * there.
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher */
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher}
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
d9577dbd92555b0755881e37724019ef9c578404Stef Walterstatic int client_registration(struct sbus_request *dbus_req)
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher{
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher dbus_uint16_t version = DATA_PROVIDER_VERSION;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter struct sbus_connection *conn;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct proxy_client *proxy_cli;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher DBusError dbus_error;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher dbus_uint16_t cli_ver;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher uint32_t cli_id;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher dbus_bool_t dbret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher void *data;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher int hret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher hash_key_t key;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher hash_value_t value;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct tevent_req *req;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct proxy_child_ctx *child_ctx;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct pc_init_ctx *init_ctx;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter int ret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
d9577dbd92555b0755881e37724019ef9c578404Stef Walter conn = dbus_req->conn;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher data = sbus_conn_get_private_data(conn);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher proxy_cli = talloc_get_type(data, struct proxy_client);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!proxy_cli) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE, "Connection holds no valid init data\n");
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return EINVAL;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* First thing, cancel the timeout */
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_CONF_SETTINGS,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Cancel proxy client ID timeout [%p]\n", proxy_cli->timeout);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher talloc_zfree(proxy_cli->timeout);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher dbus_error_init(&dbus_error);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
d9577dbd92555b0755881e37724019ef9c578404Stef Walter dbret = dbus_message_get_args(dbus_req->message, &dbus_error,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher DBUS_TYPE_UINT16, &cli_ver,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher DBUS_TYPE_UINT32, &cli_id,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher DBUS_TYPE_INVALID);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!dbret) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Failed to parse message, killing connection\n");
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (dbus_error_is_set(&dbus_error)) dbus_error_free(&dbus_error);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher sbus_disconnect(conn);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* FIXME: should we just talloc_zfree(conn) ? */
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return EIO;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_FUNC_DATA, "Proxy client [%"PRIu32"] connected\n", cli_id);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* Check the hash table */
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher key.type = HASH_KEY_ULONG;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher key.ul = cli_id;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!hash_has_key(proxy_cli->proxy_auth_ctx->request_table, &key)) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Unknown child ID. Killing the connection\n");
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher sbus_disconnect(proxy_cli->conn);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return EIO;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* reply that all is ok */
d9577dbd92555b0755881e37724019ef9c578404Stef Walter ret = sbus_request_return_and_finish(dbus_req,
d9577dbd92555b0755881e37724019ef9c578404Stef Walter DBUS_TYPE_UINT16, &version,
d9577dbd92555b0755881e37724019ef9c578404Stef Walter DBUS_TYPE_INVALID);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter if (ret != EOK) {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher sbus_disconnect(conn);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter return ret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher hret = hash_lookup(proxy_cli->proxy_auth_ctx->request_table, &key, &value);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (hret != HASH_SUCCESS) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Hash error [%d][%s]\n", hret, hash_error_string(hret));
d9577dbd92555b0755881e37724019ef9c578404Stef Walter sbus_disconnect(dbus_req->conn);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* Signal that the child is up and ready to receive the request */
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher req = talloc_get_type(value.ptr, struct tevent_req);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher child_ctx = tevent_req_data(req, struct proxy_child_ctx);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!child_ctx->running) {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* This should hopefully be impossible, but protect
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher * against it anyway. If we're not marked running, then
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher * the init_req will be NULL below and things will
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher * break.
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher */
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Client connection from a request "
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "that's not marked as running\n");
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return EIO;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher init_ctx = tevent_req_data(child_ctx->init_req, struct pc_init_ctx);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter init_ctx->conn = dbus_req->conn;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher tevent_req_done(child_ctx->init_req);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher child_ctx->init_req = NULL;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return EOK;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher}
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherint sssm_proxy_auth_init(struct be_ctx *bectx,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct bet_ops **ops, void **pvt_data)
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher{
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct proxy_auth_ctx *ctx;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher int ret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher int hret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher char *sbus_address;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* If we're already set up, just return that */
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if(bectx->bet_info[BET_AUTH].mod_name &&
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher strcmp("proxy", bectx->bet_info[BET_AUTH].mod_name) == 0) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_TRACE_INTERNAL,
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov "Re-using proxy_auth_ctx for this provider\n");
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher *ops = bectx->bet_info[BET_AUTH].bet_ops;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher *pvt_data = bectx->bet_info[BET_AUTH].pvt_bet_data;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return EOK;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ctx = talloc_zero(bectx, struct proxy_auth_ctx);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx) {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return ENOMEM;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ctx->be = bectx;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ctx->timeout_ms = SSS_CLI_SOCKET_TIMEOUT/4;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ctx->next_id = 1;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = confdb_get_string(bectx->cdb, ctx, bectx->conf_path,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher CONFDB_PROXY_PAM_TARGET, NULL,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher &ctx->pam_target);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (ret != EOK) goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (!ctx->pam_target) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Missing option proxy_pam_target.\n");
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = EINVAL;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher sbus_address = talloc_asprintf(ctx, "unix:path=%s/%s_%s", PIPE_PATH,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher PROXY_CHILD_PIPE, bectx->domain->name);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (sbus_address == NULL) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf failed.\n");
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = ENOMEM;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = sbus_new_server(ctx, bectx->ev, sbus_address, &proxy_interface,
2c9a76e553f9239eaa91f32ccaf18b7a68316ce5Jakub Hrozek false, &ctx->sbus_srv, proxy_client_init, ctx);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (ret != EOK) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE, "Could not set up sbus server.\n");
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* Set up request hash table */
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher /* FIXME: get max_children from configuration file */
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ctx->max_children = 10;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher hret = hash_create(ctx->max_children * 2, &ctx->request_table,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher NULL, NULL);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (hret != HASH_SUCCESS) {
83bf46f4066e3d5e838a32357c201de9bd6ecdfdNikolai Kondrashov DEBUG(SSSDBG_FATAL_FAILURE, "Could not initialize request table\n");
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = EIO;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher goto done;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher *ops = &proxy_auth_ops;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher *pvt_data = ctx;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherdone:
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher if (ret != EOK) {
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher talloc_free(ctx);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher }
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return ret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher}
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherint sssm_proxy_access_init(struct be_ctx *bectx,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct bet_ops **ops, void **pvt_data)
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher{
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher int ret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = sssm_proxy_auth_init(bectx, ops, pvt_data);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher *ops = &proxy_access_ops;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return ret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher}
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagherint sssm_proxy_chpass_init(struct be_ctx *bectx,
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher struct bet_ops **ops, void **pvt_data)
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher{
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher int ret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher ret = sssm_proxy_auth_init(bectx, ops, pvt_data);
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher *ops = &proxy_chpass_ops;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher return ret;
2dd3faebcd3cfd00efda38ffd2585d675e696b12Stephen Gallagher}