summaryrefslogtreecommitdiffstats
path: root/src/backend.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend.c')
-rw-r--r--src/backend.c139
1 files changed, 117 insertions, 22 deletions
diff --git a/src/backend.c b/src/backend.c
index fd830af..e7d3fdd 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -45,7 +45,7 @@
#include "plugin.h"
#include "map.h"
-#define MAP_CONFIGURATION_FILTER "(objectClass=*)"
+#define MAP_CONFIGURATION_FILTER "(objectClass=*)(base=*)(domain=*)(map=*)"
/* The data we ask the map cache to keep, for us, for each map. */
struct backend_map_data {
@@ -406,6 +406,14 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e,
ret->entry_filter = use_entry_filter;
ret->key_format = use_key_format;
ret->value_format = use_value_format;
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ state->plugin_desc->spd_id,
+ "initializing map %s in %s (3): "
+ "filter \"%s\", "
+ "key \"%s\", "
+ "value \"%s\"\n",
+ map, domain,
+ use_entry_filter, use_key_format, use_value_format);
}
/* Given a directory server entry which represents a map's configuration, set
@@ -441,7 +449,7 @@ backend_map_config_entry_add_one(struct plugin_state *state, Slapi_Entry *e,
cb_data.bases[i],
LDAP_SCOPE_SUB,
cb_data.entry_filter,
- NULL, 0,
+ NULL, FALSE,
NULL,
NULL,
state->plugin_identity,
@@ -587,7 +595,7 @@ backend_startup(struct plugin_state *state)
state->plugin_base,
LDAP_SCOPE_ONE,
MAP_CONFIGURATION_FILTER,
- NULL, 0,
+ NULL, FALSE,
NULL,
NULL,
state->plugin_identity,
@@ -629,41 +637,128 @@ backend_map_config_entry_delete_cb(Slapi_Entry *e, void *callback_data)
}
struct backend_get_map_config_cb {
- const char *domain, *map;
- struct backend_map_data *map_data;
+ struct plugin_state *state;
+ char **bases;
+ char *entry_filter;
};
+void
+backend_free_map_config(char **bases, char *entry_filter)
+{
+ int i;
+ if (bases != NULL) {
+ for (i = 0; bases[i] != NULL; i++) {
+ free(bases[i]);
+ }
+ }
+ free(bases);
+ free(entry_filter);
+}
+
static bool_t
-backend_get_map_config_cb(const char *domain, const char *map,
- void *backend_data, void *callback_data)
+backend_get_map_config_entry_cb(Slapi_Entry *e, void *callback_data)
{
+ Slapi_ValueSet *values;
+ Slapi_Value *value;
struct backend_get_map_config_cb *cbdata;
+ char *actual_attr, **ret;
+ const char *cvalue;
+ int disposition, buffer_flags, i, count;
+
cbdata = callback_data;
- if ((strcmp(domain, cbdata->domain) == 0) &&
- (strcmp(map, cbdata->map) == 0)) {
- cbdata->map_data = backend_data;
- return FALSE;
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ cbdata->state->plugin_desc->spd_id,
+ "reading map configuration from \"%s\"\n",
+ slapi_entry_get_ndn(e));
+
+ values = NULL;
+ value = NULL;
+ if (slapi_vattr_values_get(e, "base", &values,
+ &disposition, &actual_attr,
+ 0, &buffer_flags) == 0) {
+ count = slapi_valueset_count(values);
+ cbdata->bases = malloc(sizeof(char *) * (count + 1));
+ if (cbdata->bases != NULL) {
+ for (i = slapi_valueset_first_value(values, &value);
+ i != -1;
+ i = slapi_valueset_next_value(values, i, &value)) {
+ cvalue = slapi_value_get_string(value);
+ cbdata->bases[i] = strdup(cvalue);
+ }
+ cbdata->bases[count] = NULL;
+ }
+ slapi_vattr_values_free(&values, &actual_attr, buffer_flags);
}
+ if (slapi_vattr_values_get(e, "filter", &values,
+ &disposition, &actual_attr,
+ 0, &buffer_flags) == 0) {
+ if (slapi_valueset_first_value(values, &value) != -1) {
+ cvalue = slapi_value_get_string(value);
+ if (cvalue != NULL) {
+ free(cbdata->entry_filter);
+ cbdata->entry_filter = strdup(cvalue);
+ }
+ }
+ slapi_vattr_values_free(&values, &actual_attr, buffer_flags);
+ }
+
return TRUE;
}
void
backend_get_map_config(struct plugin_state *state,
const char *domain, const char *map,
- const char ***bases, const char **entry_filter)
+ char ***bases, char **entry_filter)
{
+ Slapi_PBlock *pb;
+ char *filter;
+ char *attrs[] = {"filter", "base", NULL};
+ const char *default_filter;
struct backend_get_map_config_cb cbdata;
- cbdata.domain = domain;
- cbdata.map = map;
- cbdata.map_data = NULL;
- map_data_foreach_map(state, NULL, backend_get_map_config_cb, &cbdata);
- if (cbdata.map_data != NULL) {
- *bases = (const char **) cbdata.map_data->bases;
- *entry_filter = cbdata.map_data->entry_filter;
- } else {
- *bases = NULL;
- *entry_filter = NULL;
+
+ /* Build the search filter. */
+ filter = malloc(strlen("(&(domain=)(map=)(base=*))") +
+ strlen(domain) + strlen(map) +
+ strlen(MAP_CONFIGURATION_FILTER) + 1);
+ if (filter == NULL) {
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ state->plugin_desc->spd_id,
+ "out of memory reading configuration for "
+ "\"%s\"/\"%s\"!\n", domain, map);
+ return;
}
+ sprintf(filter, "(&(domain=%s)(map=%s)(base=*)%s)",
+ domain, map, MAP_CONFIGURATION_FILTER);
+
+ /* Perform the search. */
+ pb = slapi_pblock_new();
+ slapi_search_internal_set_pb(pb,
+ state->plugin_base,
+ LDAP_SCOPE_SUB,
+ filter,
+ attrs, FALSE,
+ NULL,
+ NULL,
+ state->plugin_identity,
+ 0);
+ cbdata.bases = NULL;
+ cbdata.state = state;
+ defaults_get_map_config(map, &default_filter, NULL, NULL, NULL);
+ cbdata.entry_filter = strdup(default_filter);
+ slapi_search_internal_callback_pb(pb, &cbdata,
+ NULL,
+ backend_get_map_config_entry_cb,
+ NULL);
+
+ /* Return the results. */
+ *bases = cbdata.bases;
+ *entry_filter = backend_map_config_filter(cbdata.entry_filter,
+ domain, map);
+ free(cbdata.entry_filter);
+
+ /* Clean up. */
+ slapi_pblock_destroy(pb);
+ free(filter);
}
/* Our postoperation callbacks. */