diff options
author | Petr Vobornik <pvoborni@redhat.com> | 2015-03-18 18:48:54 +0100 |
---|---|---|
committer | Jan Cholasta <jcholast@redhat.com> | 2015-04-20 07:52:51 +0000 |
commit | e4930b3235e5d61d227a7e43d30a8feb7f35664d (patch) | |
tree | 66fb2449fd3cc86cfaf1221ce74a6a4a220929c3 /ipalib/plugins/baseldap.py | |
parent | b48cfe05e9e6d9fa0d55c9c61f4ac23d8f5ee743 (diff) | |
download | freeipa-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.py | 36 |
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): """ |