summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-07-02 14:28:11 -0400
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-07-02 14:28:11 -0400
commitcf371e39181a3c6be8f697b2573d568313d450b1 (patch)
tree111871bd20eec79471ccc41f3a143e681515334a /src
parente5ebc03da2468fb9ddba1c291edc0528b5d01fc6 (diff)
downloadslapi-nis-cf371e39181a3c6be8f697b2573d568313d450b1.tar.gz
slapi-nis-cf371e39181a3c6be8f697b2573d568313d450b1.tar.xz
slapi-nis-cf371e39181a3c6be8f697b2573d568313d450b1.zip
- add rdn values to group and set entries
- send the result ourselves when the search is confined to one of our groups - recreate the entry from the ldif created using the entry so that it's well-formed
Diffstat (limited to 'src')
-rw-r--r--src/back-sch.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/src/back-sch.c b/src/back-sch.c
index 4eb1873..92ff82e 100644
--- a/src/back-sch.c
+++ b/src/back-sch.c
@@ -359,8 +359,16 @@ backend_set_entry_one(Slapi_Entry *e, struct backend_set_data *data)
slapi_entry_add_string(entry,
"objectClass", "extensibleObject");
}
- /* Produce some LDIF. */
+ /* Clean up some LDIF. */
ldif = slapi_entry2str(entry, &len);
+ /* Recreate the entry. */
+ slapi_entry_free(entry);
+ entry = slapi_str2entry(ldif,
+ SLAPI_STR2ENTRY_REMOVEDUPVALS |
+ SLAPI_STR2ENTRY_ADDRDNVALS |
+ SLAPI_STR2ENTRY_EXPAND_OBJECTCLASSES |
+ SLAPI_STR2ENTRY_NOT_WELL_FORMED_LDIF);
+ slapi_ch_free((void **) &ldif);
/* Normalize the RDN, so that we can use it as a key. */
srdn = slapi_rdn_new_sdn(slapi_entry_get_sdn(entry));
if (srdn != NULL) {
@@ -370,17 +378,17 @@ backend_set_entry_one(Slapi_Entry *e, struct backend_set_data *data)
}
/* If we actually generated a useful new entry for this entry, then set
* it, otherwise clear it in case there was one set before. */
- if ((rdnstr != NULL) && (ldif != NULL)) {
+ if ((rdnstr != NULL) && (slapi_entry_get_ndn(entry) != NULL)) {
slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id,
"setting group/container/key/value "
"\"%s\"/\"%s\"/\"%s\"(\"%s\")=\"%s\"\n",
data->common.group, data->common.set,
- rdn, ndn, ldif);
+ rdn, ndn, slapi_entry_get_ndn(entry));
keys[0] = (char *) rdnstr;
keys[1] = NULL;
map_data_set_entry(data->common.state,
data->common.group, data->common.set, ndn,
- NULL, keys, len, ldif,
+ NULL, keys, len, slapi_entry_get_ndn(entry),
backend_entry_make_entry_data(entry),
backend_entry_free_entry_data);
} else {
@@ -393,7 +401,6 @@ backend_set_entry_one(Slapi_Entry *e, struct backend_set_data *data)
slapi_entry_free(entry);
}
slapi_rdn_free(&srdn);
- slapi_ch_free((void **) &ldif);
format_free_data(rdn);
}
@@ -726,6 +733,9 @@ backend_search_set_cb(const char *group, const char *set, bool_t flag,
slapi_entry_add_string(set_entry,
"objectClass", "extensibleObject");
slapi_entry_set_sdn(set_entry, set_data->container_sdn);
+ if (!slapi_entry_rdn_values_present(set_entry)) {
+ slapi_entry_add_rdn_values(set_entry);
+ }
ndn = slapi_sdn_get_ndn(set_data->container_sdn);
result = slapi_filter_test(cbdata->pb, set_entry,
cbdata->filter,
@@ -809,6 +819,9 @@ backend_search_group_cb(const char *group, void *cb_data)
slapi_entry_add_string(group_entry,
"objectClass", "extensibleObject");
slapi_entry_set_sdn(group_entry, group_dn);
+ if (!slapi_entry_rdn_values_present(group_entry)) {
+ slapi_entry_add_rdn_values(group_entry);
+ }
result = slapi_filter_test(cbdata->pb, group_entry,
cbdata->filter,
cbdata->check_access);
@@ -840,10 +853,15 @@ backend_search_group_cb(const char *group, void *cb_data)
}
slapi_entry_free(group_entry);
}
- slapi_sdn_free(&group_dn);
/* Now check the group's sets and their contents. */
map_data_foreach_map(cbdata->state, group,
backend_search_set_cb, cbdata);
+ /* If the search is confined to this group, we need to send the result
+ * ourselves. */
+ if (slapi_sdn_scope_test(cbdata->target_dn, group_dn, LDAP_SCOPE_SUB)) {
+ cbdata->answer = TRUE;
+ }
+ slapi_sdn_free(&group_dn);
return TRUE;
}
@@ -881,7 +899,7 @@ backend_search_cb(Slapi_PBlock *pb)
return cbdata.answer ? -1 : 0;
}
-/* Populate our data. */
+/* Populate our data cache. */
void
backend_startup(struct plugin_state *state)
{
@@ -899,6 +917,7 @@ backend_init_preop(Slapi_PBlock *pb, struct plugin_state *state)
"error hooking up search callback\n");
}
}
+
void
backend_init_postop(Slapi_PBlock *pb, struct plugin_state *state)
{