baseldap: Properly handle the case of renaming object to the same name

When renaming a object to the same name, errors.EmptyModList is raised.
This is not properly handled, and can cause other modifications in the
LDAPUpdate command to be ignored.

https://fedorahosted.org/freeipa/ticket/4548

Reviewed-By: Jan Cholasta <jcholast@redhat.com>
This commit is contained in:
Tomas Babej
2014-09-17 17:17:54 +02:00
committed by Martin Kosek
parent f8f3d58688
commit d83af7d38d
2 changed files with 35 additions and 11 deletions

View File

@@ -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

View File

@@ -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,