diff options
| author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-05-12 18:40:46 -0400 |
|---|---|---|
| committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-05-12 18:40:46 -0400 |
| commit | 498c2a0b88bf34eae925cf0369ce7d7f449665fb (patch) | |
| tree | 4120c9741c11def6251ec8e2e1c34d92e9a31ad4 /src | |
| parent | 0675c90c244f480c267dae1ba6be50f7a7da56e6 (diff) | |
| download | slapi-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.c | 156 |
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; |
