diff --git a/ipalib/plugins/baseldap.py b/ipalib/plugins/baseldap.py index 26b43b90d..e589a5321 100644 --- a/ipalib/plugins/baseldap.py +++ b/ipalib/plugins/baseldap.py @@ -1398,16 +1398,23 @@ class LDAPUpdate(LDAPQuery, crud.Update): entry_attrs[self.obj.primary_key.name] = options['rename'] if self.obj.rdn_is_primary_key and self.obj.primary_key.name in entry_attrs: - # RDN change - self._exc_wrapper(keys, options, ldap.update_entry_rdn)( - entry_attrs.dn, - RDN((self.obj.primary_key.name, - entry_attrs[self.obj.primary_key.name]))) - rdnkeys = keys[:-1] + (entry_attrs[self.obj.primary_key.name], ) - entry_attrs.dn = self.obj.get_dn(*rdnkeys) - del entry_attrs[self.obj.primary_key.name] - options['rdnupdate'] = True - rdnupdate = True + try: + # RDN change + self._exc_wrapper(keys, options, ldap.update_entry_rdn)( + entry_attrs.dn, + RDN((self.obj.primary_key.name, + entry_attrs[self.obj.primary_key.name]))) + + rdnkeys = keys[:-1] + (entry_attrs[self.obj.primary_key.name], ) + entry_attrs.dn = self.obj.get_dn(*rdnkeys) + options['rdnupdate'] = True + rdnupdate = True + except errors.EmptyModlist: + # Attempt to rename to the current name, ignore + pass + finally: + # Delete the primary_key from entry_attrs either way + del entry_attrs[self.obj.primary_key.name] # Exception callbacks will need to test for options['rdnupdate'] # to decide what to do. An EmptyModlist in this context doesn't diff --git a/ipatests/test_xmlrpc/test_user_plugin.py b/ipatests/test_xmlrpc/test_user_plugin.py index e4c06145e..dfca104eb 100644 --- a/ipatests/test_xmlrpc/test_user_plugin.py +++ b/ipatests/test_xmlrpc/test_user_plugin.py @@ -527,11 +527,28 @@ class test_user(Declarative): expected=errors.EmptyModlist(), ), + dict( + desc='Rename "%s" to same value, check that other modifications ' + 'are performed' % renameduser1, + command=('user_mod', [renameduser1], + dict(setattr=u'uid=%s' % renameduser1, + loginshell=u'/bin/bash')), + expected=dict( + result=get_user_result( + renameduser1, u'Finkle', u'User1', 'mod', + mail=[u'%s@%s' % (user1, api.env.domain)], + homedirectory=[u'/home/%s' % user1], + loginshell=[u'/bin/bash']), + summary=u'Modified user "%s"' % renameduser1, + value=renameduser1, + ), + ), + dict( desc='Rename back "%s"' % renameduser1, command=('user_mod', [renameduser1], - dict(setattr=u'uid=%s' % user1)), + dict(setattr=u'uid=%s' % user1, loginshell=u'/bin/sh')), expected=dict( result=get_user_result(user1, u'Finkle', u'User1', 'mod'), summary=u'Modified user "%s"' % renameduser1,