dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina/*
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina Authors:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina Pavel Březina <pbrezina@redhat.com>
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina Copyright (C) 2016 Red Hat
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina This program is free software; you can redistribute it and/or modify
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina it under the terms of the GNU General Public License as published by
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina the Free Software Foundation; either version 3 of the License, or
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina (at your option) any later version.
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina This program is distributed in the hope that it will be useful,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina GNU General Public License for more details.
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina You should have received a copy of the GNU General Public License
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina*/
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include <talloc.h>
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include <tevent.h>
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include "sbus/sssd_dbus.h"
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include "providers/data_provider/dp_private.h"
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include "providers/data_provider/dp_iface.h"
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include "providers/backend.h"
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina#include "responder/nss/nss_iface.h"
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#include "util/util.h"
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina#define FILTER_TYPE(str, type) {str "=", sizeof(str "=") - 1, type}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastatic bool check_attr_type(uint32_t attr_type)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina switch (attr_type) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case BE_ATTR_CORE:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case BE_ATTR_MEM:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina case BE_ATTR_ALL:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return true;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina default:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return false;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return false;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
3d29430867cf92b2d71afa95abb679711231117cPavel Březinastatic bool check_and_parse_filter(struct dp_id_data *data,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *filter,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *extra)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina /* We will use sizeof() to determine the length of a string so we don't
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina * call strlen over and over again with each request. Not a bottleneck,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina * but unnecessary and simple to avoid. */
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina static struct {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *name;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina size_t lenght;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina uint32_t type;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina } types[] = {FILTER_TYPE("name", BE_FILTER_NAME),
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina FILTER_TYPE("idnumber", BE_FILTER_IDNUM),
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina FILTER_TYPE(DP_SEC_ID, BE_FILTER_SECID),
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina FILTER_TYPE(DP_CERT, BE_FILTER_CERT),
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina FILTER_TYPE(DP_WILDCARD, BE_FILTER_WILDCARD),
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina {0, 0, 0}};
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina int i;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dc30c60f166ad9adc63a47a1013508a71624ac87Petr Cech if (SBUS_IS_STRING_EMPTY(filter)) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return false;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina for (i = 0; types[i].name != NULL; i++) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (strncmp(filter, types[i].name, types[i].lenght) == 0) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina data->filter_type = types[i].type;
dc30c60f166ad9adc63a47a1013508a71624ac87Petr Cech data->filter_value = SBUS_SET_STRING(&filter[types[i].lenght]);
dc30c60f166ad9adc63a47a1013508a71624ac87Petr Cech data->extra_value = SBUS_SET_STRING(extra);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return true;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (strcmp(filter, ENUM_INDICATOR) == 0) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina data->filter_type = BE_FILTER_ENUM;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina data->filter_value = NULL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina data->extra_value = NULL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return true;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return false;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastruct dp_initgr_ctx {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *username;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *domain;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina uint32_t gnum;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina uint32_t *groups;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina};
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastatic struct dp_initgr_ctx *create_initgr_ctx(TALLOC_CTX *mem_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *domain,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct ldb_result *res)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_initgr_ctx *ctx;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *username;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina unsigned int i;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina errno_t ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ctx = talloc_zero(mem_ctx, struct dp_initgr_ctx);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ctx == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return NULL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina username = ldb_msg_find_attr_as_string(res->msgs[0], SYSDB_NAME, NULL);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (username == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = EINVAL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto done;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ctx->username = talloc_strdup(ctx, username);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ctx->username == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ENOMEM;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto done;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ctx->domain = talloc_strdup(ctx, domain);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ctx->domain == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ENOMEM;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto done;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ctx->groups = talloc_array(mem_ctx, uint32_t, res->count);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ctx->groups == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ENOMEM;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto done;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina /* The first GID is the primary so it might be duplicated
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina * later in the list. */
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina for (ctx->gnum = 0, i = 0; i < res->count; i++) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ctx->groups[ctx->gnum] = ldb_msg_find_attr_as_uint(res->msgs[i],
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina SYSDB_GIDNUM, 0);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina /* If 0 it may be a non-posix group, so we skip it. */
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ctx->groups[ctx->gnum] != 0) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ctx->gnum++;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = EOK;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinadone:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ret != EOK) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina talloc_free(ctx);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return NULL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return ctx;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastatic void dp_req_initgr_pp(const char *req_name,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct data_provider *provider,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_initgr_ctx *ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_reply_std *reply)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_client *dp_cli;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DBusMessage *msg;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dbus_bool_t dbret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina int num;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_cli = provider->clients[DPC_NSS];
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (dp_cli == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina msg = dbus_message_new_method_call(NULL,
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina NSS_MEMORYCACHE_PATH,
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina IFACE_NSS_MEMORYCACHE,
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina IFACE_NSS_MEMORYCACHE_UPDATEINITGROUPS);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (msg == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina num = ctx->gnum;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dbret = dbus_message_append_args(msg,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DBUS_TYPE_STRING, &ctx->username,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DBUS_TYPE_STRING, &ctx->domain,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina &ctx->groups, num,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DBUS_TYPE_INVALID);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (!dbret) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dbus_message_unref(msg);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_TRACE_FUNC,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina "Ordering NSS responder to update memory cache\n");
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina sbus_conn_send_reply(dp_client_conn(dp_cli), msg);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dbus_message_unref(msg);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinastatic errno_t dp_initgroups(struct sbus_request *sbus_req,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_client *dp_cli,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *key,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina uint32_t dp_flags,
3d29430867cf92b2d71afa95abb679711231117cPavel Březina struct dp_id_data *data)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct be_ctx *be_ctx;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct sss_domain_info *domain;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct dp_initgr_ctx *ctx;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina struct ldb_result *res;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina errno_t ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
2f18b8d67c86a1a277b59894f24ea6e09b41b7eaPavel Březina be_ctx = dp_client_be(dp_cli);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (data->domain == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina domain = be_ctx->domain;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina } else {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina domain = find_domain_by_name(be_ctx->domain, data->domain, true);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (domain == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return ERR_DOMAIN_NOT_FOUND;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = sysdb_initgroups(sbus_req, domain, data->filter_value, &res);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ret == ENOENT || (ret == EOK && res->count == 0)) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina /* There is no point in concacting NSS responder. Proceed as usual. */
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return EAGAIN;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina } else if (ret != EOK) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get initgroups [%d]: %s\n",
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret, sss_strerror(ret));
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto done;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ctx = create_initgr_ctx(sbus_req, data->domain, res);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ctx == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ENOMEM;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto done;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_req_with_reply_pp(dp_cli, data->domain, "Initgroups", key,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina sbus_req, DPT_ID, DPM_ACCOUNT_HANDLER, dp_flags, data,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_req_initgr_pp, ctx, struct dp_initgr_ctx,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_req_reply_std, struct dp_reply_std);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = EOK;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinadone:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina talloc_free(res);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinaerrno_t dp_get_account_info_handler(struct sbus_request *sbus_req,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina void *dp_cli,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina uint32_t dp_flags,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina uint32_t entry_type,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina uint32_t attr_type,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *filter,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *domain,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *extra)
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina{
3d29430867cf92b2d71afa95abb679711231117cPavel Březina struct dp_id_data *data;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina const char *key;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina errno_t ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (!check_attr_type(attr_type)) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return EINVAL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
3d29430867cf92b2d71afa95abb679711231117cPavel Březina data = talloc_zero(sbus_req, struct dp_id_data);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (data == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return ENOMEM;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina data->entry_type = entry_type;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina data->attr_type = attr_type;
a9aa70887985d37985093f1299fc15b2e060b2a0Pavel Březina data->domain = domain;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (!check_and_parse_filter(data, filter, extra)) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = EINVAL;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto done;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
806f65f3c90dc0f7921932494228ad93f3ed3027Lukas Slebodnik DEBUG(SSSDBG_FUNC_DATA,
806f65f3c90dc0f7921932494228ad93f3ed3027Lukas Slebodnik "Got request for [%#"PRIx32"][%s][%"PRId32"][%s]\n",
806f65f3c90dc0f7921932494228ad93f3ed3027Lukas Slebodnik data->entry_type, be_req2str(data->entry_type),
806f65f3c90dc0f7921932494228ad93f3ed3027Lukas Slebodnik attr_type, filter);
806f65f3c90dc0f7921932494228ad93f3ed3027Lukas Slebodnik
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina key = talloc_asprintf(data, "%u:%u:%s:%s:%s", data->entry_type,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina data->attr_type, extra, domain, filter);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (key == NULL) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = ENOMEM;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto done;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if ((data->entry_type & BE_REQ_TYPE_MASK) == BE_REQ_INITGROUPS) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = dp_initgroups(sbus_req, dp_cli, key, dp_flags, data);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ret != EAGAIN) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina goto done;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_req_with_reply(dp_cli, domain, "Account", key,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina sbus_req, DPT_ID, DPM_ACCOUNT_HANDLER, dp_flags, data,
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina dp_req_reply_std, struct dp_reply_std);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina ret = EOK;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březinadone:
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina if (ret != EOK) {
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina talloc_free(data);
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina }
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina return ret;
dea636af4d1902a081ee891f1b19ee2f8729d759Pavel Březina}