63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose/*
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose SSSD
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose Authors:
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose Sumit Bose <sbose@redhat.com>
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose Copyright (C) 2016 Red Hat
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose This program is free software; you can redistribute it and/or modify
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose it under the terms of the GNU General Public License as published by
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose the Free Software Foundation; either version 3 of the License, or
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose (at your option) any later version.
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose This program is distributed in the hope that it will be useful,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose but WITHOUT ANY WARRANTY; without even the implied warranty of
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose GNU General Public License for more details.
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose You should have received a copy of the GNU General Public License
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose along with this program. If not, see <http://www.gnu.org/licenses/>.
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose*/
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose#include "util/util.h"
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose#include "providers/ad/ad_pac.h"
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose#include "providers/ad/ad_common.h"
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose#include "providers/ad/ad_id.h"
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose#include "providers/ldap/sdap_idmap.h"
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose#include "providers/ldap/sdap_async_ad.h"
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bosestatic errno_t find_user_entry(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom,
3d29430867cf92b2d71afa95abb679711231117cPavel Březina struct dp_id_data *ar,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ldb_message **_msg)
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose{
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose const char *user_attrs[] = { SYSDB_NAME, SYSDB_OBJECTCLASS,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose SYSDB_PAC_BLOB, SYSDB_PAC_BLOB_EXPIRE,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose NULL };
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ldb_message *msg;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ldb_result *res;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose int ret;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose TALLOC_CTX *tmp_ctx = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (dom == NULL || ar == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "Missing arguments.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return EINVAL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose tmp_ctx = talloc_new(NULL);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (tmp_ctx == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ar->extra_value && strcmp(ar->extra_value, EXTRA_NAME_IS_UPN) == 0) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = sysdb_search_user_by_upn(tmp_ctx, dom, ar->filter_value,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose user_attrs, &msg);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose } else {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose switch (ar->filter_type) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose case BE_FILTER_SECID:
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = sysdb_search_user_by_sid_str(tmp_ctx, dom, ar->filter_value,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose user_attrs, &msg);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose break;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose case BE_FILTER_UUID:
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = sysdb_search_object_by_uuid(tmp_ctx, dom, ar->filter_value,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose user_attrs, &res);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret == EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (res->count == 1) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose msg = res->msgs[0];
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose } else {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose talloc_free(res);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_CRIT_FAILURE,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose "Search by UUID returned multiple results.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EINVAL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose break;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose case BE_FILTER_NAME:
d62f7e644be93477fc869698f6eb3d55f08167a9Jakub Hrozek ret = sysdb_search_user_by_name(tmp_ctx, dom, ar->filter_value,
d62f7e644be93477fc869698f6eb3d55f08167a9Jakub Hrozek user_attrs, &msg);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose break;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose default:
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "Unsupported filter type [%d].\n",
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ar->filter_type);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EINVAL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret == ENOENT) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_TRACE_ALL, "No user found with filter [%s].\n",
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ar->filter_value);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose } else {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose "Looking up user in cache with filter [%s] failed.\n",
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ar->filter_value);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose *_msg = talloc_steal(mem_ctx, msg);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EOK;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bosedone:
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose talloc_free(tmp_ctx);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return ret;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose}
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Boseerrno_t check_if_pac_is_available(TALLOC_CTX *mem_ctx,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct sss_domain_info *dom,
3d29430867cf92b2d71afa95abb679711231117cPavel Březina struct dp_id_data *ar,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ldb_message **_msg)
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose{
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ldb_message *msg;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ldb_message_element *el;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose uint64_t pac_expires;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose time_t now;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose int ret;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = find_user_entry(mem_ctx, dom, ar, &msg);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "find_user_entry failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return ret;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose el = ldb_msg_find_element(msg, SYSDB_PAC_BLOB);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (el == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_TRACE_ALL, "No PAC available.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose talloc_free(msg);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return ENOENT;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose pac_expires = ldb_msg_find_attr_as_uint64(msg, SYSDB_PAC_BLOB_EXPIRE, 0);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose now = time(NULL);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (pac_expires < now) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_TRACE_FUNC, "PAC avaiable but too old.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose talloc_free(msg);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return ENOENT;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (_msg != NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose *_msg = msg;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return EOK;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose}
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Boseerrno_t ad_get_sids_from_pac(TALLOC_CTX *mem_ctx,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct sss_idmap_ctx *idmap_ctx,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct PAC_LOGON_INFO *logon_info,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char **_user_sid_str,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char **_primary_group_sid_str,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose size_t *_num_sids,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *** _sid_list)
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose{
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose int ret;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose size_t s;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct netr_SamInfo3 *info3;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *sid_str = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *msid_str = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *user_dom_sid_str = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose size_t user_dom_sid_str_len;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose enum idmap_error_code err;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose hash_table_t *sid_table = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose hash_key_t key;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose hash_value_t value;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *rid_start;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *user_sid_str = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *primary_group_sid_str = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose size_t c;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose size_t num_sids;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char **sid_list = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct hash_iter_context_t *iter = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose hash_entry_t *entry;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose TALLOC_CTX *tmp_ctx;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (idmap_ctx == NULL || logon_info == NULL
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose || _num_sids == NULL || _sid_list == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "Missing parameter.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return EINVAL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose tmp_ctx = talloc_new(NULL);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (tmp_ctx == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose info3 = &logon_info->info3;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = sss_hash_create(tmp_ctx,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose info3->sidcount + info3->base.groups.count + 2,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &sid_table);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "sss_hash_create failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose key.type = HASH_KEY_STRING;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose value.type = HASH_VALUE_ULONG;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose err = sss_idmap_smb_sid_to_sid(idmap_ctx, info3->base.domain_sid,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &user_dom_sid_str);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (err != IDMAP_SUCCESS) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "sss_idmap_smb_sid_to_sid failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EFAULT;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose user_dom_sid_str_len = strlen(user_dom_sid_str);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose sid_str = talloc_zero_size(tmp_ctx, user_dom_sid_str_len + 12);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (sid_str == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "talloc_zero_size failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose rid_start = sid_str + user_dom_sid_str_len;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose memcpy(sid_str, user_dom_sid_str, user_dom_sid_str_len);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose memset(rid_start, '\0', 12);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = snprintf(rid_start, 12, "-%lu",
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose (unsigned long) info3->base.rid);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret < 0 || ret > 12) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "snprintf failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EIO;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose user_sid_str = talloc_strdup(tmp_ctx, sid_str);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (user_sid_str == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose key.str = sid_str;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose value.ul = 0;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose memset(rid_start, '\0', 12);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = snprintf(rid_start, 12, "-%lu",
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose (unsigned long) info3->base.primary_gid);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret < 0 || ret > 12) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "snprintf failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EIO;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose primary_group_sid_str = talloc_strdup(tmp_ctx, sid_str);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (primary_group_sid_str == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose key.str = sid_str;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose value.ul = 0;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = hash_enter(sid_table, &key, &value);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != HASH_SUCCESS) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "hash_enter failed [%d][%s].\n",
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret, hash_error_string(ret));
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EIO;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose for (s = 0; s < info3->base.groups.count; s++) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose memset(rid_start, '\0', 12);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = snprintf(rid_start, 12, "-%lu",
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose (unsigned long) info3->base.groups.rids[s].rid);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret < 0 || ret > 12) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "snprintf failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EIO;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose key.str = sid_str;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose value.ul = 0;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = hash_enter(sid_table, &key, &value);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != HASH_SUCCESS) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "hash_enter failed [%d][%s].\n",
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret, hash_error_string(ret));
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EIO;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose for(s = 0; s < info3->sidcount; s++) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose err = sss_idmap_smb_sid_to_sid(idmap_ctx, info3->sids[s].sid,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &msid_str);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (err != IDMAP_SUCCESS) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "sss_idmap_smb_sid_to_sid failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EFAULT;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose key.str = msid_str;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose value.ul = 0;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = hash_enter(sid_table, &key, &value);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose sss_idmap_free_sid(idmap_ctx, msid_str);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != HASH_SUCCESS) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "hash_enter failed [%d][%s].\n",
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret, hash_error_string(ret));
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EIO;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose num_sids = hash_count(sid_table);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose sid_list = talloc_array(tmp_ctx, char *, num_sids);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (sid_list == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "talloc_array failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose iter = new_hash_iter_context(sid_table);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (iter == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "new_hash_iter_context failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EINVAL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose c = 0;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose while ((entry = iter->next(iter)) != NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose sid_list[c] = talloc_strdup(sid_list, entry->key.str);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (sid_list[c] == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose c++;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EOK;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bosedone:
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose sss_idmap_free_sid(idmap_ctx, user_dom_sid_str);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose hash_destroy(sid_table);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret == EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose *_sid_list = talloc_steal(mem_ctx, sid_list);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose *_user_sid_str = talloc_steal(mem_ctx, user_sid_str);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose *_num_sids = num_sids;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose *_primary_group_sid_str = talloc_steal(mem_ctx, primary_group_sid_str);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose talloc_free(tmp_ctx);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return ret;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose}
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Boseerrno_t ad_get_pac_data_from_user_entry(TALLOC_CTX *mem_ctx,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ldb_message *msg,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct sss_idmap_ctx *idmap_ctx,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char **_username,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char **user_sid,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char **primary_group_sid,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose size_t *num_sids,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char ***group_sids)
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose{
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose int ret;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ldb_message_element *el;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct PAC_LOGON_INFO *logon_info = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose const char *dummy;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose TALLOC_CTX *tmp_ctx = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *username;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose tmp_ctx = talloc_new(NULL);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (tmp_ctx == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose el = ldb_msg_find_element(msg, SYSDB_PAC_BLOB);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (el == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "Missing PAC blob.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EINVAL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (el->num_values != 1) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "Expected only one PAC blob.");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EINVAL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = ad_get_data_from_pac(tmp_ctx, el->values[0].data,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose el->values[0].length,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &logon_info);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "get_data_from_pac failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose dummy = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (dummy == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "Missing user name in cache entry.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EINVAL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose username = talloc_strdup(tmp_ctx, dummy);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (username == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "talloc_strdup failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = ad_get_sids_from_pac(mem_ctx, idmap_ctx, logon_info,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose user_sid, primary_group_sid,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose num_sids, group_sids);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "get_sids_from_pac failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose *_username = talloc_steal(mem_ctx, username);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = EOK;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bosedone:
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose talloc_free(tmp_ctx);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return ret;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose}
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bosestruct ad_handle_pac_initgr_state {
3d29430867cf92b2d71afa95abb679711231117cPavel Březina struct dp_id_data *ar;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose const char *err;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose int dp_error;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose int sdap_ret;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose size_t num_missing_sids;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char **missing_sids;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose size_t num_cached_groups;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char **cached_groups;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *username;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct sss_domain_info *user_dom;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose};
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bosestatic void ad_handle_pac_initgr_lookup_sids_done(struct tevent_req *subreq);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bosestruct tevent_req *ad_handle_pac_initgr_send(TALLOC_CTX *mem_ctx,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct be_ctx *be_ctx,
3d29430867cf92b2d71afa95abb679711231117cPavel Březina struct dp_id_data *ar,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct sdap_id_ctx *id_ctx,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct sdap_domain *sdom,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct sdap_id_conn_ctx *conn,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose bool noexist_delete,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ldb_message *msg)
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose{
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose int ret;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ad_handle_pac_initgr_state *state;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct tevent_req *req;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct tevent_req *subreq;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *user_sid;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char *primary_group_sid;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose size_t num_sids;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char **group_sids;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose bool use_id_mapping;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose req = tevent_req_create(mem_ctx, &state,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ad_handle_pac_initgr_state);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (req == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "tevent_req_create failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->user_dom = sdom->dom;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose /* The following variables are currently unused because no sub-request
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * returns any of them. But they are needed to allow the same signature as
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * sdap_handle_acct_req_recv() from the alternative group-membership
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * lookup path. */
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->err = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->dp_error = DP_ERR_OK;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->sdap_ret = EOK;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = ad_get_pac_data_from_user_entry(state, msg,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose id_ctx->opts->idmap_ctx->map,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &state->username,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &user_sid, &primary_group_sid,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &num_sids, &group_sids);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "ad_get_pac_data_from_user_entry failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose use_id_mapping = sdap_idmap_domain_has_algorithmic_mapping(
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose id_ctx->opts->idmap_ctx,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose sdom->dom->name,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose sdom->dom->domain_id);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (use_id_mapping
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose && sdom->dom->ignore_group_members == false) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose /* In contrast to the tokenGroups based group-membership lookup the
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * PAC based approach can be used for sub-domains with id-mapping as
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * well because the PAC will only contain groups which are valid in
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * the target domain, i.e. it will not contain domain-local groups for
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * domains other than the user domain. This means the groups must not
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * be looked up immediately to determine if they are domain-local or
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * not.
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose *
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * Additionally, as a temporary workaround until
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * https://fedorahosted.org/sssd/ticket/2522 is fixed, we also fetch
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * the group object if group members are ignored to avoid having to
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * transfer and retain members when the fake tokengroups object
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * without name is replaced by the full group object.
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose */
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_TRACE_ALL, "Running PAC processing with id-mapping.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = sdap_ad_save_group_membership_with_idmapping(state->username,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose sdom->dom,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose id_ctx->opts->idmap_ctx,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose num_sids, group_sids);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose "sdap_ad_save_group_membership_with_idmapping failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose /* this path only includes cache operation, so we can finish the
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose * request immediately */
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose } else {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_TRACE_ALL, "Running PAC processing with external IDs.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = sdap_ad_tokengroups_get_posix_members(state, sdom->dom,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose num_sids, group_sids,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &state->num_missing_sids,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &state->missing_sids,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &state->num_cached_groups,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &state->cached_groups);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose "sdap_ad_tokengroups_get_posix_members failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose /* download missing SIDs */
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose subreq = sdap_ad_resolve_sids_send(state, be_ctx->ev, id_ctx,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose conn,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose id_ctx->opts, sdom->dom,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->missing_sids);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (subreq == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "sdap_ad_resolve_sids_send failed.\n");
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose tevent_req_set_callback(subreq, ad_handle_pac_initgr_lookup_sids_done,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose req);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return req;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bosedone:
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret == EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose tevent_req_done(req);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose } else {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose tevent_req_error(req, ret);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose tevent_req_post(req, be_ctx->ev);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return req;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose}
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bosestatic void ad_handle_pac_initgr_lookup_sids_done(struct tevent_req *subreq)
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose{
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ad_handle_pac_initgr_state *state;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct tevent_req *req = NULL;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose errno_t ret;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose char **cached_groups;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose size_t num_cached_groups;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose req = tevent_req_callback_data(subreq, struct tevent_req);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state = tevent_req_data(req, struct ad_handle_pac_initgr_state);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = sdap_ad_resolve_sids_recv(subreq);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose talloc_zfree(subreq);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_CRIT_FAILURE, "Unable to resolve missing SIDs "
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose "[%d]: %s\n", ret, strerror(ret));
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = sdap_ad_tokengroups_get_posix_members(state, state->user_dom,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->num_missing_sids,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->missing_sids,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose NULL, NULL,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &num_cached_groups,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose &cached_groups);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != EOK){
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_MINOR_FAILURE,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose "sdap_ad_tokengroups_get_posix_members failed [%d]: %s\n",
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret, strerror(ret));
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->cached_groups = concatenate_string_array(state,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->cached_groups,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->num_cached_groups,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose cached_groups,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose num_cached_groups);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (state->cached_groups == NULL) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = ENOMEM;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose /* update membership of existing groups */
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret = sdap_ad_tokengroups_update_members(state->username,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->user_dom->sysdb,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->user_dom,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state->cached_groups);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose DEBUG(SSSDBG_MINOR_FAILURE, "Membership update failed [%d]: %s\n",
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose ret, strerror(ret));
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose goto done;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bosedone:
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (ret != EOK) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose tevent_req_error(req, ret);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose tevent_req_done(req);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose}
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Boseerrno_t ad_handle_pac_initgr_recv(struct tevent_req *req,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose int *_dp_error, const char **_err,
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose int *sdap_ret)
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose{
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose struct ad_handle_pac_initgr_state *state;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose state = tevent_req_data(req, struct ad_handle_pac_initgr_state);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (_dp_error) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose *_dp_error = state->dp_error;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (_err) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose *_err = state->err;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose if (sdap_ret) {
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose *sdap_ret = state->sdap_ret;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose }
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose TEVENT_REQ_RETURN_ON_ERROR(req);
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose return EOK;
63b8e826f62d2e8930c872de7d4cc8b5bc15d4a4Sumit Bose}