summaryrefslogtreecommitdiffstats
path: root/ipalib/plugins/baseldap.py
diff options
context:
space:
mode:
authorPetr Vobornik <pvoborni@redhat.com>2015-03-18 18:48:54 +0100
committerJan Cholasta <jcholast@redhat.com>2015-04-20 07:52:51 +0000
commite4930b3235e5d61d227a7e43d30a8feb7f35664d (patch)
tree66fb2449fd3cc86cfaf1221ce74a6a4a220929c3 /ipalib/plugins/baseldap.py
parentb48cfe05e9e6d9fa0d55c9c61f4ac23d8f5ee743 (diff)
downloadfreeipa-e4930b3235e5d61d227a7e43d30a8feb7f35664d.tar.gz
freeipa-e4930b3235e5d61d227a7e43d30a8feb7f35664d.tar.xz
freeipa-e4930b3235e5d61d227a7e43d30a8feb7f35664d.zip
speed up convert_attribute_members
A workaround to avoid usage of slow LDAPEntry._sync_attr #4946 https://fedorahosted.org/freeipa/ticket/4965 Reviewed-By: Jan Cholasta <jcholast@redhat.com>
Diffstat (limited to 'ipalib/plugins/baseldap.py')
-rw-r--r--ipalib/plugins/baseldap.py36
1 files changed, 28 insertions, 8 deletions
diff --git a/ipalib/plugins/baseldap.py b/ipalib/plugins/baseldap.py
index 865a8ccd8..ca4e54fd2 100644
--- a/ipalib/plugins/baseldap.py
+++ b/ipalib/plugins/baseldap.py
@@ -631,17 +631,37 @@ class LDAPObject(Object):
def convert_attribute_members(self, entry_attrs, *keys, **options):
if options.get('raw', False):
return
+
+ container_dns = {}
+ new_attrs = {}
+
for attr in self.attribute_members:
- for member in entry_attrs.setdefault(attr, []):
+ try:
+ value = entry_attrs.raw[attr]
+ except KeyError:
+ continue
+ del entry_attrs[attr]
+
+ for member in value:
+ memberdn = DN(member)
for ldap_obj_name in self.attribute_members[attr]:
ldap_obj = self.api.Object[ldap_obj_name]
- container_dn = DN(ldap_obj.container_dn, api.env.basedn)
- if member.endswith(container_dn):
- new_attr = '%s_%s' % (attr, ldap_obj.name)
- entry_attrs.setdefault(new_attr, []).append(
- ldap_obj.get_primary_key_from_dn(member)
- )
- del entry_attrs[attr]
+ try:
+ container_dn = container_dns[ldap_obj_name]
+ except KeyError:
+ container_dn = DN(ldap_obj.container_dn, api.env.basedn)
+ container_dns[ldap_obj_name] = container_dn
+
+ if memberdn.endswith(container_dn):
+ new_value = ldap_obj.get_primary_key_from_dn(memberdn)
+ new_attr_name = '%s_%s' % (attr, ldap_obj.name)
+ try:
+ new_attr = new_attrs[new_attr_name]
+ except KeyError:
+ new_attr = entry_attrs.setdefault(new_attr_name, [])
+ new_attrs[new_attr_name] = new_attr
+ new_attr.append(new_value)
+ break
def get_password_attributes(self, ldap, dn, entry_attrs):
"""