summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--daemons/ipa-slapi-plugins/ipa-uuid/ipa_uuid.c60
1 files changed, 50 insertions, 10 deletions
diff --git a/daemons/ipa-slapi-plugins/ipa-uuid/ipa_uuid.c b/daemons/ipa-slapi-plugins/ipa-uuid/ipa_uuid.c
index eb5b40d7..c0fde90f 100644
--- a/daemons/ipa-slapi-plugins/ipa-uuid/ipa_uuid.c
+++ b/daemons/ipa-slapi-plugins/ipa-uuid/ipa_uuid.c
@@ -987,17 +987,13 @@ static int ipauuid_pre_op(Slapi_PBlock *pb, int modtype)
bv = slapi_mod_get_first_value(smod);
/* If we have a value, see if it's the magic value. */
if (bv) {
- int len = strlen(cfgentry->generate);
- if (len == bv->bv_len) {
- if (!slapi_UTF8NCASECMP(bv->bv_val,
- cfgentry->generate,
- len)) {
- generate = true;
+ if (!slapi_UTF8CASECMP(bv->bv_val,
+ cfgentry->generate)) {
+ generate = true;
- /* also remove this mod, as we will add
- * it again later */
- slapi_mod_remove_value(next_mod);
- }
+ /* also remove this mod, as we will add
+ * it again later */
+ slapi_mod_remove_value(next_mod);
}
} else {
/* This is a replace with no new values, so we need
@@ -1054,8 +1050,52 @@ static int ipauuid_pre_op(Slapi_PBlock *pb, int modtype)
/* do the mod */
if (LDAP_CHANGETYPE_ADD == modtype) {
+ Slapi_DN *sdn;
+ Slapi_RDN *rdn;
+ char *attr;
+ char *nrdn;
+
/* add - set in entry */
slapi_entry_attr_set_charptr(e, cfgentry->attr, new_value);
+
+ /* check to see if we need to change the RDN too */
+ rdn = slapi_rdn_new();
+ if (!rdn) {
+ LOG_OOM();
+ ret = LDAP_OPERATIONS_ERROR;
+ goto done;
+ }
+ sdn = slapi_sdn_new_dn_byval(dn);
+ if (!sdn) {
+ LOG_OOM();
+ ret = LDAP_OPERATIONS_ERROR;
+ slapi_rdn_free(&rdn);
+ goto done;
+ }
+ slapi_rdn_set_sdn(rdn, sdn);
+ ret = slapi_rdn_contains_attr(rdn, cfgentry->attr, &attr);
+ slapi_rdn_done(rdn);
+ if (ret == 1) {
+ /* no need to recheck if it is valid, it will be handled
+ * later by checking the value in the entry */
+ nrdn = slapi_ch_smprintf("%s=%s",
+ cfgentry->attr, new_value);
+ if (!nrdn) {
+ LOG_OOM();
+ ret = LDAP_OPERATIONS_ERROR;
+ slapi_rdn_free(&rdn);
+ slapi_sdn_free(&sdn);
+ goto done;
+ }
+
+ slapi_rdn_set_dn(rdn, nrdn);
+ slapi_ch_free_string(&nrdn);
+ slapi_sdn_set_rdn(sdn, rdn);
+ slapi_entry_set_sdn(e, sdn);
+ }
+ slapi_rdn_free(&rdn);
+ slapi_sdn_free(&sdn);
+
} else {
/* mod - add to mods */
slapi_mods_add_string(smods, LDAP_MOD_REPLACE,