summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-05-12 18:40:46 -0400
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-05-12 18:40:46 -0400
commit498c2a0b88bf34eae925cf0369ce7d7f449665fb (patch)
tree4120c9741c11def6251ec8e2e1c34d92e9a31ad4 /src
parent0675c90c244f480c267dae1ba6be50f7a7da56e6 (diff)
downloadslapi-nis-498c2a0b88bf34eae925cf0369ce7d7f449665fb.tar.gz
slapi-nis-498c2a0b88bf34eae925cf0369ce7d7f449665fb.tar.xz
slapi-nis-498c2a0b88bf34eae925cf0369ce7d7f449665fb.zip
- handle modrdn for map entries
Diffstat (limited to 'src')
-rw-r--r--src/backend.c156
1 files changed, 144 insertions, 12 deletions
diff --git a/src/backend.c b/src/backend.c
index 7ac8a9e..9195750 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -486,7 +486,7 @@ backend_add_entry_cb(const char *domain, const char *map, void *backend_data,
return PR_TRUE;
}
-int
+static int
backend_add_cb(Slapi_PBlock *pb)
{
struct plugin_state *state;
@@ -594,7 +594,7 @@ backend_modify_entry_cb(const char *domain, const char *map, void *backend_data,
return PR_TRUE;
}
-int
+static int
backend_modify_cb(Slapi_PBlock *pb)
{
struct plugin_state *state;
@@ -621,24 +621,156 @@ backend_modify_cb(Slapi_PBlock *pb)
struct backend_modrdn_entry_cbdata {
Slapi_PBlock *pb;
- char *new_superior;
- char *new_rdn;
- char *dn;
+ Slapi_Entry *e_pre, *e_post;
+ char *dn_pre, *dn_post;
};
-int
+static PRBool
+backend_modrdn_entry_cb(const char *domain, const char *map, void *backend_data,
+ void *cbdata_ptr)
+{
+ Slapi_DN *base_sdn, *entry_sdn;
+ Slapi_Filter *filter;
+ char **visited_dn, *key_pre, *value_pre, *key_post, *value_post;
+ struct backend_map_data *map_data;
+ struct backend_modrdn_entry_cbdata *cbdata;
+ PRBool matched_pre, matched_post;
+
+ map_data = backend_data;
+ cbdata = cbdata_ptr;
+
+ matched_pre = backend_entry_matches_map(map_data, cbdata->e_pre);
+ matched_post = backend_entry_matches_map(map_data, cbdata->e_post);
+
+ /* Pull out the name of the attribute which holds the key. */
+ key_pre = slapi_entry_attr_get_charptr(cbdata->e_pre,
+ map_data->key_attr);
+ key_post = slapi_entry_attr_get_charptr(cbdata->e_post,
+ map_data->key_attr);
+ /* Pull out the value format string and generate the value. XXX
+ * */
+ value_pre = slapi_entry_attr_get_charptr(cbdata->e_pre,
+ map_data->value_fmt);
+ value_post = slapi_entry_attr_get_charptr(cbdata->e_post,
+ map_data->value_fmt);
+
+ /* Pull together the DN of this entry and the others we peeked
+ * at. */
+ visited_dn = NULL;
+
+ /* Now decide what to set, or unset, in this map. */
+ if (!matched_post || (key_post == NULL) || (value_post == NULL)) {
+ /* If it's no longer a match for the map (it might never have
+ * been), clear the entry. */
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ map_data->state->plugin_desc->spd_id,
+ "clearing domain/map/id "
+ "\"%s\"/\"%s\"/(\"%s\")\n",
+ map_data->domain, map_data->map,
+ cbdata->dn_pre);
+ map_data_unset_entry_id(map_data->state,
+ map_data->domain, map_data->map,
+ cbdata->dn_pre);
+ } else {
+ if (!matched_pre || (key_pre == NULL) || (value_pre == NULL)) {
+ if ((key_post != NULL) && (value_post != NULL)) {
+ /* If it's suddenly become a match, set it. */
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ map_data->state->plugin_desc->spd_id,
+ "setting domain/map/key/value "
+ "\"%s\"/\"%s\"/\"%s\"(\"%s\")="
+ "\"%s\"\n",
+ domain, map,
+ key_post, cbdata->dn_post,
+ value_post);
+ map_data_set_entry(map_data->state, domain, map,
+ cbdata->dn_post,
+ (const char **) visited_dn,
+ -1, key_post,
+ -1, value_post);
+ } else {
+ /* Not a match then, not a match now. */
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ map_data->state->plugin_desc->spd_id,
+ "clearing domain/map/id "
+ "\"%s\"/\"%s\"/(\"%s\")\n",
+ map_data->domain, map_data->map,
+ cbdata->dn_pre);
+ map_data_unset_entry_id(map_data->state,
+ map_data->domain,
+ map_data->map,
+ cbdata->dn_pre);
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ map_data->state->plugin_desc->spd_id,
+ "clearing domain/map/id "
+ "\"%s\"/\"%s\"/(\"%s\")\n",
+ map_data->domain, map_data->map,
+ cbdata->dn_post);
+ map_data_unset_entry_id(map_data->state,
+ map_data->domain,
+ map_data->map,
+ cbdata->dn_post);
+ }
+ } else {
+ /* Unset the old entry, set the new entry. */
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ map_data->state->plugin_desc->spd_id,
+ "unsetting domain/map/id "
+ "\"%s\"/\"%s\"/(\"%s\")\n",
+ map_data->domain, map_data->map,
+ cbdata->dn_pre);
+ map_data_unset_entry_id(map_data->state,
+ map_data->domain,
+ map_data->map,
+ cbdata->dn_pre);
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ map_data->state->plugin_desc->spd_id,
+ "setting domain/map/key/value "
+ "\"%s\"/\"%s\"/\"%s\"(\"%s\")="
+ "\"%s\"\n",
+ domain, map,
+ key_post, cbdata->dn_post,
+ value_post);
+ map_data_set_entry(map_data->state, domain, map,
+ cbdata->dn_post,
+ (const char **) visited_dn,
+ -1, key_post,
+ -1, value_post);
+ }
+ }
+
+ slapi_ch_free_string(&value_pre);
+ slapi_ch_free_string(&key_pre);
+ slapi_ch_free_string(&value_post);
+ slapi_ch_free_string(&key_post);
+
+ return PR_TRUE;
+}
+
+static int
backend_modrdn_cb(Slapi_PBlock *pb)
{
struct plugin_state *state;
struct backend_modrdn_entry_cbdata cbdata;
slapi_pblock_get(pb, SLAPI_PLUGIN_PRIVATE, &state);
- slapi_pblock_get(pb, SLAPI_MODRDN_TARGET, &cbdata.dn);
- slapi_pblock_get(pb, SLAPI_MODRDN_NEWRDN, &cbdata.new_rdn);
- slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR, &cbdata.new_superior);
+ slapi_pblock_get(pb, SLAPI_ENTRY_PRE_OP, &cbdata.e_pre);
+ slapi_pblock_get(pb, SLAPI_ENTRY_POST_OP, &cbdata.e_post);
+ cbdata.dn_pre = slapi_entry_get_ndn(cbdata.e_pre);
+ cbdata.dn_post = slapi_entry_get_ndn(cbdata.e_post);
cbdata.pb = pb;
slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id,
- "renamed \"%s\" to \"%s\" under \"%s\"\n",
- cbdata.dn, cbdata.new_rdn, cbdata.new_superior);
+ "renamed \"%s\" to \"%s\"\n",
+ cbdata.dn_pre, cbdata.dn_post);
+ /* Modify map entries which corresponded to this directory server
+ * entry. */
+ if (!map_data_foreach_map(state, NULL,
+ backend_modrdn_entry_cb, &cbdata)) {
+ slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id,
+ "error renaming map entries corresponding to "
+ "\"%s\"\n", cbdata.dn_post);
+ }
+ /* If it's a map configuration entry, reconfigure, clear, and
+ * repopulate the map. XXX */
return 0;
}
@@ -670,7 +802,7 @@ backend_delete_entry_cb(const char *domain, const char *map, void *backend_data,
}
/* Called by the server when a directory server entry is deleted. */
-int
+static int
backend_delete_cb(Slapi_PBlock *pb)
{
struct plugin_state *state;