[389-commits] ldap/servers
Mark Reynolds
mreynolds at fedoraproject.org
Tue May 29 14:39:28 UTC 2012
ldap/servers/slapd/configdse.c | 38 +++++++++++++++++++++++++++++++++++---
1 file changed, 35 insertions(+), 3 deletions(-)
New commits:
commit 72b7e914195cf9c65aa1f635d786859d8b578aaf
Author: Mark Reynolds <mreynolds at redhat.com>
Date: Fri May 25 16:41:22 2012 -0400
Ticket #28 - MOD operations with chained delete/add get back error 53 on backend config
Bug Description: If you try and delete/add a config attribute, an error 53 is returned.
Fix Description: Allow a delete of a config attribute if we add it back in the same mod set.
https://fedorahosted.org/389/ticket/28
Reviewed by: Noriko (Thanks!)
diff --git a/ldap/servers/slapd/configdse.c b/ldap/servers/slapd/configdse.c
index 12175c4..51f9165 100644
--- a/ldap/servers/slapd/configdse.c
+++ b/ldap/servers/slapd/configdse.c
@@ -55,6 +55,7 @@
#include "pw.h"
static int check_all_maxdiskspace_and_mlogsize(Slapi_PBlock *pb, LDAPMod **mod, char *returntext);
+static int is_delete_a_replace(LDAPMod **mods, int mod_count);
static void get_log_max_size( LDAPMod *mod,
char *maxdiskspace_str,
char *mlogsize_str,
@@ -423,9 +424,17 @@ modify_config_dse(Slapi_PBlock *pb, Slapi_Entry* entryBefore, Slapi_Entry* e, in
config_attr);
}
} else {
- rc= LDAP_UNWILLING_TO_PERFORM;
- PR_snprintf(returntext, SLAPI_DSE_RETURNTEXT_SIZE,
- "Deleting attributes is not allowed");
+ /*
+ * Check if this delete is followed by an add of the same attribute, as some
+ * clients do a replace by deleting and adding the attribute.
+ */
+ if(is_delete_a_replace(mods, i)){
+ rc = config_set(config_attr, mods[i]->mod_bvalues, returntext, apply_mods);
+ } else {
+ rc= LDAP_UNWILLING_TO_PERFORM;
+ PR_snprintf(returntext, SLAPI_DSE_RETURNTEXT_SIZE,
+ "Deleting attributes is not allowed");
+ }
}
} else if (SLAPI_IS_MOD_REPLACE(mods[i]->mod_op)) {
if (( checked_all_maxdiskspace_and_mlogsize == 0 ) &&
@@ -600,3 +609,26 @@ get_log_max_size( LDAPMod *mod,
*mlogsize = atoi((char *) mod->mod_bvalues[0]->bv_val);
}
}
+
+/*
+ * Loops through all the mods, if we add the attribute back, it's a replace, but we need
+ * to keep looking through the mods in case it gets deleted again.
+ */
+static int
+is_delete_a_replace(LDAPMod **mods, int mod_count){
+ char *del_attr = mods[mod_count]->mod_type;
+ int rc = 0;
+ int i;
+
+ for(i = mod_count + 1; mods[i] != NULL; i++){
+ if(strcasecmp(mods[i]->mod_type, del_attr) == 0 && SLAPI_IS_MOD_ADD(mods[i]->mod_op)){
+ /* ok, we are adding this attribute back */
+ rc = 1;
+ } else if(strcasecmp(mods[i]->mod_type, del_attr) == 0 && SLAPI_IS_MOD_DELETE(mods[i]->mod_op)){
+ /* whoops we deleted it again */
+ rc = 0;
+ }
+ }
+
+ return rc;
+}
More information about the 389-commits
mailing list