summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin@redhat.com>2010-11-22 16:54:05 -0500
committerNalin Dahyabhai <nalin@redhat.com>2010-11-22 16:54:05 -0500
commit35627435cea0c00e682b524ae3d0fa1d711ad4ab (patch)
tree90df463c953c5dbaee88a12e946bfedaf7e0f448 /src
parent7624cdfed031262c4ea00d476ef591d352a2bc88 (diff)
downloadslapi-nis-35627435cea0c00e682b524ae3d0fa1d711ad4ab.tar.gz
slapi-nis-35627435cea0c00e682b524ae3d0fa1d711ad4ab.tar.xz
slapi-nis-35627435cea0c00e682b524ae3d0fa1d711ad4ab.zip
- handle a group with no explicitly-named container by treating the
entries as direct subordinates of the group entry
Diffstat (limited to 'src')
-rw-r--r--src/back-sch.c72
-rw-r--r--src/back-shr.c2
2 files changed, 55 insertions, 19 deletions
diff --git a/src/back-sch.c b/src/back-sch.c
index 6fc9c30..b22c44f 100644
--- a/src/back-sch.c
+++ b/src/back-sch.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2008,2009 Red Hat, Inc.
+ * Copyright 2008,2009,2010 Red Hat, Inc.
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -51,7 +51,7 @@
#include "plugin.h"
#include "map.h"
-#define SCH_CONTAINER_CONFIGURATION_FILTER "(&(" SCH_CONTAINER_CONFIGURATION_GROUP_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_CONTAINER_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_BASE_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_FILTER_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_RDN_ATTR "=*))"
+#define SCH_CONTAINER_CONFIGURATION_FILTER "(&(" SCH_CONTAINER_CONFIGURATION_GROUP_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_BASE_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_FILTER_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_RDN_ATTR "=*))"
/* The data we ask the map cache to keep, for us, for each set. */
struct backend_set_data {
@@ -173,14 +173,20 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e,
/* Populate the returned structure. */
ret.common.state = state;
ret.common.group = slapi_dn_normalize(strdup(group));
- ret.common.set = slapi_dn_normalize(strdup(container));
+ ret.common.set = strlen(container) ?
+ slapi_dn_normalize(strdup(container)) :
+ strdup(container);
ret.common.bases = bases;
ret.common.entry_filter = entry_filter;
ret.common.ref_attrs = NULL;
ret.common.inref_attrs = NULL;
ret.common.ref_attr_list = NULL;
ret.common.inref_attr_list = NULL;
- dn = slapi_dn_plus_rdn(ret.common.group, ret.common.set);
+ if (strlen(ret.common.set) > 0) {
+ dn = slapi_dn_plus_rdn(ret.common.group, ret.common.set);
+ } else {
+ dn = strdup(ret.common.group);
+ }
ret.container_sdn = slapi_sdn_new_dn_passin(dn);
ret.rdn_format = rdn_format;
ret.attribute_format = attributes;
@@ -417,6 +423,7 @@ backend_set_config_entry_add_cb(Slapi_Entry *e, void *callback_data)
containers = backend_shr_get_vattr_strlist(state, e,
SCH_CONTAINER_CONFIGURATION_CONTAINER_ATTR);
for (i = 0; (groups != NULL) && (groups[i] != NULL); i++) {
+ /* If this is a multiple-container group, walk the list. */
for (j = 0;
(containers != NULL) && (containers[j] != NULL);
j++) {
@@ -424,6 +431,12 @@ backend_set_config_entry_add_cb(Slapi_Entry *e, void *callback_data)
groups[i],
containers[j]);
}
+ /* If there are no containers, add one with an empty name. */
+ if (containers == NULL) {
+ ret = backend_shr_set_config_entry_add(state, e,
+ groups[i],
+ "");
+ }
}
backend_shr_free_strlist(containers);
backend_shr_free_strlist(groups);
@@ -469,7 +482,7 @@ backend_get_set_config_entry_if_matching_cb(Slapi_Entry *e, void *callback_data)
cbdata = callback_data;
groups = backend_shr_get_vattr_strlist(cbdata->state, e, SCH_CONTAINER_CONFIGURATION_GROUP_ATTR);
sets = backend_shr_get_vattr_strlist(cbdata->state, e, SCH_CONTAINER_CONFIGURATION_CONTAINER_ATTR);
- if ((groups == NULL) || (sets == NULL)) {
+ if (groups == NULL) {
backend_shr_free_strlist(groups);
backend_shr_free_strlist(sets);
return TRUE;
@@ -490,6 +503,18 @@ backend_get_set_config_entry_if_matching_cb(Slapi_Entry *e, void *callback_data)
SCH_CONTAINER_CONFIGURATION_FILTER_ATTR);
}
}
+ if (sets == NULL) {
+ if (slapi_sdn_compare(cbdata->groupdn, cbdata->search_groupdn) == 0) {
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ cbdata->state->plugin_desc->spd_id,
+ "reading container configuration from \"%s\"\n",
+ slapi_entry_get_ndn(e));
+ cbdata->bases = backend_shr_get_vattr_strlist(cbdata->state, e,
+ SCH_CONTAINER_CONFIGURATION_BASE_ATTR);
+ cbdata->entry_filter = backend_shr_get_vattr_filter(cbdata->state, e,
+ SCH_CONTAINER_CONFIGURATION_FILTER_ATTR);
+ }
+ }
}
backend_shr_free_strlist(groups);
backend_shr_free_strlist(sets);
@@ -517,18 +542,25 @@ backend_get_set_config(struct plugin_state *state,
"\"%s\"/\"%s\"!\n", group, container);
return;
}
- setrdn = slapi_sdn_new_dn_byval(container);
- if (setrdn == NULL) {
- slapi_sdn_free(&groupdn);
- slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
- "out of memory reading configuration for "
- "\"%s\"/\"%s\"!\n", group, container);
- return;
+ if (strlen(container) > 0) {
+ setrdn = slapi_sdn_new_dn_byval(container);
+ if (setrdn == NULL) {
+ slapi_sdn_free(&groupdn);
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ state->plugin_desc->spd_id,
+ "out of memory reading configuration "
+ "for \"%s\"/\"%s\"!\n",
+ group, container);
+ return;
+ }
+ } else {
+ setrdn = NULL;
}
cbdata.groupdn = slapi_sdn_new();
if (cbdata.groupdn == NULL) {
- slapi_sdn_free(&setrdn);
+ if (setrdn != NULL) {
+ slapi_sdn_free(&setrdn);
+ }
slapi_sdn_free(&groupdn);
slapi_log_error(SLAPI_LOG_PLUGIN,
state->plugin_desc->spd_id,
@@ -539,7 +571,9 @@ backend_get_set_config(struct plugin_state *state,
cbdata.setrdn = slapi_sdn_new();
if (cbdata.setrdn == NULL) {
slapi_sdn_free(&cbdata.groupdn);
- slapi_sdn_free(&setrdn);
+ if (setrdn != NULL) {
+ slapi_sdn_free(&setrdn);
+ }
slapi_sdn_free(&groupdn);
slapi_log_error(SLAPI_LOG_PLUGIN,
state->plugin_desc->spd_id,
@@ -580,7 +614,9 @@ backend_get_set_config(struct plugin_state *state,
/* Clean up. */
slapi_sdn_free(&cbdata.setrdn);
slapi_sdn_free(&cbdata.groupdn);
- slapi_sdn_free(&setrdn);
+ if (setrdn != NULL) {
+ slapi_sdn_free(&setrdn);
+ }
slapi_sdn_free(&groupdn);
slapi_pblock_destroy(pb);
}
@@ -1161,8 +1197,8 @@ backend_check_empty(struct plugin_state *state,
&first_id,
&first_key_index)) {
slapi_log_error(SLAPI_LOG_FATAL, state->plugin_desc->spd_id,
- "warning: no entries set up under %s,%s\n",
- set, group);
+ "warning: no entries set up under %s%s%s\n",
+ set, set ? ", " : "",group);
}
}
diff --git a/src/back-shr.c b/src/back-shr.c
index 25bb14c..ef58d68 100644
--- a/src/back-shr.c
+++ b/src/back-shr.c
@@ -358,7 +358,7 @@ backend_shr_set_config_entry_add(struct plugin_state *state, Slapi_Entry *e,
}
slapi_log_error(SLAPI_LOG_PLUGIN,
state->plugin_desc->spd_id,
- "initializing %s in %s, flag=%s (2)\n",
+ "initializing \"%s\" in %s, flag=%s (2)\n",
set_data->set, set_data->group, flag ? "yes" : "no");
map_data_set_map(state, set_data->group, set_data->set, flag,
set_data, &backend_shr_set_config_free_config);