ldap/servers/plugins/automember/automember.c | 54 +++++++++++++++++++++++----
1 file changed, 47 insertions(+), 7 deletions(-)
New commits:
commit 87115fa0bd6bac4f3479142bca26b49af43aa6cd
Author: Mark Reynolds <mreynolds(a)redhat.com>
Date: Tue Nov 19 20:51:08 2013 -0500
Ticket 47529 - Automember plug-in should treat MODRDN operations as ADD operations
Description: After making the basic config checks, see if the entry applies to the
automember configurations, and update appropriately.
https://fedorahosted.org/389/ticket/47529
Reviewed by: richm(Thanks!)
diff --git a/ldap/servers/plugins/automember/automember.c
b/ldap/servers/plugins/automember/automember.c
index d63fbfe..e662e58 100644
--- a/ldap/servers/plugins/automember/automember.c
+++ b/ldap/servers/plugins/automember/automember.c
@@ -2663,20 +2663,24 @@ out:
static int
automember_modrdn_post_op(Slapi_PBlock *pb)
{
+ Slapi_Entry *post_e = NULL;
Slapi_DN *old_sdn = NULL;
Slapi_DN *new_sdn = NULL;
- Slapi_Entry *post_e = NULL;
+ struct configEntry *config = NULL;
+ PRCList *list = NULL;
slapi_log_error(SLAPI_LOG_TRACE, AUTOMEMBER_PLUGIN_SUBSYSTEM,
"--> automember_modrdn_post_op\n");
/* Just bail if we aren't ready to service requests yet. */
if (!g_plugin_started || !automember_oktodo(pb))
- return 0;
+ return SLAPI_PLUGIN_SUCCESS;
- /* Reload config if an existing config entry was renamed,
+ /*
+ * Reload config if an existing config entry was renamed,
* or if the new dn brings an entry into the scope of the
- * config entries. */
+ * config entries.
+ */
slapi_pblock_get(pb, SLAPI_ENTRY_POST_OP, &post_e);
if (post_e) {
new_sdn = slapi_entry_get_sdn(post_e);
@@ -2684,21 +2688,57 @@ automember_modrdn_post_op(Slapi_PBlock *pb)
slapi_log_error(SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM,
"automember_modrdn_post_op: Error "
"retrieving post-op entry\n");
- return 0;
+ return SLAPI_PLUGIN_SUCCESS;
}
if ((old_sdn = automember_get_sdn(pb))) {
- if (automember_dn_is_config(old_sdn) || automember_dn_is_config(new_sdn))
+ if (automember_dn_is_config(old_sdn) || automember_dn_is_config(new_sdn)){
automember_load_config();
+ }
} else {
slapi_log_error(SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM,
"automember_modrdn_post_op: Error "
"retrieving dn\n");
+ return SLAPI_PLUGIN_SUCCESS;
+ }
+
+ /* If replication, just bail. */
+ if (automember_isrepl(pb)) {
+ return SLAPI_PLUGIN_SUCCESS;
+ }
+
+ /*
+ * Check if a config entry applies to the entry(post modrdn)
+ */
+ automember_config_read_lock();
+
+ /* Bail out if the plug-in close function was just called. */
+ if (!g_plugin_started) {
+ automember_config_unlock();
+ return SLAPI_PLUGIN_SUCCESS;
}
+ if (!PR_CLIST_IS_EMPTY(g_automember_config)) {
+ list = PR_LIST_HEAD(g_automember_config);
+ while (list != g_automember_config) {
+ config = (struct configEntry *)list;
+
+ /* Does the entry meet scope and filter requirements? */
+ if (slapi_dn_issuffix(slapi_sdn_get_dn(new_sdn), config->scope)
&&
+ (slapi_filter_test_simple(post_e, config->filter) == 0)) {
+ /* Find out what membership changes are needed and make them. */
+ automember_update_membership(config, post_e, NULL);
+ }
+
+ list = PR_NEXT_LINK(list);
+ }
+ }
+
+ automember_config_unlock();
+
slapi_log_error(SLAPI_LOG_TRACE, AUTOMEMBER_PLUGIN_SUBSYSTEM,
"<-- automember_modrdn_post_op\n");
- return 0;
+ return SLAPI_PLUGIN_SUCCESS;
}