mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
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:
committed by
Martin Kosek
parent
f8f3d58688
commit
d83af7d38d
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user