summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/db/sysdb.c53
-rw-r--r--src/db/sysdb.h6
-rw-r--r--src/providers/ldap/sdap_async_accounts.c40
3 files changed, 81 insertions, 18 deletions
diff --git a/src/db/sysdb.c b/src/db/sysdb.c
index ef9d0a237..94738c606 100644
--- a/src/db/sysdb.c
+++ b/src/db/sysdb.c
@@ -2256,3 +2256,56 @@ done:
talloc_free(tmpctx);
return ret;
}
+
+errno_t sysdb_attrs_primary_name_list(struct sysdb_ctx *sysdb,
+ TALLOC_CTX *mem_ctx,
+ struct sysdb_attrs **attr_list,
+ size_t attr_count,
+ const char *ldap_attr,
+ char ***name_list)
+{
+ errno_t ret;
+ size_t i, j;
+ char **list;
+ const char *name;
+
+ /* Assume that every entry has a primary name */
+ list = talloc_array(mem_ctx, char *, attr_count+1);
+ if (!list) {
+ return ENOMEM;
+ }
+
+ j = 0;
+ for (i = 0; i < attr_count; i++) {
+ ret = sysdb_attrs_primary_name(sysdb,
+ attr_list[i],
+ ldap_attr,
+ &name);
+ if (ret != EOK) {
+ DEBUG(1, ("Could not determine primary name\n"));
+ /* Skip and continue. Don't advance 'j' */
+ continue;
+ }
+
+ list[j] = talloc_strdup(list, name);
+ if (!list[j]) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ j++;
+ }
+
+ /* NULL-terminate the list */
+ list[j] = NULL;
+
+ *name_list = list;
+
+ ret = EOK;
+
+done:
+ if (ret != EOK) {
+ talloc_free(list);
+ }
+ return ret;
+}
diff --git a/src/db/sysdb.h b/src/db/sysdb.h
index 971a35f99..b7256911a 100644
--- a/src/db/sysdb.h
+++ b/src/db/sysdb.h
@@ -219,6 +219,12 @@ errno_t sysdb_attrs_primary_name(struct sysdb_ctx *sysdb,
struct sysdb_attrs *attrs,
const char *ldap_attr,
const char **_primary);
+errno_t sysdb_attrs_primary_name_list(struct sysdb_ctx *sysdb,
+ TALLOC_CTX *mem_ctx,
+ struct sysdb_attrs **attr_list,
+ size_t attr_count,
+ const char *ldap_attr,
+ char ***name_list);
/* convert an ldb error into an errno error */
int sysdb_error_to_errno(int ldberr);
diff --git a/src/providers/ldap/sdap_async_accounts.c b/src/providers/ldap/sdap_async_accounts.c
index 28d667c9a..71112b5f8 100644
--- a/src/providers/ldap/sdap_async_accounts.c
+++ b/src/providers/ldap/sdap_async_accounts.c
@@ -2006,12 +2006,13 @@ static int sdap_initgr_common_store(struct sysdb_ctx *sysdb,
*/
ldap_grouplist = NULL;
} else {
- ret = sysdb_attrs_to_list(tmp_ctx, ldap_groups,
- ldap_groups_count,
- SYSDB_NAME,
- &ldap_grouplist);
+ ret = sysdb_attrs_primary_name_list(
+ sysdb, tmp_ctx,
+ ldap_groups, ldap_groups_count,
+ opts->group_map[SDAP_AT_GROUP_NAME].name,
+ &ldap_grouplist);
if (ret != EOK) {
- DEBUG(1, ("sysdb_attrs_to_list failed [%d]: %s\n",
+ DEBUG(1, ("sysdb_attrs_primary_name_list failed [%d]: %s\n",
ret, strerror(ret)));
goto done;
}
@@ -2538,12 +2539,13 @@ static void sdap_initgr_nested_store(struct tevent_req *req)
/* Not all indirect groups may be cached.
* Add fake entries for those that are not */
- ret = sysdb_attrs_to_list(state, state->groups,
- state->groups_cur,
- SYSDB_NAME,
- &ldap_grouplist);
+ ret = sysdb_attrs_primary_name_list(
+ state->sysdb, state,
+ state->groups, state->groups_cur,
+ state->opts->group_map[SDAP_AT_GROUP_NAME].name,
+ &ldap_grouplist);
if (ret != EOK) {
- DEBUG(1, ("sysdb_attrs_to_list failed [%d]: %s\n",
+ DEBUG(1, ("sysdb_attrs_primary_name_list failed [%d]: %s\n",
ret, strerror(ret)));
goto done;
}
@@ -3965,10 +3967,11 @@ errno_t save_rfc2307bis_user_memberships(
ldap_grouplist = NULL;
}
else {
- ret = sysdb_attrs_to_list(tmp_ctx,
- state->ldap_groups, state->ldap_groups_count,
- SYSDB_NAME,
- &ldap_grouplist);
+ ret = sysdb_attrs_primary_name_list(
+ state->sysdb, tmp_ctx,
+ state->ldap_groups, state->ldap_groups_count,
+ state->opts->group_map[SDAP_AT_GROUP_NAME].name,
+ &ldap_grouplist);
if (ret != EOK) {
goto error;
}
@@ -4454,10 +4457,11 @@ static errno_t rfc2307bis_nested_groups_update_sysdb(
ldap_grouplist = NULL;
}
else {
- ret = sysdb_attrs_to_list(tmp_ctx,
- state->ldap_groups, state->ldap_groups_count,
- SYSDB_NAME,
- &ldap_grouplist);
+ ret = sysdb_attrs_primary_name_list(
+ state->sysdb, tmp_ctx,
+ state->ldap_groups, state->ldap_groups_count,
+ state->opts->group_map[SDAP_AT_GROUP_NAME].name,
+ &ldap_grouplist);
if (ret != EOK) {
goto error;
}