mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Use encoded values from entry objects directly when generating modlists.
https://fedorahosted.org/freeipa/ticket/3521
This commit is contained in:
parent
78f0ca983b
commit
e60eda3b3d
@ -1737,32 +1737,12 @@ class LDAPClient(object):
|
|||||||
# updates better
|
# updates better
|
||||||
# for single value attribute: always MOD_REPLACE
|
# for single value attribute: always MOD_REPLACE
|
||||||
modlist = []
|
modlist = []
|
||||||
for (k, v) in entry_attrs.iteritems():
|
for (k, v) in entry_attrs.raw.iteritems():
|
||||||
if v is None and k in entry_attrs_old:
|
if not v and k in entry_attrs_old:
|
||||||
modlist.append((ldap.MOD_DELETE, k, None))
|
modlist.append((ldap.MOD_DELETE, k, None))
|
||||||
else:
|
else:
|
||||||
if not isinstance(v, (list, tuple)):
|
v = set(v)
|
||||||
v = [v]
|
old_v = set(entry_attrs_old.raw.get(k, []))
|
||||||
v = set(filter(lambda value: value is not None, v))
|
|
||||||
old_v = set(entry_attrs_old.get(k.lower(), []))
|
|
||||||
|
|
||||||
# FIXME: Convert all values to either unicode, DN or str
|
|
||||||
# before detecting value changes (see IPASimpleLDAPObject for
|
|
||||||
# supported types).
|
|
||||||
# This conversion will set a common ground for the comparison.
|
|
||||||
#
|
|
||||||
# This fix can be removed when ticket 2265 is fixed and our
|
|
||||||
# encoded entry_attrs' types will match get_entry result
|
|
||||||
try:
|
|
||||||
v = set(
|
|
||||||
unicode_from_utf8(self.conn.encode(value))
|
|
||||||
if not isinstance(value, (DN, str, unicode))
|
|
||||||
else value for value in v)
|
|
||||||
except Exception, e:
|
|
||||||
# Rather let the value slip in modlist than let ldap2 crash
|
|
||||||
self.log.error(
|
|
||||||
"Cannot convert attribute '%s' for modlist "
|
|
||||||
"for modlist comparison: %s", k, e)
|
|
||||||
|
|
||||||
adds = list(v.difference(old_v))
|
adds = list(v.difference(old_v))
|
||||||
rems = list(old_v.difference(v))
|
rems = list(old_v.difference(v))
|
||||||
@ -1958,15 +1938,8 @@ class IPAdmin(LDAPClient):
|
|||||||
keys.update(new_entry.keys())
|
keys.update(new_entry.keys())
|
||||||
|
|
||||||
for key in keys:
|
for key in keys:
|
||||||
new_values = new_entry.get(key, [])
|
new_values = new_entry.raw.get(key, [])
|
||||||
if not(isinstance(new_values,list) or isinstance(new_values,tuple)):
|
old_values = old_entry.raw.get(key, [])
|
||||||
new_values = [new_values]
|
|
||||||
new_values = filter(lambda value:value!=None, new_values)
|
|
||||||
|
|
||||||
old_values = old_entry.get(key, [])
|
|
||||||
if not(isinstance(old_values,list) or isinstance(old_values,tuple)):
|
|
||||||
old_values = [old_values]
|
|
||||||
old_values = filter(lambda value:value!=None, old_values)
|
|
||||||
|
|
||||||
# We used to convert to sets and use difference to calculate
|
# We used to convert to sets and use difference to calculate
|
||||||
# the changes but this did not preserve order which is important
|
# the changes but this did not preserve order which is important
|
||||||
|
Loading…
Reference in New Issue
Block a user