sdap_async_netgroups.c revision b9941359b3181c42f415530d5ccad0f4664d85fa
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina/*
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina SSSD
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina Async LDAP Helper routines for netgroups
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina Authors:
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina Sumit Bose <sbose@redhat.com>
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina Copyright (C) 2010 Red Hat
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina This program is free software; you can redistribute it and/or modify
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina it under the terms of the GNU General Public License as published by
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina the Free Software Foundation; either version 3 of the License, or
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina (at your option) any later version.
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina This program is distributed in the hope that it will be useful,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina GNU General Public License for more details.
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina You should have received a copy of the GNU General Public License
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina*/
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina#include "util/util.h"
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina#include "db/sysdb.h"
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina#include "providers/ldap/sdap_async_private.h"
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina#include "providers/ldap/ldap_common.h"
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinabool is_dn(const char *str)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina int ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina LDAPDN dn;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = ldap_str2dn(str, &dn, LDAP_DN_FORMAT_LDAPV3);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ldap_dnfree(dn);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return (ret == LDAP_SUCCESS ? true : false);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinastatic errno_t sdap_save_netgroup(TALLOC_CTX *memctx,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sss_domain_info *dom,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sdap_options *opts,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sysdb_attrs *attrs,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina char **_timestamp,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina time_t now)
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ldb_message_element *el;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sysdb_attrs *netgroup_attrs;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char *name = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina char *timestamp = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina char **missing = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sdap_get_netgroup_primary_name(memctx, opts, attrs, dom, &name);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Failed to get netgroup name\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Processing netgroup %s\n", name);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina netgroup_attrs = sysdb_new_attrs(memctx);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (!netgroup_attrs) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sdap_attrs_add_string(attrs, SYSDB_ORIG_DN,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "original DN",
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina name, netgroup_attrs);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sysdb_attrs_get_el(attrs,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina opts->netgroup_map[SDAP_AT_NETGROUP_MODSTAMP].sys_name,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina &el);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (el->num_values == 0) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DEBUG(SSSDBG_TRACE_LIBS,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina "Original mod-Timestamp is not available for [%s].\n",
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina name);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina } else {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ret = sysdb_attrs_add_string(netgroup_attrs,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina opts->netgroup_map[SDAP_AT_NETGROUP_MODSTAMP].sys_name,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina (const char*)el->values[0].data);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ret) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto fail;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina timestamp = talloc_strdup(memctx, (const char*)el->values[0].data);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (!timestamp) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ret = ENOMEM;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto fail;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ret = sdap_attrs_add_list(attrs,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina opts->netgroup_map[SDAP_AT_NETGROUP_TRIPLE].sys_name,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina "netgroup triple",
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina name, netgroup_attrs);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ret != EOK) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto fail;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ret = sdap_attrs_add_list(attrs,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina opts->netgroup_map[SDAP_AT_NETGROUP_MEMBER].sys_name,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina "original members",
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina name, netgroup_attrs);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ret != EOK) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto fail;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ret = sdap_attrs_add_list(attrs, SYSDB_NETGROUP_MEMBER,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina "members", name, netgroup_attrs);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ret != EOK) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto fail;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Storing info for netgroup %s\n", name);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ret = sdap_save_all_names(name, attrs, dom, SYSDB_MEMBER_NETGROUP,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina netgroup_attrs);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ret != EOK) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Failed to save netgroup names\n");
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto fail;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina /* Make sure that any attributes we requested from LDAP that we
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina * did not receive are also removed from the sysdb
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina */
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ret = list_missing_attrs(attrs, opts->netgroup_map, SDAP_OPTS_NETGROUP,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina attrs, &missing);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ret != EOK) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Failed to list missing attributes\n");
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto fail;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina /* We store memberNisNetgroup from LDAP as originalMemberNisNetgroup in
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina * sysdb. It may contain simple name or DN. That's the reason why we always
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina * translate/generate simple name and store it in SYSDB_NETGROUP_MEMBER
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina * (memberNisNetgroup) in sysdb which is internally used for searching
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina * netgropus.
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina * We need to ensure if originalMemberNisNetgroup is missing,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina * memberNisNetgroup is missing too.
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina */
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (string_in_list(SYSDB_ORIG_NETGROUP_MEMBER, missing, false)) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ret = add_string_to_list(attrs, SYSDB_NETGROUP_MEMBER, &missing);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ret != EOK) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Failed to add string into list\n");
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto fail;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ret = sysdb_add_netgroup(dom, name, NULL, netgroup_attrs, missing,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina dom->netgroup_timeout, now);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ret) goto fail;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (_timestamp) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina *_timestamp = timestamp;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return EOK;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinafail:
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DEBUG(SSSDBG_OP_FAILURE, "Failed to save netgroup %s\n", name);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return ret;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina}
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinaerrno_t update_dn_list(struct dn_item *dn_list, const size_t count,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct ldb_message **res, bool *all_resolved)
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina{
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct dn_item *dn_item;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina size_t c;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina const char *dn;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina const char *cn;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina bool not_resolved = false;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina *all_resolved = false;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DLIST_FOR_EACH(dn_item, dn_list) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (dn_item->cn != NULL) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina continue;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina for(c = 0; c < count; c++) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina dn = ldb_msg_find_attr_as_string(res[c], SYSDB_ORIG_DN, NULL);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (dn == NULL) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Missing original DN.\n");
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return EINVAL;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (strcmp(dn, dn_item->dn) == 0) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DEBUG(SSSDBG_TRACE_ALL,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina "Found matching entry for [%s].\n", dn_item->dn);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina cn = ldb_msg_find_attr_as_string(res[c], SYSDB_NAME, NULL);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (cn == NULL) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Missing name.\n");
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return EINVAL;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina dn_item->cn = talloc_strdup(dn_item, cn);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina break;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (dn_item->cn == NULL) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina not_resolved = true;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina *all_resolved = !not_resolved;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return EOK;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina}
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinastruct netgr_translate_members_state {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct tevent_context *ev;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct sdap_options *opts;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct sdap_handle *sh;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct sysdb_attrs **netgroups;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina size_t count;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct dn_item *dn_list;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct dn_item *dn_item;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct dn_item *dn_idx;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina};
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinastatic errno_t netgr_translate_members_ldap_step(struct tevent_req *req);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinastatic void netgr_translate_members_ldap_done(struct tevent_req *subreq);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinastruct tevent_req *netgr_translate_members_send(TALLOC_CTX *memctx,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct tevent_context *ev,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct sdap_options *opts,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct sdap_handle *sh,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct sss_domain_info *dom,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct sysdb_ctx *sysdb,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina const size_t count,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sysdb_attrs **netgroups)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct netgr_translate_members_state *state;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina size_t c;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina size_t mc;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char **member_list;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina size_t sysdb_count;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ldb_message **sysdb_res;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct dn_item *dn_item;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina char *dn_filter;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina char *sysdb_filter;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ldb_dn *netgr_basedn;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina bool all_resolved;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char *cn_attr[] = { SYSDB_NAME, SYSDB_ORIG_DN, NULL };
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina req = tevent_req_create(memctx, &state,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct netgr_translate_members_state);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (req == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->ev = ev;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->opts = opts;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->sh = sh;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->netgroups = netgroups;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->count = count;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dn_list = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dn_item = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dn_idx = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina for (c = 0; c < count; c++) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sysdb_attrs_get_string_array(netgroups[c],
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina SYSDB_ORIG_NETGROUP_MEMBER, state,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina &member_list);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_TRACE_LIBS, "Missing netgroup members.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina continue;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina for (mc = 0; member_list[mc] != NULL; mc++) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (is_dn(member_list[mc])) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina dn_item = talloc_zero(state, struct dn_item);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (dn_item == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_TRACE_ALL,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "Adding [%s] to DN list.\n", member_list[mc]);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina dn_item->netgroup = netgroups[c];
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina dn_item->dn = member_list[mc];
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DLIST_ADD(state->dn_list, dn_item);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina } else {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sysdb_attrs_add_string(netgroups[c], SYSDB_NETGROUP_MEMBER,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina member_list[mc]);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "sysdb_attrs_add_string failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (state->dn_list == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_TRACE_ALL, "No DNs found among netgroup members.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_done(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_post(req, ev);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina dn_filter = talloc_strdup(state, "(|");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (dn_filter == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_strdup failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DLIST_FOR_EACH(dn_item, state->dn_list) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina dn_filter = talloc_asprintf_append(dn_filter, "(%s=%s)",
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina SYSDB_ORIG_DN, dn_item->dn);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (dn_filter == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf_append failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina dn_filter = talloc_asprintf_append(dn_filter, ")");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (dn_filter == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf_append failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina sysdb_filter = talloc_asprintf(state, "(&(%s)%s)", SYSDB_NC, dn_filter);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (sysdb_filter == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina netgr_basedn = sysdb_netgroup_base_dn(state, dom);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (netgr_basedn == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sysdb_search_entry(state, sysdb, netgr_basedn, LDB_SCOPE_BASE,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina sysdb_filter, cn_attr, &sysdb_count, &sysdb_res);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina talloc_zfree(netgr_basedn);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina talloc_zfree(sysdb_filter);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK && ret != ENOENT) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sysdb_search_entry failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret == EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = update_dn_list(state->dn_list, sysdb_count, sysdb_res,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina &all_resolved);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "update_dn_list failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (all_resolved) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DLIST_FOR_EACH(dn_item, state->dn_list) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sysdb_attrs_add_string(dn_item->netgroup,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina SYSDB_NETGROUP_MEMBER,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina dn_item->cn);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "sysdb_attrs_add_string failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_done(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_post(req, ev);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dn_idx = state->dn_list;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = netgr_translate_members_ldap_step(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK && ret != EAGAIN) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "netgr_translate_members_ldap_step failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret == EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_done(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_post(req, ev);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinafail:
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_error(req, ret);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_post(req, ev);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina/* netgr_translate_members_ldap_step() returns
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina * EOK: if everthing is translated, the caller can call tevent_req_done
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina * EAGAIN: if there are still members waiting to be translated, the caller
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina * should return to the mainloop
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina * Exyz: every other return code indicates an error and tevent_req_error
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina * should be called
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina */
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic errno_t netgr_translate_members_ldap_step(struct tevent_req *req)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct netgr_translate_members_state *state = tevent_req_data(req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct netgr_translate_members_state);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char **cn_attr;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina char *filter = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *subreq;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DLIST_FOR_EACH(state->dn_item, state->dn_idx) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (state->dn_item->cn == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina break;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (state->dn_item == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DLIST_FOR_EACH(state->dn_item, state->dn_list) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sysdb_attrs_add_string(state->dn_item->netgroup,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina SYSDB_NETGROUP_MEMBER,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dn_item->cn);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "sysdb_attrs_add_string failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_error(req, ret);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return EOK;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (!sss_ldap_dn_in_search_bases(state, state->dn_item->dn,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->opts->sdom->netgroup_search_bases,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina &filter)) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina /* not in search base, skip it */
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dn_idx = state->dn_item->next;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DLIST_REMOVE(state->dn_list, state->dn_item);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return netgr_translate_members_ldap_step(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina cn_attr = talloc_array(state, const char *, 3);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (cn_attr == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_array failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina cn_attr[0] = state->opts->netgroup_map[SDAP_AT_NETGROUP_NAME].name;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina cn_attr[1] = "objectclass";
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina cn_attr[2] = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_TRACE_ALL, "LDAP base search for [%s].\n", state->dn_item->dn);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina subreq = sdap_get_generic_send(state, state->ev, state->opts, state->sh,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dn_item->dn, LDAP_SCOPE_BASE, filter,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina cn_attr, state->opts->netgroup_map,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina SDAP_OPTS_NETGROUP,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina dp_opt_get_int(state->opts->basic,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina SDAP_SEARCH_TIMEOUT),
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina false);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (!subreq) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sdap_get_generic_send failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina talloc_steal(subreq, cn_attr);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_set_callback(subreq, netgr_translate_members_ldap_done, req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return EAGAIN;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic void netgr_translate_members_ldap_done(struct tevent_req *subreq)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *req = tevent_req_callback_data(subreq,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct netgr_translate_members_state *state = tevent_req_data(req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct netgr_translate_members_state);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina size_t count;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sysdb_attrs **netgroups;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char *str;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sdap_get_generic_recv(subreq, state, &count, &netgroups);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina talloc_zfree(subreq);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sdap_get_generic request failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina switch (count) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina case 0:
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "sdap_get_generic_recv found no entry for [%s].\n",
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dn_item->dn);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina break;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina case 1:
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sysdb_attrs_get_string(netgroups[0], SYSDB_NAME, &str);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sysdb_attrs_add_string failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina break;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dn_item->cn = talloc_strdup(state->dn_item, str);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (state->dn_item->cn == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_strdup failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina break;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina default:
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "Unexpected number of results [%zu] for base search.\n",
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina count);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (state->dn_item->cn == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "Failed to resolve netgroup name for DN [%s], using DN.\n",
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dn_item->dn);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dn_item->cn = talloc_strdup(state->dn_item, state->dn_item->dn);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dn_idx = state->dn_item->next;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = netgr_translate_members_ldap_step(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK && ret != EAGAIN) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "netgr_translate_members_ldap_step failed.\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto fail;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret == EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_done(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinafail:
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_error(req, ret);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic errno_t netgroup_translate_ldap_members_recv(struct tevent_req *req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina TALLOC_CTX *mem_ctx,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina size_t *count,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sysdb_attrs ***netgroups)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct netgr_translate_members_state *state = tevent_req_data(req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct netgr_translate_members_state);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *count = state->count;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *netgroups = talloc_steal(mem_ctx, state->netgroups);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return EOK;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina/* ==Search-Netgroups-with-filter============================================ */
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastruct sdap_get_netgroups_state {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_context *ev;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sdap_options *opts;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sdap_handle *sh;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sss_domain_info *dom;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sysdb_ctx *sysdb;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char **attrs;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char *base_filter;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina char *filter;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int timeout;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina char *higher_timestamp;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sysdb_attrs **netgroups;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina size_t count;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina size_t base_iter;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sdap_search_base **search_bases;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina};
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic errno_t sdap_get_netgroups_next_base(struct tevent_req *req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic void sdap_get_netgroups_process(struct tevent_req *subreq);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic void netgr_translate_members_done(struct tevent_req *subreq);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastruct tevent_req *sdap_get_netgroups_send(TALLOC_CTX *memctx,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_context *ev,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sss_domain_info *dom,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sysdb_ctx *sysdb,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sdap_options *opts,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sdap_search_base **search_bases,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sdap_handle *sh,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char **attrs,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char *filter,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int timeout)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina errno_t ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sdap_get_netgroups_state *state;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina req = tevent_req_create(memctx, &state, struct sdap_get_netgroups_state);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (!req) return NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->ev = ev;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->opts = opts;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->dom = dom;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->sh = sh;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->sysdb = sysdb;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->attrs = attrs;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->higher_timestamp = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->netgroups = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->count = 0;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->timeout = timeout;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->base_filter = filter;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->base_iter = 0;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->search_bases = search_bases;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (!state->search_bases) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "Netgroup lookup request without a netgroup search base\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = EINVAL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sdap_get_netgroups_next_base(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinadone:
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_error(req, ret);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_post(req, state->ev);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic errno_t sdap_get_netgroups_next_base(struct tevent_req *req)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *subreq;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sdap_get_netgroups_state *state;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state = tevent_req_data(req, struct sdap_get_netgroups_state);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina talloc_zfree(state->filter);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->filter = sdap_combine_filters(state, state->base_filter,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->search_bases[state->base_iter]->filter);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (!state->filter) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_TRACE_FUNC,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "Searching for netgroups with base [%s]\n",
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->search_bases[state->base_iter]->basedn);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina subreq = sdap_get_generic_send(
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state, state->ev, state->opts, state->sh,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->search_bases[state->base_iter]->basedn,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->search_bases[state->base_iter]->scope,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->filter, state->attrs,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->opts->netgroup_map, SDAP_OPTS_NETGROUP,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->timeout,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina false);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (!subreq) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_set_callback(subreq, sdap_get_netgroups_process, req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return EOK;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic void sdap_get_netgroups_process(struct tevent_req *subreq)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *req = tevent_req_callback_data(subreq,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sdap_get_netgroups_state *state = tevent_req_data(req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sdap_get_netgroups_state);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sdap_get_generic_recv(subreq, state,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina &state->count, &state->netgroups);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina talloc_zfree(subreq);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_error(req, ret);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_TRACE_FUNC,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "Search for netgroups, returned %zu results.\n", state->count);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (state->count == 0) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina /* No netgroups found in this search */
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->base_iter++;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (state->search_bases[state->base_iter]) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina /* There are more search bases to try */
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sdap_get_netgroups_next_base(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_error(req, ENOENT);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_error(req, ENOENT);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina subreq = netgr_translate_members_send(state, state->ev, state->opts,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->sh, state->dom, state->sysdb,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->count, state->netgroups);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (!subreq) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_error(req, ENOMEM);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_set_callback(subreq, netgr_translate_members_done, req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic void netgr_translate_members_done(struct tevent_req *subreq)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *req = tevent_req_callback_data(subreq,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sdap_get_netgroups_state *state = tevent_req_data(req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sdap_get_netgroups_state);
int ret;
size_t c;
time_t now;
ret = netgroup_translate_ldap_members_recv(subreq, state, &state->count,
&state->netgroups);
talloc_zfree(subreq);
if (ret) {
tevent_req_error(req, ret);
return;
}
now = time(NULL);
for (c = 0; c < state->count; c++) {
ret = sdap_save_netgroup(state,
state->dom,
state->opts,
state->netgroups[c],
&state->higher_timestamp,
now);
if (ret) {
DEBUG(SSSDBG_OP_FAILURE, "Failed to store netgroups.\n");
tevent_req_error(req, ret);
return;
}
}
DEBUG(SSSDBG_TRACE_ALL, "Saving %zu Netgroups - Done\n", state->count);
tevent_req_done(req);
}
int sdap_get_netgroups_recv(struct tevent_req *req,
TALLOC_CTX *mem_ctx, char **timestamp,
size_t *reply_count,
struct sysdb_attrs ***reply)
{
struct sdap_get_netgroups_state *state = tevent_req_data(req,
struct sdap_get_netgroups_state);
TEVENT_REQ_RETURN_ON_ERROR(req);
if (timestamp) {
*timestamp = talloc_steal(mem_ctx, state->higher_timestamp);
}
if (reply_count) {
*reply_count = state->count;
}
if (reply) {
*reply = talloc_steal(mem_ctx, state->netgroups);
}
return EOK;
}