diff options
Diffstat (limited to 'src/backend.c')
-rw-r--r-- | src/backend.c | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/src/backend.c b/src/backend.c index e3e12b8..a40241a 100644 --- a/src/backend.c +++ b/src/backend.c @@ -58,6 +58,7 @@ struct backend_map_data { char *domain, *map, **bases, *entry_filter, **key_formats; char *value_format; int n_key_formats; + char *disallowed_chars; char **ref_attrs; struct format_inref_attr **inref_attrs; }; @@ -175,6 +176,7 @@ backend_free_map_data_contents(void *data) free(map_data->domain); free(map_data->map); free(map_data->bases); + free(map_data->disallowed_chars); format_free_attr_list(map_data->ref_attrs); format_free_inref_attrs(map_data->inref_attrs); free(map_data->entry_filter); @@ -201,6 +203,8 @@ backend_copy_cb_data(const struct backend_map_data *data) ret->domain = strdup(data->domain); ret->map = strdup(data->map); ret->bases = backend_dup_strlist(data->bases); + ret->disallowed_chars = data->disallowed_chars ? + strdup(data->disallowed_chars) : NULL; ret->ref_attrs = data->ref_attrs ? format_dup_attr_list(data->ref_attrs) : NULL; @@ -214,6 +218,7 @@ backend_copy_cb_data(const struct backend_map_data *data) if ((ret->domain == NULL) || (ret->map == NULL) || (ret->bases == NULL) || + (ret->disallowed_chars == NULL) || (ret->entry_filter == NULL) || (ret->key_formats == NULL) || (ret->value_format == NULL)) { @@ -232,13 +237,14 @@ backend_map_config_entry_add_one_cb(Slapi_Entry *e, void *callback_data) char **keys, *value, *ndn; int i, j; data = callback_data; - /* Pull out the key and value for the entry. */ + /* Pull out the keys and value for the entry. */ keys = malloc((data->n_key_formats + 1) * sizeof(char *)); if (keys != NULL) { for (i = 0; i < data->n_key_formats; i++) { keys[i] = format_get_data(data->state, NULL, e, data->domain, data->map, data->key_formats[i], + data->disallowed_chars, &data->ref_attrs, &data->inref_attrs); } @@ -247,7 +253,7 @@ backend_map_config_entry_add_one_cb(Slapi_Entry *e, void *callback_data) return 0; } value = format_get_data(data->state, NULL, e, data->domain, data->map, - data->value_format, + data->value_format, data->disallowed_chars, &data->ref_attrs, &data->inref_attrs); /* Pull out the NDN of this entry. */ ndn = slapi_entry_get_ndn(e); @@ -400,19 +406,20 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e, bool_t *secure, struct backend_map_data *ret) { const char *default_filter, **default_key_formats; - const char *default_value_format; + const char *default_value_format, *default_disallowed_chars; char **bases, *entry_filter, **key_formats, *value_format, *actual_attr; - char **ref_attrs; + char **ref_attrs, *disallowed_chars; struct format_inref_attr **inref_attrs; char **use_bases, *use_entry_filter, **use_key_formats; - char *use_value_format; + char *use_value_format, *use_disallowed_chars; const char *cvalue; int i, j, disposition, buffer_flags, count; Slapi_ValueSet *values; Slapi_Value *value; /* Read the hard-coded defaults for a map with this name. */ defaults_get_map_config(map, secure, &default_filter, - &default_key_formats, &default_value_format); + &default_key_formats, &default_value_format, + &default_disallowed_chars); /* Read the values from the configuration entry. */ bases = NULL; if (slapi_vattr_values_get(e, MAP_CONFIGURATION_BASE_ATTR, &values, @@ -473,6 +480,17 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e, } slapi_vattr_values_free(&values, &actual_attr, buffer_flags); } + disallowed_chars = NULL; + if (slapi_vattr_values_get(e, MAP_CONFIGURATION_DISALLOWED_CHARS_ATTR, + &values, &disposition, &actual_attr, + 0, &buffer_flags) == 0) { + i = slapi_valueset_first_value(values, &value); + if (i != -1) { + cvalue = slapi_value_get_string(value); + disallowed_chars = strdup(cvalue); + } + slapi_vattr_values_free(&values, &actual_attr, buffer_flags); + } *secure = FALSE; if (slapi_vattr_values_get(e, MAP_CONFIGURATION_SECURE_ATTR, &values, &disposition, &actual_attr, @@ -506,6 +524,11 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e, strdup(value_format) : strdup(default_value_format); use_bases = backend_dup_strlist(bases); + use_disallowed_chars = disallowed_chars ? + disallowed_chars : + (default_disallowed_chars ? + strdup(default_disallowed_chars) : + NULL); /* Free the values we read from the entry. */ free(value_format); backend_free_strlist(key_formats); @@ -516,6 +539,7 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e, ret->domain = strdup(domain); ret->map = strdup(map); ret->bases = use_bases; + ret->disallowed_chars = use_disallowed_chars; ret->entry_filter = use_entry_filter; ret->key_formats = use_key_formats; ret->value_format = use_value_format; @@ -951,7 +975,8 @@ backend_get_map_config(struct plugin_state *state, cbdata.bases = NULL; cbdata.state = state; map_secure = FALSE; - defaults_get_map_config(map, &map_secure, &default_filter, NULL, NULL); + defaults_get_map_config(map, &map_secure, &default_filter, + NULL, NULL, NULL); cbdata.entry_filter = strdup(default_filter); slapi_search_internal_callback_pb(pb, &cbdata, NULL, |