summaryrefslogtreecommitdiffstats
path: root/src/db/sysdb_views.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/db/sysdb_views.c')
-rw-r--r--src/db/sysdb_views.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/src/db/sysdb_views.c b/src/db/sysdb_views.c
index a42aa96ed..f2cf37023 100644
--- a/src/db/sysdb_views.c
+++ b/src/db/sysdb_views.c
@@ -948,6 +948,8 @@ errno_t sysdb_search_group_override_by_gid(TALLOC_CTX *mem_ctx,
* @param[in] domain Domain struct, needed to access the cache
* @oaram[in] obj The original object
* @param[in] override_obj The object with the override data, may be NULL
+ * @param[in] req_attrs List of attributes to be requested, if not set a
+ * default list dependig on the object type will be used
*
* @return EOK - Override data was added successfully
* @return ENOMEM - There was insufficient memory to complete the operation
@@ -958,7 +960,8 @@ errno_t sysdb_search_group_override_by_gid(TALLOC_CTX *mem_ctx,
*/
errno_t sysdb_add_overrides_to_object(struct sss_domain_info *domain,
struct ldb_message *obj,
- struct ldb_message *override_obj)
+ struct ldb_message *override_obj,
+ const char **req_attrs)
{
int ret;
const char *override_dn_str;
@@ -983,7 +986,8 @@ errno_t sysdb_add_overrides_to_object(struct sss_domain_info *domain,
{NULL, NULL}
};
size_t c;
- const char *tmp_str;
+ size_t d;
+ struct ldb_message_element *tmp_el;
tmp_ctx = talloc_new(NULL);
if (tmp_ctx == NULL) {
@@ -1016,12 +1020,15 @@ errno_t sysdb_add_overrides_to_object(struct sss_domain_info *domain,
goto done;
}
- uid = ldb_msg_find_attr_as_uint64(obj, SYSDB_UIDNUM, 0);
- if (uid == 0) {
- /* No UID hence group object */
- attrs = group_attrs;
- } else {
- attrs = user_attrs;
+ attrs = req_attrs;
+ if (attrs == NULL) {
+ uid = ldb_msg_find_attr_as_uint64(obj, SYSDB_UIDNUM, 0);
+ if (uid == 0) {
+ /* No UID hence group object */
+ attrs = group_attrs;
+ } else {
+ attrs = user_attrs;
+ }
}
ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res, override_dn,
@@ -1050,14 +1057,16 @@ errno_t sysdb_add_overrides_to_object(struct sss_domain_info *domain,
}
for (c = 0; attr_map[c].attr != NULL; c++) {
- tmp_str = ldb_msg_find_attr_as_string(override, attr_map[c].attr, NULL);
- if (tmp_str != NULL) {
- talloc_steal(obj, tmp_str);
- ret = ldb_msg_add_string(obj, attr_map[c].new_attr, tmp_str);
- if (ret != LDB_SUCCESS) {
- DEBUG(SSSDBG_OP_FAILURE, "ldb_msg_add_string failed.\n");
- ret = sysdb_error_to_errno(ret);
- goto done;
+ tmp_el = ldb_msg_find_element(override, attr_map[c].attr);
+ if (tmp_el != NULL) {
+ for (d = 0; d < tmp_el->num_values; d++) {
+ ret = ldb_msg_add_steal_value(obj, attr_map[c].new_attr,
+ &tmp_el->values[d]);
+ if (ret != LDB_SUCCESS) {
+ DEBUG(SSSDBG_OP_FAILURE, "ldb_msg_add_value failed.\n");
+ ret = sysdb_error_to_errno(ret);
+ goto done;
+ }
}
}
}